質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

3回答

1845閲覧

int型の多次元配列のポインタを関数に渡すことはできるのですか?

L4zy

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/05/01 23:45

hashInsert(num, &hashArray, numCnt);ここで、hashArray[][]のアドレスを渡して、
関数の先if(*hashArray[j][atoi(num[i]) % 7] == 0) hashArray[j][atoi(num[i]) % 7] = atoi(num[i]);でhashArray[][]の中身を書き換えたいのですが、うまくいきません。
今までは、int aとかだったら、&aを渡して、渡された側で
aに値を入れることでaの変更はできていました。

C

1#include <stdio.h> 2#include <string.h> // strtok, strlen, memset 3#include <stdlib.h> // malloc 4#include <ctype.h> // isdigit 5#include <stdlib.h> // atoi 6 7int spacePart(char str[], char **num, int cnt); 8int numCheck(char *num[], int numCnt); 9void hashInsert(char *num[], int *hashArray[][7], int numCnt); 10// ハッシュ探索を行う関数 引数:なし 戻り値:0 メモリ確保できない-1 11int main() 12{ 13 int flg = 0, numCnt, find, hashArray[100][7] = {}; 14 char str[1000], *num[100]; 15 // メモリ確保 16 *num = (char *)malloc(sizeof(str)); 17 18 // メモリ確保失敗 19 if(num ==NULL) 20 { 21 printf("メモリの確保に失敗しました。"); 22 return -1; 23 } 24 while(flg == 0) 25 { 26 puts("100個以内の数値を入力してください。"); 27 fgets(str, 1000, stdin); 28 29 // 文字列を空白ごと分け、入力値の数を代入する 30 numCnt = spacePart(str, num, 100); 31 32 // 入力値が数値だったら 33 if(numCheck(num, numCnt) == 1) flg = 1; 34 else puts("入力値が正しくありません。"); 35 } 36 // ハッシュ値に数値を代入する 37 hashInsert(num, &hashArray, numCnt); 38 39 40//ここでなーい 41printf("%d %d\n", hashArray[0][1], hashArray[0][2]); 42 43 44 printf("探索対象の数値を入力してください:"); 45 scanf("%d", find); 46 free(*num); // メモリ解放 47 return 0; 48} 49 50// 文字列を空白ごとに分けて配列に格納し、入力値の数を返す関数 51// 引数:入力値、配列、100 戻り値:数値の数 52int spacePart(char str[], char **num, int cnt) 53{ 54 // 空白区切りに文字列を分割 55 num[0] = strtok(str, " \n"); 56 int i; 57 58 // 最大100個 59 for(i = 1; i < cnt; i++) 60 { 61 num[i] = strtok(NULL, " \n"); 62 // 区切った文字列がNULLだったら 63 if(num[i] == NULL) break; 64 } 65 num[i] = NULL; // 終わりのしるし 66 return i; 67} 68 69// 入力文字列が数値がチェックする関数 引数:入力値 戻り値:数値1 数値ではない0 70int numCheck(char *num[], int numCnt) 71{ 72 char *temp; 73 // 配列に値がある間 74 for(int i = 0; i < numCnt; i++) 75 { 76 temp = num[i]; 77 for(int j = 0; j < strlen(temp); j++) 78 { 79 // 数値ではなかったら 80 if( !isdigit(temp[j]) ) return 0; 81 } 82 } 83 return 1; 84} 85 86// 入力した数値を7で割った余りの配列に代入する関数  87// 引数:入力値、ハッシュ配列、数値の数 戻り値:なし 88void hashInsert(char *num[], int *hashArray[][7], int numCnt) 89{ 90 int j = 0; 91 for(int i = 0; i < numCnt; i++) 92 { 93 // メモリ確保 94 hashArray[j][atoi(num[i]) % 7] = (int *)malloc(100); 95 if(*hashArray[j][atoi(num[i]) % 7] == 0) *hashArray[j][atoi(num[i]) % 7] = atoi(num[i]); 96 else j++; 97 } 98 free(hashArray); // メモリ解放 99}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/05/01 23:58

「うまくいきません」とありますが、具体的にどうなるのですか?
L4zy

2020/05/02 00:06

7474496のような大きい数が表示されます
jimbe

2020/05/02 04:11

hashArray の前に, > char str[1000], *num[100]; > *num = (char *)malloc(sizeof(str)); から妙なことになっていませんか...
guest

回答3

0

ベストアンサー

以下のようにint [100][7]に数値を格納していきたいのだと理解しました。
{7, 1, 2, 3, 4, 5, 6}
{14, 8, 9, 10, 11, 12, 13}
{21, 15, 16, 17, 18, 19, 20}
...

変更点は★のところです。
hashInsertの引数の型と、配列の空きの見つけ方を参考にしてください。

C

