• ベストアンサー

free compiler

Borland C++ Compiler 5.5 無償版による実行ファイルは はワーキングエリアが1MBを越えると実行できません これはコンパイラが16bit版の実行ファイルしかできないからでしょうか? やはりbcc32でコンパイルしたものは32bit版ではなく16bit版なのでしょうか? 32bit版の実行ファイルをこのコンパイラで作ることはできますか? ちなみに以下のプログラムで性能チェックしました 下記のものは動きましたがMAXが65536の場合は駄目でした このとき1MB+αになります #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <complex.h> #define MAX 60000//65536 int main(void) { complex<double> j(0.0,1.0),z; complex<double> q[3],p[MAX]; double a,b,x,y; p[MAX-1]=j; q[0]=1.0-j;q[1]=j;q[2]=1.0+j; printf("please input double number a\n"); scanf("%lf",&a); printf("please input double number b\n"); scanf("%lf",&b); z=a+j*b; printf("abs(%lf+j*%lf)=%lf\n",a,b,abs(z)); printf("size of int is %d.\n",sizeof(int)); printf("size of float is %d.\n",sizeof(float)); printf("size of long is %d.\n",sizeof(long)); printf("size of float is %d.\n",sizeof(float)); printf("size of double is %d.\n",sizeof(double)); cout<<q[0]<<q[1]<<q[2]<<"\n"<<p[MAX-1]<<"\n"; //c++ command getch(); return 0; } よろしくお願いします

  • nubou
  • お礼率62% (293/470)

質問者が選んだベストアンサー

  • ベストアンサー
noname#11476
noname#11476
回答No.3

>mallocとかcallocは16bit版専用関数ではないですか? >私の古いボーランドコンパイラではそのような注意書きが有るのですが 昔はポインタにも 16bitのポインタ、 large ポインタ(32bit)、hugeポインタ(32bit)などと区別がありましたね。 しかし、最近のコンパイラではそういう区別はなくなりましたね。 つまり、普通にmallocでもOKです。ANSI-Cの規約に準拠しているコンパイラ(普通は準拠している)であれば。 >すごいものを無償配布するとはボーランドは太っ腹ですね でもすでにフリーでgccというもっとすごいコンパイラがありますので(こちらはアセンブラもあるし、マルチプラットフォーム)、有料にしても売れるとはおもえませんね。 むしろ販促活動としてできるだけ多くの人に使ってほしいのだと思います。 >統合開発環境も無用配布してほしいものです これを売りたいがための販促活動ですから無理でしょうねぇ。 (なんだかんだといってもマイクロソフトは強いですから) では。

その他の回答 (2)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

単純にスタックサイズを超えるような自動変数を宣言しているように感じます。 コンパイルオプションでスタックサイズを変更できるのではないでしょうか?

nubou
質問者

お礼

new関数で動きました どうもありがとうございました

noname#11476
noname#11476
回答No.1

普通どのコンパイラでもWindows用だとローカル変数領域には、あまり大きな配列は取れないと思いますよ。 ちなみにこのbcc32コンパイラは市販している製品版とそれほど違いはないようです。 (無償版で発見されたバグと同じものが製品版でもあったりするので) 製品版との違いは統合環境とライブラリが付属していないだけでしょう。基本的には。 普通大きな配列を確保するときには、mallocかnewを使います。 これだと馬鹿でかい配列もOKです。

nubou
質問者

補足

newで動きました mallocとかcallocは16bit版専用関数ではないですか? 私の古いボーランドコンパイラではそのような注意書きが有るのですが できたプログラムは32bitコンソール版みたいですね すごいものを無償配布するとはボーランドは太っ腹ですね 統合開発環境も無用配布してほしいものです どうもありがとうございました ちなみに動いたプログラムは以下の通りです #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <complex.h> #define MAX 1048576 int main(void) { complex<double> j(0.0,1.0),z; complex<double> q[3]; double a,b,x,y; complex<double> *p=new complex<double>[MAX];//c++command p[MAX-1]=j; q[0]=1.0-j;q[1]=j;q[2]=1.0+j; printf("please input double number a\n"); scanf("%lf",&a); printf("please input double number b\n"); scanf("%lf",&b); z=a+j*b; printf("abs(%lf+j*%lf)=%lf\n",a,b,abs(z)); printf("size of int is %d.\n",sizeof(int)); printf("size of float is %d.\n",sizeof(float)); printf("size of long is %d.\n",sizeof(long)); printf("size of float is %d.\n",sizeof(float)); printf("size of double is %d.\n",sizeof(double)); cout<<q[0]<<q[1]<<q[2]<<"\n"<<p[MAX-1]<<"\n";//c++ command getch(); delete []p;//c++ command return 0; }

