• 締切済み

沢山の変数を扱う時、うまく出来ません・・。

変数が沢山ある時、エラーが起こったかどうかは どうやって判断したらいいんでしょうか。 今50個位変数名があるとします。 今は端おって5つにします。 int a,b,d; char c,e a = (int *) calloc(500,sizeof(int)); b = (int *) calloc(200,sizeof(int)); c = (char *)calloc(700,sizeof(char)); d = (int *) calloc(400,sizeof(int)); e = (char *)calloc(100,sizeof(char)); if(a==NULL || b==NULL || c==NULL || d==NULL || e==NULL)   printf("エラー発生\n"); こうやって50個もif文の中にいれたら大変ですよね。 変数名も長いですし。うまく1つでもエラーが起きたら全体がエラーになるように出来ませんかね? 自分としてはこういう風に考えたんですけど int sum=1; a = (int *) calloc(500,sizeof(int)); sum*=a; b = (int *) calloc(200,sizeof(int)); sum*=b; c = (char *)calloc(700,sizeof(char)); sum*=c; d = (int *) calloc(400,sizeof(int)); sum*=d; e = (char *)calloc(100,sizeof(char)); sum*=e; if(sum==0)   printf("エラー発生\n"); コレくらいしかないですかね?

みんなの回答

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.5

おっとすまん。 define作ってる意味がねーなw fpo1関係のコードとout_define.txtは忘れてくれw

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.4

以下のプログラムで、その辺のコードの自動生成が出来る。 エラー処理の部分は適当に変える必要があると思うが。 tVarData[]の中身を増やしたり変えたりすれば、変数名/変数型/サイズを変えられる。 #include <stdio.h> typedef struct _VarData_t { char szName[80]; char szType[80]; int nSize; } VarData_t; const VarData_t tVarData[] = { {"a","int",500}, {"b","int",200}, {"c","char",700}, {"d","int",400}, {"e","char",100}, {"END","END",-1} }; int main(void) { int i = 0,j; FILE *fpo1; FILE *fpo2; fpo1 = fopen("out_define.txt","w"); fpo2 = fopen("out_code.txt","w"); while(1){ if(tVarData[i].nSize < 0) { break; } fprintf(fpo1, "#define SIZE_%s (%d)\n", tVarData[i].szName, tVarData[i].nSize); fprintf(fpo2, "%s = (%s *)calloc(%d, sizeof(%s));\n", tVarData[i].szName, tVarData[i].szType, tVarData[i].nSize, tVarData[i].szType); fprintf(fpo2, "if(%s == NULL) {\n", tVarData[i].szName); for(j=0;j<i;j++) { fprintf(fpo2, "\tfree(%s);\n", tVarData[j].szName); } fprintf(fpo2, "\tprintf(\"変数 %s でエラーが発生しました。\");\n\treturn 0;\n}\n", tVarData[i].szName); i++; } fclose(fpo1); fclose(fpo2); return 0; } 生成されたコードの一部 ---out_define.txt--- #define SIZE_c (700) #define SIZE_d (400) --- ---out_code.txt--- c = (char *)calloc(700, sizeof(char)); if(c == NULL) { free(a); free(b); printf("変数 c でエラーが発生しました。"); return 0; } d = (int *)calloc(400, sizeof(int)); if(d == NULL) { free(a); free(b); free(c); printf("変数 d でエラーが発生しました。"); return 0; } ---

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

もしエラー処理をまともにやりたいのであれば、 int *a = NULL; int *b = NULL; char *c = NULL; ... if ((a = calloc(500, sizeof(int))) == NULL) goto error; if ((b = calloc(200, sizeof(int))) == NULL) goto error; if ((c = calloc(700, sizeof(chat))) == NULL) goto error; ... error: free(a); free(b); free(c); ... printf("エラー発生\n"); のように、最低限割付け済みのものを解放してやる必要があります。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.2

一個づつ地道にやるほうがバグは少ないと思いますが、 コードを減らしたい時は以下のような方法もありますね。 全部callocしてからではなく、エラーになった時点でエラー処理 するべきでしょうね。(#1さんと同じ) #include<stdlib.h> #include<stdio.h> int *a,*b,*d; char *c,*e; typedef struct { void **valhdl; /* 取得するポインタ */ size_t counts; /* 取得個数 */ int len; /* 一個の長さ */ } T_callc; const T_callc t_callc[] = { {(void**)&a,500,sizeof(int)}, {(void**)&b,200,sizeof(int)}, {(void**)&c,700,sizeof(char)}, {(void**)&d,400,sizeof(int)}, {(void**)&e,100,sizeof(char)}, {0 ,0 ,0} }; int main(void) { const T_callc *p; p = t_callc; while(p->valhdl) { if ((*(p->valhdl) = calloc(p->counts,p->len)) == NULL) { printf("エラー発生\n"); break; } p++; } return 0; }

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

立て続けに50個も動的に割付けるのがどんな状況かよくわかりませんが... > if(a==NULL || b==NULL || c==NULL || d==NULL || e==NULL) >   printf("エラー発生\n"); エラーを検出した際、適切なエラー処理を行って、元の状態に復帰させる必要などはあるのでしょうか? そうではなく、単に異常終了させればよいのであれば、 void *calloc_and_check(size_t n, size_t size) {  void *p = calloc(n, size);  if (p == 0) abort();  return p; } といった関数を作って、 void *a = calloc_and_check(500, sizeof(int)); void *b = calloc_and_check(200, sizeof(int)); ... のようにすればよいと思います。 普通は、50個も立て続けに動的割付けしなくても済む方法を探す方がよいでしょう。

関連するQ&A