1#include <stdio.h> 2#include <string.h> // strtok, strlen, memset 3#include <stdlib.h> // malloc 4#include <ctype.h> // isdigit 5#include <stdlib.h> // atoi 6 7int spacePart(char str[], char **num, int cnt); 8int numCheck(char *num[], int numCnt); 9void hashInsert(char *num[], int (*hashArray)[100][7], int numCnt); //★int[100][7]型のポインタなので 10// ハッシュ探索を行う関数 引数:なし 戻り値:0 メモリ確保できない-1 11int main() 12{ 13 int flg = 0, numCnt, find, hashArray[100][7] = {0}; //★0が必要 14 char str[1000], *num[100]; 15 //★spacePartで代入するので不要 // メモリ確保 16 //★*num = (char *)malloc(sizeof(str)); 17 //★ 18 //★// メモリ確保失敗 19 //★if(num ==NULL) 20 //★{ 21 //★ printf("メモリの確保に失敗しました。"); 22 //★ return -1; 23 //★} 24 while(flg == 0) 25 { 26 puts("100個以内の数値を入力してください。"); 27 fgets(str, 1000, stdin); 28 29 // 文字列を空白ごと分け、入力値の数を代入する 30 numCnt = spacePart(str, num, 100); 31 32 // 入力値が数値だったら 33 if(numCheck(num, numCnt) == 1) flg = 1; 34 else puts("入力値が正しくありません。"); 35 } 36 // ハッシュ値に数値を代入する 37 hashInsert(num, &hashArray, numCnt); 38 39 40//ここでなーい 41printf("%d %d\n", hashArray[0][1], hashArray[0][2]); 42 43 44 printf("探索対象の数値を入力してください:"); 45 scanf("%d", find); 46 //★不要 free(*num); // メモリ解放 47 return 0; 48} 49 50// 文字列を空白ごとに分けて配列に格納し、入力値の数を返す関数 51// 引数:入力値、配列、100 戻り値:数値の数 52int spacePart(char str[], char **num, int cnt) 53{ 54 // 空白区切りに文字列を分割 55 num[0] = strtok(str, " \n"); 56 int i; 57 58 // 最大100個 59 for(i = 1; i < cnt; i++) 60 { 61 num[i] = strtok(NULL, " \n"); 62 // 区切った文字列がNULLだったら 63 if(num[i] == NULL) break; 64 } 65 num[i] = NULL; // 終わりのしるし 66 return i; 67} 68 69// 入力文字列が数値がチェックする関数 引数:入力値 戻り値:数値1 数値ではない0 70int numCheck(char *num[], int numCnt) 71{ 72 char *temp; 73 // 配列に値がある間 74 for(int i = 0; i < numCnt; i++) 75 { 76 temp = num[i]; 77 for(int j = 0; j < strlen(temp); j++) 78 { 79 // 数値ではなかったら 80 if( !isdigit(temp[j]) ) return 0; 81 } 82 } 83 return 1; 84} 85 86// 入力した数値を7で割った余りの配列に代入する関数  87// 引数:入力値、ハッシュ配列、数値の数 戻り値:なし 88void hashInsert(char *num[], int (*hashArray)[100][7], int numCnt) //★プロトタイプ宣言と同じ 89{ 90 int j = 0; 91 for(int i = 0; i < numCnt; i++) 92 { 93 //★領域確保は不要 // メモリ確保 94 //★hashArray[j][atoi(num[i]) % 7] = (int *)malloc(100); 95 96 //★7で割った余りの配列の中から空きを見つける処理にしたいのでは? 97 for (j = 0; j < numCnt; j++) 98 { 99 if ((*hashArray)[j][atoi(num[i]) % 7] == 0) 100 { 101 (*hashArray)[j][atoi(num[i]) % 7] = atoi(num[i]); 102 break; 103 } 104 } 105 } 106 //★不要 free(hashArray); // メモリ解放 107}

投稿2020/05/02 06:39

etsuhisa

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

L4zy

2020/05/02 07:25

天才
guest

0

C

1#include <stdio.h> 2 3void set(int a[][3]) // void set(int (*a)[3]) と書いても同じ 4{ 5 for (int i = 0; i < 2; i++) 6 for (int j = 0; j < 3; j++) 7 a[i][j] = (i + 1) * 100 + j + 1; 8} 9 10int main(void) 11{ 12 int a[2][3]; 13 set(a); 14 for (int i = 0; i < 2; i++) { 15 for (int j = 0; j < 3; j++) 16 printf("%4d", a[i][j]); 17 putchar('\n'); 18 } 19}

C

1#include <stdio.h> 2 3void set(int (*a)[2][3]) // void set(int a[][2][3]) と書いても同じ 4{ 5 for (int i = 0; i < 2; i++) 6 for (int j = 0; j < 3; j++) 7 (*a)[i][j] = (i + 1) * 100 + j + 1; // a[0][i][j] = も同じ 8} 9 10int main(void) 11{ 12 int a[2][3]; 13 set(&a); 14 for (int i = 0; i < 2; i++) { 15 for (int j = 0; j < 3; j++) 16 printf("%4d", a[i][j]); 17 putchar('\n'); 18 } 19}

ということで、
*num = (char *)malloc(sizeof(str)); は
num[0] = (char *)malloc(sizeof(str)); と同じ。

free(*num); は free(num[0]); と同じ。

ところが、num[0] = strtok(str, " \n"); で
num[0] を破壊しているので、free(*num); はできない。

さて質問です。
malloc で確保した 1000バイトの領域は何に使うんですか?
そこにデータを入れているところはどこですか?

if分が動かない・・・ の質問を元に戻してください。

投稿2020/05/02 04:07

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C

1void hashInsert(char *num[], int *hashArray[][7], int numCnt) 2{ 3 int j = 0; 4 for(int i = 0; i < numCnt; i++) 5 { 6 // メモリ確保 7 hashArray[j][atoi(num[i]) % 7] = (int *)malloc(100); 8 if(*hashArray[j][atoi(num[i]) % 7] == 0) *hashArray[j][atoi(num[i]) % 7] = atoi(num[i]); 9 else j++; 10 } // ここまでせっせとhashArrayのナカミを埋めておきながら 11 free(hashArray); // 結局全部捨ててしまうの? 12}

何がしたいのかさっぱりわからん...

投稿2020/05/02 00:26

編集2020/05/02 00:27
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問