2016-05-31 9 views
0

これは私の問題です。学校向けにこのプログラムを作成する必要があり、最後の1時間をデバッグやグーグルで過ごしましたが、答えが見つかりませんでした。構造体の配列を参照して呼び出す

私は私のmainにおける構造体の配列を持っていると私は、この関数では、私は、ファイルから読み込む文字列が分割されているので(参照による呼び出しによって)私の機能seteverythingupにその配列を与えたい、と私は書きたいですそれは構造体に入れますが、struct配列のstrcpyの場合は、常にSIGSEVというエラーが発生します。

これが私のメインです:

int main(int argc, char *argv[]) 
{ 
FILE* datei; 
int size = 10; 
int used = 0; 
char line[1000]; 
struct raeume *arr = (raeume *) malloc(size * sizeof(raeume*)); 
if(arr == NULL){ 
    return 0; 
} 
if(argc < 2){ 
    return 0; 
} 
datei = fopen(argv[1], "rt"); 
if(datei == NULL){ 
    return 0; 
} 
fgets(line,sizeof(line),datei); 
while(fgets(line,sizeof(line),datei)){ 
     int l = strlen(line); 
     if(line[l-1] == '\n'){ 
      line[l-1] = '\0'; 
     } 
      seteverythingup(&line,arr,size,&used); 

} 
ausgabeunsortiert(arr,size); 
fclose(datei); 
return 0; 
} 

と、これは私の関数である:

void seteverythingup(char line[],struct raeume *arr[], int size,int used) 
{ 
    char *token,raumnummer[5],klasse[6]; 
    int tische = 0; 
    const char c[2] = ";"; 
    int i=0; 
    token = strtok(line, c); 
    strcpy(raumnummer,token); 
    while(token != NULL) 
    { 
     token = strtok(NULL, c); 
     if(i==0){ 
      strcpy(klasse,token); 
     }else if(i==1){ 
      sscanf(token,"%d",&tische); 
     } 
     i++; 
    } 
    managesize(&arr[size],&size,used); 
    strcpy(arr[used]->number,raumnummer); 
    strcpy(arr[used]->klasse,klasse); 
    arr[used]->tische = tische; 
    used++; 
} 
+0

技術的には、Cは参照渡し呼び出しを持ちません。値渡し呼び出しのみです。変数へのポインタを使って参照によって*呼び出すことができます。 –

+1

あなたの問題については、コードでコンパイラがエラーや警告を出さない場合は、さらに警告を有効にする必要があります。 –

+0

ポインタの配列を割り当てましたが、ポインターが指すもののスペースは割り当てられませんでした。 – stark

答えて

0

編集:より多くの混乱がありますので、私は一部をうまくいく短いプログラムを書きましたあなたは問題を抱えています。

#include <cstdlib> 

struct raeume { 
    int foo; 
    int bar; 
}; 

void seteverythingup(struct raeume *arr, size_t len) { 
    for (size_t i = 0; i < len; ++i) { 
     arr[i].foo = 42; 
     arr[i].bar = 53; 
    } 
} 

int main() { 
    const size_t size = 10; 
    struct raeume *arr = (struct raeume*) malloc(size * sizeof(struct raeume)); 

    seteverythingup(arr, size); 

    return 0; 
} 

基本的に、機能の署名は多少奇妙です。 Mallocはメモリの場所へのポインタを返します。だからあなたは本当に配列へのポインタが必要ないです。 mallocから得たポインタを関数に渡すだけで、関数はその領域を操作できます。

オリジナル回答:

malloc(size * sizeof(raeume*)); 

これはおそらく、あなたの苦労を与えるコードの一部です。 sizeofは、型のサイズを返します。 raeume構造体に必要なポインタのsizeofを求める。おそらくあなたがしたいのは、構造体自体のサイズを求めて、そのためのサイズ倍のスペースを割り当てることです。したがって、mallocへの正しい呼び出しは次のようになります。

malloc(size * sizeof(struct raeume)); 
+0

問題を解決したばかりの方もいらっしゃいましたが、私はまだうまくいきませんでしたが、私の機能。私のメインでそれは完全に正常に機能しますが、私の機能ではちょうど言う:0xbaadf00dときに私は配列のメモリを見て –

+0

ok nevermind私はちょうど多くのおかげでそれを考え出した! –

+0

大丈夫です。私はあなたがもっと助けを求めていたので私の答えを広げました。答えに答えを記入することを検討してください。 – datosh

関連する問題