2012-04-17 20 views
0

Iは、(文字列への)ポインタの2Dアレイを有するC:rownames機能の実装

char *result[7000][14]; 

Iは各「行」の最初の文字列を返す関数を作成します。

は、ここに私が試したものです:

char *getRownames (int a, int b, char *matrix[a][b]) 
{ 
    char *rownames[a]; 
    for(int i=0;i<a;i++){ 
     rownames[i] = malloc(strlen(matrix[i][0])+1); 
     strcpy(rownames[i],matrix[i][0]); 
    } 

    return *rownames; 
} 

そして

char *names = getRownames(7000, 14, result); 

私はgetRowNamesのための競合のタイプを言うエラーが出ます。まだCに慣れていて、自分のメモリを割り当てる必要があります。

+0

rownamesはポインタへのポインタなので、char ** names = getRownames(7000,14、result); – Chris

+0

はそのためにreturn文と関数シグネチャを修正する必要があります – Mat

+0

'rownames [i] = malloc ...'ではありませんか? –

答えて

0

あなたはここで起こっていくつかのことがあります。

関数宣言/プロトタイプは、そのアレイ用の固定サイズ&行列を持っている必要があります。あなたのプログラムのコンパイル時にコンパイラがaまたはbを知らないので、*

char *getRownames (int a, int b, char *matrix[a][b])

が動作しません。あなたは、配列はそのサイズになります知っていればそれは

char *getRownames (int a, int b, char *matrix[7000][14])

する必要があります。次に、aまたはbはまったく必要ありません。さまざまなサイズの行列を関数に渡すことができるようにしたい場合、それはまったく別の問題です。

*(コンパイラが使用すると、配列の最初の次元を除外することができます注意:char *matrix[][14]またはchar *array[]

次は、(malloc関数として、CHAR *にmalloc関数からの戻り値をキャストする必要があります) * voidを返す:

rownames[a] = (char*)malloc(strlen(matrix[i][0])+1);

ところで、それはあなたのループでrownames[i]する必要があります。 :-) iはあなたのループ変数です。

最後に、char *の配列を返すように見えますが、return *rownamesは配列の最初の値だけを返します。配列のサイズを知っていれば、既存の配列を関数に渡して値を入力する方が簡単です。それ以外の場合は、配列を返すためにmallocする必要があります。

char *result[7000][14]; 
char *firstRows[7000]; 
//... other code that fills in these values 
getRownames(7000, 14, result, firstRows); 

void getRownames (int a, int b, char* matrix[7000][14], char* returnrows[7000]) 
{ 
    for(int i=0;i<a;i++){ 
     returnrows[i] = (char*)malloc(strlen(matrix[i][0])+1); 
     strcpy(returnrows[i],matrix[i][0]); 
    } 
} 
1

  • あなたのreturn文が間違っている(それだけでrownames、ない* rownamesする必要があります)、ここでの問題のカップルがあります。私はとにかくそのようにはしません。
  • 残りのコードは表示されませんが、*result[][0]を初期化しないと、strlen呼び出しでsegfaultが発生する可能性が高くなります。
  • 私はそのサイズのスタック上の配列へのポインタを返そうとしないでください(mallocされていないローカル変数へのポインタを返さない)ので、配列を渡して関数を満たしますあなたのためにそれを出してください。あなたはmalloc'dデータのそのサイズへのポインタを持っている場合、すなわちchar *rownames=malloc(a*sizeof(char *));あなたは大丈夫でしょう。

ので、私は私のテストコードでこれをやった:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 

void getRownames (int a, int b, char *matrix[a][b], char* rownames[a]) 
{ 
    int i; 
    for(i=0;i<a;i++){ 
     //printf("%d\n",strlen(matrix[i][0])); 
     rownames[i] = malloc(strlen(matrix[i][0])+1); 
     strcpy(rownames[i],matrix[i][0]); 
    } 
    //strlen(matrix[i][0]) 
    //return &rownames[0]; 
} 

int main(void) { 
    char *result [700][14]; 
    int i=0; 
    for(i=0;i<700;i++){ 
    result[i][0]="abcd0"; 
    } 
    char *rownames[700]; 
    getRownames(700,14,result,rownames); 
    printf("I finished"); 
    printf("%s",rownames[0]); 
    printf("%s",rownames[1]); 
    printf("%s",rownames[2]); 
    printf("%s",rownames[3]); 
} 
関連する問題