C言語関係掲示板

過去ログ

No759 可変長データの使用

[戻る] [ホームページ]
No.9456

可変長データの使用
投稿者---シオリ(2003/09/26 21:20:27)


Data_pt = ( int ) malloc( sizeof ( int ) );
↑って文を,使いたいです。
いままでは,
Data [3][3];
みたいに[ ]の中に直接数字を入れていたんですけど,
[ ]の中にscanfとmalloc( sizeof ( int )を使って
ユーザーが指定した数字を入力して指定できるように
できませんか?

No.9458

Re:可変長データの使用
投稿者---通りすがりさん(2003/09/26 22:30:06)


こんな感じでポインタのポインタを使えばできますよ。

#include <stdio.h>
#include <malloc.h>

int main(void)
{
    int **Data_pt;
    int x, y;
    int i;

    scanf("%d", &x);
    Data_pt = (int**)malloc(sizeof(int)*x);

    scanf("%d", &y);
    for(i = 0; i < x; i++)
        Data_pt[i] = (int*)malloc(sizeof(int)*y);

    for(i = 0; i < x; i++)
        free(Data_pt[i]);

    free(Data_pt);

    return(0);
}


No.9459

Re:可変長データの使用
投稿者---シオリ(2003/09/26 22:51:09)


ありがとうございます。

No.9462

Re:可変長データの使用
投稿者---northwind(2003/09/27 18:24:03)


タイポかな?

> Data_pt = (int**)malloc(sizeof(int)*x);
ではなくて、Data_pt = (int**)malloc(sizeof(int*)*x); ですね。

No.9463

Re:可変長データの使用
投稿者---通りすがりさん(2003/09/28 01:04:25)


訂正ありがとうございます。

No.9460

(int*)malloc(sizeof(int))上手くいかなくて
投稿者---シオリ(2003/09/27 00:11:31)


さっき教えていただいた,
#include <stdio.h>
#include <malloc.h>

int main(void)
{
  int **Data_pt;
  int x, y;
  int i;

  scanf("%d", &x);
  Data_pt = (int**)malloc(sizeof(int)*x);

  scanf("%d", &y);
  for(i = 0; i < x; i++)
    Data_pt[i] = (int*)malloc(sizeof(int)*y);

  for(i = 0; i < x; i++)
   free(Data_pt[i]);

   free(Data_pt);

  return(0);
}

↑なんですが,このプログラム↓に応用したくて。
(魔方陣の行,列をユーザーが指定して,表示するプログラム。)

/* 魔方陣 */
#include <stdio.h>
/* メイン関数 */
void main(void)
{
/* 変数宣言 */
 int su;           /* ユーザーが決めた数 */
 int nData[100][100];
 int i,j;          /* 行,列 */
 int count;          /* カウント */
/* ユーザーの任意の数を入力 */
 printf("奇数値を入力してください。:");
  rewind(stdin);
 scanf("%d",&su);
/* 初期化,データ格納 */
 i = 0;
 j = su/2;
 count = 1;
 nData[i][j] = count;      /* 第1行目の中央に1を入れる */
 for (count = 2; count <= (su * su); count++)
 {
 if (count % su == 1)  /* 次に入れる数を5で割り、余りが1の場合 */
  i++;                       /* 下のますめに */
 else                        /* それ以外は */
  i--, j++;                      /* 斜め上に */
 if (i < 0)                  /* 上にはみ出した場合 */
  i = su-1;              /* その列の1番下のますめに */
 if (j == su)             /* 右にはみ出した場合は */
  j = 0;                /* その行の1番左のますめに */
 nData[i][j] = count;                  /* 入れる */
 }
/* 出力 */
 for (i = 0; i < su; i++)
  {
  printf("\n");
 for (j = 0; j < su; j++)
  {
  if(nData[i][j] < 10)
  printf(" 0%d ", nData[i][j]);          /* 数値が1桁 */
  if(nData[i][j] > 9)
  printf(" %d ", nData[i][j]);          /* 数値が2桁 */
  }
  printf("\n");
  }
/* Enter */
rewind(stdin);
getchar();
}

今はこう↑なっていて,mallocを使って,改良したいのですが,
どうも上手くいきません。
何とかなりませんか?お願いします!!


No.9461

Re:(int*)malloc(sizeof(int))上手くいかなくて
投稿者---あかま(2003/09/27 01:26:26)


インデントをつけるために全角スペースを使うとコピペで実行できなくなるので、
かならずHTML変換ツールをつかってください。

とりあえず
int nData[100][100];

int **nData;
に宣言しなおして、上のプログラムで2次元配列のメモリを確保するんじゃだめなんでしょうか?

あと細かいですけど、そのプログラムだとメモリの領域が連続してないですね。
もしそれがまずかったら↓こちらのプログラムが参考になるかと。
http://f1.aaa.livedoor.jp/~pointc/log671.html