掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25909

配列の要素数を変数で宣言
投稿者---keigo(2006/02/01 11:25:11)


OS:Windowsxp
コンパイラ:gcc

csvファイルから
A,B,C,D,E
10,30,40,20,50
1.読み取り昇順で並び替えて表示する
2.ファイルが中身が後で変更されても対応できるようにする
という課題で1はできたのですが2を動的配列を使わないで作ろうとしたところ

size = 要素数判定処理( , 区切りで文字を分ける)
int data[size];
int *a[size];

と宣言しましたら正常に動作したのですがなぜ動作しているのかが理解できていません。
デバックでは配列の中身が見ることできませんでした。
たまたま動いただけかもしれませんがなぜ動いているのかが気になっています。




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> 配列の要素数を変数で宣言<ソースコード>追加 25911 keigo 2006/02/01 13:00:55


No.25911

配列の要素数を変数で宣言<ソースコード>追加
投稿者---keigo(2006/02/01 13:00:55)


/*
    可変対応
*/

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

void swap( int* ,int* );// 数値入れ替え処理宣言
void swaps( char** , char** );// 文字入れ替え処理宣言
void sort( int [] , char*[] , int );//順番入れ替え処理宣言
void GetItem( char *[] , char [] ); //文字列から文字取り出し処理宣言
void Getmath( int [] , char [] );// 文字列から数値取り出し処理宣言
int hantei( char[] );// 文字列の文字列数

int main(void)
{
    FILE *fp_in;
    FILE *fp_out;
    
    char lang[256],name[256],copy[256];
    int i;
    int size;
           
    if((fp_in = fopen("data2.csv","r")) == NULL )
    {
        printf("\a入力ファイルをオープンできません。\n");
    }else{
        fscanf(fp_in, "%s%s" , lang , name );
    }
    fclose(fp_in);
    
    strcpy(copy,lang);
    
    size = hantei(copy);
     
    int data[size];
    char *a[size];
    
    GetItem(a,lang);
    Getmath(data,name);
    sort(data,a,size);
    if((fp_out = fopen("out2.csv","w")) == NULL )
    {
        printf("\a出力ファイルをオープンできません。\n");
    }else{
        printf("出力しました。");
        for( i = 0 ; i < size ; i++ )
        {
            fprintf(fp_out,"%s,%d\n", a[i] , data[i]);
        }
    }
    fclose(fp_out); 
   
    return 0;
}

void GetItem( char *a[] , char lang[] )
{
    char *lp;
    int j = 0;
    lp = strtok( lang , "," );
    a[0] = lp;
    while ( lp != NULL )
    {
     lp = strtok( NULL," ," );
        if ( lp != NULL )
        {
         j++;
         a[j] = lp;
        }
    }  
}

void Getmath( int data[] , char name[] )
{
    char *np;
    int k = 0;
    np = strtok( name , "," );
    data[0] = atoi(np);
    while ( np != NULL )
    {
     np = strtok( NULL," ," );
        if ( np != NULL )
        {
         k++;
         data[k] = atoi(np);
        }
    }   
}

// 要素数判定処理
int hantei( char lang[] )
{
    int hantei = 1;
    char *lp;
    char *a[256];
    lp = strtok( lang , "," );
    a[0] = lp;
    while ( lp != NULL )
    {
     lp = strtok( NULL," ," );
        if ( lp != NULL )
        {
         hantei++;
         a[hantei] = lp;
        }
    }
    return(hantei);
}

// 数値入れ替え処理
void swap(int *x ,int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}
// 文字列入れ替え処理
void swaps(char **sx, char **sy)
{
    char *temp;
    temp = *sx;
    *sx =*sy;
    *sy= temp;
}

// 順番入れ替え判定処理
void sort(int data[],char *a[],int n)
{
    int k = n - 1;
    while( k >= 0 )
    {
        int i,j;
        for( i = 1 , j = -1  ; i <= k ; i++ )
        {
            if(data[i-1] < data[i] )
            {
            j = i - 1;
            swap(&data[i],&data[j]);
            swaps(&a[i],&a[j]);
            }
        }
        k = j;
    }
}

int data[size];
int *a[size];
の動きがわかりません。


この投稿にコメントする

削除パスワード

No.25912

Re:配列の要素数を変数で宣言<ソースコード>追加
投稿者---Blue(2006/02/01 13:22:27)


とりあえず、
C99規格のコンパイラならば可変長配列は使えます。
(gccはたしかそうだとおもいますが)
http://seclan.dll.jp/c99d/c99d04.htm

ところで、
char* s[ 10 ];
int i;
for ( i = 0; i < 10; i++ )
    scanf( "%s", s[ i ] );

みたいな使い方していますが、これはNGです。
s[ 0 ]〜s[ 9 ]の領域は確保されていませんので。


この投稿にコメントする

削除パスワード

No.25913

ありがとうございました
投稿者---keigo(2006/02/01 14:16:21)


>C99規格のコンパイラならば可変長配列は使えます。

使えるということなので教えていただいたHPを参考に理解できるようにします。

><pre>char* s[ 10 ];
int i;
for ( i = 0; i < 10; i++ )
scanf( "%s", s[ i ] );</pre>
>みたいな使い方していますが、これはNGです。
>s[ 0 ]〜s[ 9 ]の領域は確保されていませんので。

ここはもう一度考えなおして変更してみます。

配列の要素数に変数が使えるかどうかで悩んでとまってしまっていたのでこれで先にすすめそうです。
ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