関連するQ&A

  • scanfに文字が入力されたときにエラー表示させる

    こんばんは.C言語勉強中です. 以下にsizeofを用いて各データタイプのサイズを表示させるプログラムを作りました.プログラム全文は下に貼付けました.これは,1-7までのいずれかの数字を入力すると,それに対応したサイズが表示されます.1-7以外の数字が入力されると,Type 1 - 7, please,と表示され,再び数字を入力出来ます.このプログラムは数字を入力している間はうまく機能していると思います. ただ,文字を入力すると無限ループに陥ってしまいます.僕は以下の scanf("%d",&typed); で10進数で読み込んで, if(typed<1 || typed >7) とすれば,文字も含めて全ての入力に対して排除できるかと思ったのですが,これではダメなようです. こういう場合,どうやって文字の入力に対するエラーを表示させるのが一般的なのでしょうか? 素人質問ですみません.よろしくお願いします. #include <stdio.h> #include <stdint.h> #include <Windows.h> int8_t main() { int typed; while(1) { while(1) { printf("Type the data type you wanna know the size of\n"); printf("char 1, short 2, int 3, long 4, long long 5, float 6, double 7: "); scanf("%d",&typed); printf("What you typed is %d\n",typed); if(typed<1 || typed >7) { printf("Type 1 - 7, please\n"); Sleep(1000); continue; } else { break; } } printf("Data size is "); switch(typed){ case 1: printf("%d\n",sizeof(char)); break; case 2: printf("%d\n",sizeof(short)); break; case 3: printf("%d\n",sizeof(int)); break; case 4: printf("%d\n",sizeof(long int)); break; case 5: printf("%d\n",sizeof(long long)); break; case 6: printf("%d\n",sizeof(float)); break; case 7: printf("%d\n",sizeof(double)); break; default: printf("Unexpected Value!\n"); break; } Sleep(2000); } return(0); }

  • 型変換がうまく出来ない

     今晩は、Cの初心者です、宜しくお願いします。  下のようなコードを書きましたが、正常に表示されません。  一体何処が悪いのでしょう。 =========================================================== #include <stdio.h> #include <string.h> #include <ctype.h> int main(void) { char s2[20] = "0.789"; double ddt = atof(s2) ; printf("ddt = %lf\n\n" , ddt); printf("atof(s2) = %lf\n\n" , atof(s2)); printf("(float)idt + atof(s2)) = %lf\n\n" , ((float)idt + atof(s2))); return 0; }

  • 構造体の使い方

    構造体の基本的な使い方を練習しようと思ったのですが、 なかなかスムーズにいきません。 p.d=10; の部分がおかしいようなのですが、色々試してもコンパイルできませんでした。 正しい使い方を教えていただけないでしょうか ソース ↓ #include<stdio.h> struct type{ int a; float b;  double c; }var,*p; main(){ c=9.87;      p=&var; p.d=10; p->b=1.2; printf("int:%d\n",*p); printf("float:%.1f\n",&p); printf("double:%.3lf\n",c); return 0; }

  • 動きが部分的におかしくなる要因

    以前はアドバイスありがとうございました。 配列オーバーフロー? http://okwave.jp/qa4406037.html 以前のプログラムで以下を暗号化→解読化すると元通りにはならず、 6,8,64,66,67,68行目だけがおかしくなります。 明らかにその行に無い文字が交じってきたりしますが、 初期化はしておりますし、他の行は大丈夫なのに 何故この行だけがおかしくなるのか(暗号化の時点で既におかしいです) わかりません。 同じ作り込みをしていて、一部分だけ動きがおかしくなるのは どういった理由があるのでしょうか? 特に周期性は見られません。 ↓下の行から1行目 #define MAX_MOJI 250 /* ファイルNAME */ #include <stdio.h> #include <stdlib.h> typedef struct { char ch; double d1; float fl; short sh; int in; long ln; } testcell; char c1; char ch2[2]; char ch3[3]; double d; testcell t; char c2; char c3; long ln; float fl; char *p; static int st; void main( void ); void func( int ); void main( void ){ char* alc = malloc( 1000 ); func( 100 ); printf( "\nメイン\n" ); printf( "allocated addr : %p\n", alc ); printf( "func() addr : %p\n", func ); printf( "main() addr : %p\n", main ); printf( "addr of printf : %p\n", printf ); printf( "char c1 %2d : %p\n", sizeof(c1), &c1 ); printf( "char ch2[2] %2d : %p\n", sizeof(ch2),ch2 ); printf( "char ch3[3] %2d : %p\n", sizeof(ch3),ch3 ); printf( "double d %2d : %p\n", sizeof(d), &d ); printf( "testcell t %2d : %p\n", sizeof(t), &t ); printf( "char c2 %2d : %p\n", sizeof(c2), &c2 ); printf( "char c3 %2d : %p\n", sizeof(c2), &c3 ); printf( "long ln %2d : %p\n", sizeof(ln), &ln ); printf( "float fl %2d : %p\n", sizeof(fl), &fl ); printf( "char *p %2d : %p\n", sizeof(p), &p ); printf( "static int st %2d : %p\n", sizeof(st), &st ); printf( "\nコウゾウタイ\n" ); printf( "char ch %2d : %p\n", sizeof(t.ch), &t.ch ); printf( "double d1 %2d : %p\n", sizeof(t.d1), &t.d1 ); printf( "float fl %2d : %p\n", sizeof(t.fl), &t.fl ); printf( "short sh %2d : %p\n", sizeof(t.sh), &t.sh ); printf( "int in %2d : %p\n", sizeof(t.in), &t.in ); printf( "long ln %2d : %p\n", sizeof(t.ln), &t.ln ); } void func( int p ){ static int s; int loc; printf( "\nファンクション\n" ); printf( "parameter addr : %p\n", &p ); printf( "func static addr : %p\n", &s ); printf( "func local addr : %p\n", &loc ); }

  • C言語、エラーメッセージが紐解けません。

    いつも大変お世話になり誠にありがとうございます。 標記の件。 エラーメッセージが紐解けません。 どうかどなたかアドバイスください。 下記にコードとコンパイルエラーを書きます。        記 コード #include <stdio.h> typedef struct Car{ int num; double gas; }Car; int main(void) { printf("int型のサイズは%dバイトです。\n", sizeof(int)); printf("double型のサイズは%dバイトです。\n", sizeof(double)); printf("構造体struct Car型のサイズは%dバイトです。\n",sizeof(Car)); printf("構造体struct Car型へのポインタのサイズは%dバイトです。\n",sizeof(Car *)); return 0; } コンパイラーエラー C:\MinGW>gcc text20.c -o text20 text20.c: In function 'main': text20.c:12:11: warning: unknown escape sequence: '\221' printf("構造体struct Car型のサイズは%dバイトです。\n",sizeof(Car)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ text20.c:13:11: warning: unknown escape sequence: '\221' printf("構造体struct Car型へのポインタのサイズは%dバイトです。\n",sizeof(Car *)); 以上です。 ご多忙中恐れ入ります。 ご回答の程宜しくお願い申し上げます。

  • ガウスのの単純消去法のプログラムです。

    ガウスのの単純消去法のプログラムです。 前進消去の第k段階が終わった段階でaij,biが表示されるようにしたいんですがどうすればいいでしょうか↓ よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<math.h> #define ERROR -1 #define EPS 1.0e-15 int gausssimp(double *, double *, double *, int); int main(void) { double *a,*b,*x,val; char s[32]; int i,j,n,result; printf("Input size n="); gets(s); sscanf(s,"%d",&n); if((a=(double *)calloc(n*n,sizeof(double)) ) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } if((b=(double *)calloc(n,sizeof(double))) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } if((x=(double *)calloc(n,sizeof(double))) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } /* A,b の成分を入力 */ printf("----- A -----\n"); for(i=0; i<n; i++){ for(j=0; j<n; j++){ printf("a(%2d,%2d)=",i+1,j+1); gets(s); sscanf(s,"%lf",&val); a[n*i+j]=val; } } printf("\n----- b -----\n"); for(i=0; i<n; i++){ printf("b(%2d)=",i+1); gets(s); sscanf(s,"%lf",&val); b[i]=val; } /* Gaussの単純消去法による求解 */ result = gausssimp(x,a,b,n); /* 解の表示 */ if(result == ERROR){ printf("ERROR occurs. pivot 0\n"); } else { printf("\n----- solution -----\n"); for(i=0; i<n; i++){ printf("x(%2d)=%.8e\n",i+1, x[i]); } } free(a); free(b); free(x); return 0; } int gausssimp(double *x, double *a, double *b, int n) { int i,j,k; double tmp,p,sum; /* step 1: 前進消去 */ /**** 追加 ****/ /* 前進消去の各段階を終えるごとに,式がどのように変化しているかわかるように表示する */ /**************/ for(k=0; k<n-1;k++){ if(a[n*k+k] == 0.0) { /* ピボットの値が0.割り算でエラーが起きる.*/ return ERROR; } else { /* k+1番目以降の式から x[k] の項を消去 */ for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; } b[i]=b[i]-p*b[k]; printf("a[%d %d]=%d b[%d]=%d",i,j,a[n*i+j]-p*a[n*k+j],i,b[i]-p*a[n*k+j]); ↑これではできませんでした。。。 } /**********************************/ } printf("k=%d\n",k); } /* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS) return(ERROR); sum=0.0; for(j=k+1; j<n; j++) sum+=a[n*k+j]*x[j]; x[k]=(b[k] - sum)/a[k*n+k]; } return 0; }

  • 文字列をfloatで読み込む(atoi,sscanf)。しかし、値がおかしい。

    お世話になっています。 C言語の質問です。 文字列をfloatで読み込もうとしているのですが、出力結果がおかしくて困っています。 文字列をatofで変換した場合、doubleでは上手く表示できるのですが、floatでは少数が上手く表示できません。 また、sscanfでも試したのですが、上手く表示できませんでした。 どうしても、doubleを使わずにfloatであらわしたいと考えています。 どうかこのプログラムの問題点のご指摘お願いします。 実行結果 53.196600 53.196602 53.196602 ソース #include<stdio.h> #include<stdlib.h> #include<string.h> main() { char str[100]="53.1966"; double b; float c,d; b = atof(str); printf("%f\n",b); c = (float)atof(str); printf("%f\n",c); sscanf(str,"%f",&d); printf("%f\n",d); } 開発環境 windowsXP cygwin

  • 助けてください! c言語のプログラムです。

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define KAMOKU_SUU 5 #define AVE_INDEX KAMOKU_SUU typedef struct { char name[32]; int scor[KAMOKU_SUU]; int mean; } STUDENT; int round(double d) { if (d < 0) return (int)(d-0.5); else return (int)(d+0.5); } #define ARRAY_OF(a) (sizeof (a) / sizeof (a[0])) int main(int argc,char* argv[]) { int i, j,k, n; int nStudets; double avrg[KAMOKU_SUU + 1]; double stdv[KAMOKU_SUU + 1]; STUDENT *mem; char buff[80]; if (argc < 2) { printf("!パラメータ不足\n"); return 1; } nStudets = atoi(argv[1]); mem = (STUDENT*)malloc(sizeof (STUDENT) * nStudets); if (mem == NULL) { printf("!アロケーション\n"); return 2; } memset(avrg, 0, sizeof (avrg)); memset(stdv, 0, sizeof (stdv)); printf("生徒 %d 名分の成績を入力してください:\n", nStudets); for (k = 0; k < nStudets; k++) { printf("%d 人目の点数と名前 > ", k + 1); gets(buff); strcpy(mem[k].name, strtok(buff," ")); mem[k].mean = 0; for (j = 0; j < KAMOKU_SUU; j++) { int i = mem[k].scor[j] = atoi(strtok(NULL," \n")); mem[k].mean += i; avrg[j] += i; stdv[j] += i * i; } mem[k].mean = round(mem[k].mean * 1.0 / KAMOKU_SUU); } for(j = 0; j < KAMOKU_SUU; j++) { avrg[AVE_INDEX] += avrg[j]; stdv[AVE_INDEX] += stdv[j]; avrg[j] = avrg[j] / nStudets; stdv[j] = sqrt(stdv[j] / nStudets - avrg[j] * avrg[j]); } n = nStudets * KAMOKU_SUU; avrg[AVE_INDEX] = avrg[AVE_INDEX]/ n; stdv[AVE_INDEX] = sqrt(stdv[AVE_INDEX] / n) - (avrg[AVE_INDEX] * avrg[AVE_INDEX]); printf("\n成績表\n"); printf("# NAME"); for (i = 1; i <= KAMOKU_SUU; ++i) printf(" #%d ", i); printf("MEAN\n"); for (k = 0; k< nStudets; k++) { printf("%d %10s",k+1,mem[k].name); for (j = 0; j < KAMOKU_SUU; j++) { printf(" %3d",mem[k].scor[j]); } printf(" %3d\n",mem[AVE_INDEX].mean); } printf("------------------------------------\n"); printf(" %10s","average"); for(j = 0; j < ARRAY_OF (avrg);j++) { printf(" %3.0f",avrg[j]); } printf("\n"); printf(" %10s","st.dev."); for ( j = 0; j < ARRAY_OF (stdv); j++) { printf(" %3.0f",stdv[j]); } printf("\n"); printf("正常終了\n"); return 0; }  実行してもできません。原因が全く分かりません。 お願いします。 修正してくださるとありがたいです。

  • 構造体へのポインタについて

    初心者です。 C入門書の著者のサポートページには正誤表とダウンロードしかないためこちらで質問させていただきます。 下記のコードの下から二行目の構造体へのポインタ (Car *) について、中学生に説明するように基本的な考え方、目的、書式、参考URLなどを教えて下さい。 ポインタについては、該当の章を読み直し基本事項については理解しておりますが、突然あるページから(Void *)や(Char *)など括弧で閉じるものが説明なしに出てきてちょっと混乱してます。(汗 どうぞ宜しくお願い致します。 #include<stdio.h> /* 構造体型struct Carの宣言 */ typedef struct Car{ int num; double gas; }Car; int main(void) { printf("int型のサイズは%dバイトです。¥n", sizeof(int)); printf("double型サイズは%dバイトです。¥n", sizeof(double)); printf("構造体structCar型のサイズは%dバイトです。¥n", sizeof(Car)); printf("構造体struct Car型へのポインタのサイズは%dバイトです。¥n", sizeof(Car *)); return 0; }

  • CからVB

    以下のプログラムはC言語で作成されています。 これをVBで作成したいです。 教えてください。 #include <stdio.h> #include <stdlib.h> double *alloc(int r,int n,int m); void input(double *p,int r,int n,int m); void sumup(double *p,int r,int n,int m); int main(void){ int r, n, m; double *p; // 行列サイズ入力 printf("input r n m "); scanf("%d %d %d",&r,&n,&m); // 行列領域取得 p = alloc(r,n,m); // 行列要素入力 input(p,r,n,m); // 行列の和 sumup(p,r,n,m); //終了,行列領域解放 free(p); return 0; } double *alloc(int r,int n,int m){ double *p; printf("MATRIX[r=%d][n=%d][m=%d]\n\n",r,n,m); p = (double*)malloc(sizeof(double)*r*n*m); if( p == NULL){ printf("error! malloc failed.\n"); exit(-1); } return p; } void input(double *p,int r, int n,int m) { int i,j,k; for(i = 0; i < r; i++){ for(j = 0;j < n; j++){ for(k = 0; k < m; k++){ printf("input MATRIX[%d][%d][%d]= ",i,j,k); scanf("%lf",&p[i*(n*m)+j*m+k]); } } } printf("\n"); } // 行列の和 void sumup(double *p,int r,int n,int m){ int i, j, k; // 0.0, not 0!!! double sum = 0.0; printf("sum of %d matrices:\n",r); for(j = 0; j< n; j++){ for(k = 0;k < m; k++){ sum=0; for(i = 0;i < r;i++){ sum += p[i*(n*m)+j*m+k]; } printf("\n%2f",sum); } } printf("\n"); }