C言語なら俺に聞け(入門篇) Part 23at TECH
C言語なら俺に聞け(入門篇) Part 23 - 暇つぶし2ch809:デフォルトの名無しさん
08/01/14 12:54:39
>>808
移植はされてると思う。

810:デフォルトの名無しさん
08/01/14 12:56:27
>>807
プログラムの起動時に渡されたコマンドラインの引数を、数値に変換してるんだけど、それだとバグっていて動かないね。

811:デフォルトの名無しさん
08/01/14 14:19:43
806の日本語がバグっとる

812:デフォルトの名無しさん
08/01/14 16:12:11
変換前:This
変換後:hisTay
変換前:is
変換後:siay
以下のコードで上のように出力して欲しいのですが上手くいきません
何故でしょうか?

int main() {
int i;
char s[256] = "This is a pen", *word;
word = strtok(s, " ");
printLatinWord(word);
word = strtok(NULL, " ");
// wordに"ay"が入る。何で?
printLatinWord(word);
return 0;
}

void printLatinWord(char *word) {
char *alp;
/*
通俗ラテン語風に変換して出力
※先頭の文字を末尾に移し、その後ろにayを付加する。
*/
printf("変換前 : %s\n", word);
strncpy(alp, word, 1);
alp[1] = '\0';
strcat(word, alp);
strcat(word, "ay");
printf("変換後 : %s\n", &word[1]);\
}

813:デフォルトの名無しさん
08/01/14 16:29:28
>>812
char *alp;
ポインタにぶちこむな
char alp[1000];
的な感じにしないと

814:デフォルトの名無しさん
08/01/14 16:32:59
>>812
strtokは、与えた文字列(この場合s)の中を書き換えながら、そこを指すポインタを直接返す。
たとえば、"This is a pen" を与えると、strtokは最初
"This\0is a pen"
 ↑
ここを返す。文字列は\0で終わる決まりなので、"This"が得られる。2回目は
"This\0is\0a pen"
         ↑
ここを返す。"is"が得られる。3回目は
"This\0is\0a\0pen"
              ↑
            ここを返す。"a"が得られる。
こういう動作なので、帰ってきた文字列に直接strcatで追加すると、
後ろの文字列(=次に返される文字列)が書き換わってしまう。
つまり、そのprintLatinWordを実行すると、sの中は
"ThisTay\0a pen"
のように書き換わり、次にstrtokが返すはずだった "is" は "ay" になってしまう。

815:812
08/01/14 16:42:27
>>813
なんとなく*alpになってしまいました
まだ違いが良く分かってないので頑張って勉強します

>>814
wordを書き換えるとsも変わってしまうんですね。なるほど
丁寧にどうもです
*wordをword[256]に、word = strtok(s, " ");をstrcpy(word, strtok(s, " "))に直して上手くいきました

816:デフォルトの名無しさん
08/01/14 16:55:04
大学の課題で一部分からない点があるので、よろしければヒントをお願いします。

#include<stdio.h>
#define MAX 10

int inputnum(int num[]){
int i;
for(i=0;i<MAX;i++){
scanf("%d",num[i]);
}
return num[];
}

int main (void){・・・・・・と続くのですが、
上記のサブ?ルーチンに表記の間違いがある場合、修正せよという問題です。
ですが配列の返し方など全て自習ということでここで止まってます…。
構文にエラーがあるというところまで分かっているのですが、
どうすえればいいか分かりません。ご教授願います。 orz

817:816
08/01/14 16:56:30
For文が見にくくなってしまいすいません…。
よろしくお願いします。

818:デフォルトの名無しさん
08/01/14 16:59:05
void inputnum(int num[]) {
int i;
for(i=0; i<MAX; i++) scanf("%d", num + i);
}


819:デフォルトの名無しさん
08/01/14 17:00:36
>>816
return 0;とでもしておけ
返さなくても渡された中身は書き換わってる
なんでかはポインタについて勉強せんと・・

820:デフォルトの名無しさん
08/01/14 17:06:48
scanf("%d", &num[i]);
もでした

821:816
08/01/14 17:17:55
>>818,>>820
丁寧にありがとうございます。

>>819
ということは>>818の通りvoid宣言でいいのですね…。
後でじっくり調べてみます。ありがとうございます。

822:デフォルトの名無しさん
08/01/14 17:21:48
int inputnum(int num[], size_t num_size)
{
    int i;
    for(i=0; i<num_size; i++)
        if(scanf("%d", &num[i]) != 1)
            return 0;
    return 1;
}


823:816
08/01/14 17:58:20
>>822
すみません、「size_t num_size」とは何でしょうか?
また戻り値がどこの変数へ戻るのか分かりません…。


また1つ分からない事があるのでどなたかご教授お願いします orz
サイズを指定せずに配列を作る事は可能でしょうか?
int num[];
//これでは要素が無いためサイズが0であるのでできないということまで
分かりましたがそれ以上で詰まっています。
よろしくお願いします。

824:デフォルトの名無しさん
08/01/14 18:04:39
>>823
size_tは型。たぶんunsigned intと同じである環境が多いのかな?
要は自然数用型とか思っとけばとりあえずOK。(サイズにマイナスはないからね)
戻り値がどこに入るかは呼び出し側次第。

int func( void )という関数があったとして
main内で「int a = func( );」 としてればfunc内の戻り値がa内に入る。

825:デフォルトの名無しさん
08/01/14 18:06:53
>>823
サイズを指定しない配列は無理

malloc系を使えば好きな大きさで確保したり、大きさ変えたりはできるけど

826:デフォルトの名無しさん
08/01/14 18:08:05
char s[] = "もけあ";
とかはできるけどそれは宣言のときだけね

827:816
08/01/14 18:32:46
>>824
詳しくありがとうございます。
int inputnum(int num[], size_t num_size)
メインルーチンの方で上の2つの変数の値を指定すればいいということですね。

>>825-826
明確にありがとうございます。
入力する回数を予め決めるか、
要素次第ということですね。大変参考になりました。

皆さんありがとうございました。

828:デフォルトの名無しさん
08/01/14 18:59:16
int func(int num){

return !(num%2);

}

上記の関数でnumが奇数の場合と偶数の場合の戻り値はそれぞれどうなりますか?
有識者の方宜しくお願いします。

829:デフォルトの名無しさん
08/01/14 18:59:55
タメセカス

830:デフォルトの名無しさん
08/01/14 19:06:49
算数じゃん。

831:デフォルトの名無しさん
08/01/14 19:07:11
>>828
何がわからんのだ?%演算子か?!演算子か?
関数や戻り値がわかってるのならどっちかだろうな。
num = 2;
num % 2 == 0;
!0 == 1

num = 1;
num % 2 == 1;
!1 == 0;
こんなもんでわかるだろ。
ってか>>829で良かったかな。

832:デフォルトの名無しさん
08/01/14 19:08:07
自己顕示欲・・・

833:816
08/01/14 21:14:46
すみません。また1つ疑問ができてしまいましたのでご教授お願いします… orz

配列inputのサイズ変数MAXをサブルーチンで決定したいのですが、

int MAX;
void sub(int MAX){
  scanf("%d",&MAX);
}

int main(void){
  input[MAX];



}

とした時に、「sub(MAX);」をどこで定義すればいいのでしょうか?
それともルーチンではできないでしょうか?
よろしくお願いします orz

834:デフォルトの名無しさん
08/01/14 21:18:07
(^ん^)?

835:デフォルトの名無しさん
08/01/14 21:18:29
とりあえずC言語における「定義」の意味を調べなおした方が

836:デフォルトの名無しさん
08/01/14 21:19:26
日本語でおk

MAXの値はどこでも変えられるけど?
MAX = 4;とか好きにすれば?
それとも配列のサイズ変えたいの?

837:816
08/01/14 21:19:52
>>833訂正です、すみません。

void sub(int MAX){
  scanf("%d",&MAX);
}

int main(void){
  int MAX, input[MAX];



}

838:816
08/01/14 21:22:24
>>835
すみません、定義ではなく呼び出しでした。ご指摘ありがとうございます。

>>836
サイズを入力で指定したいのですが、そのプログラムはサブルーチンで記すことが条件です。

839:デフォルトの名無しさん
08/01/14 21:25:06
>>833
若干エスパー。
丸写しはどーかと思うけど、こういうことか?
void sub(int *MAX){
  scanf("%d",&MAX);
}

int main(void){
  int MAX;
  int *input;
sub(&MAX);
  /* int input_NG[MAX] <- これはムリ。配列の宣言では定数しか使えない */
  input = malloc(MAX * sizeof(int));



  free(input);
}


840:816
08/01/14 21:37:44
>>839
ご回答ありがとうございます。
分かりづらくなってしまい申し訳ございません。

int MAX = 10;
int main(void){
  int main[MAX];




このように、最初から数値を指定するのではなく、
MAXの値をscanf等の入力で毎回変更することはできませんか?
またできる場合、それをサブルーチンでまとめられますか?


イメージはこんな感じになります。
scanf("%d",&MAX);
int input[MAX];

何度もすみませんがよろしくお願いします。

841:デフォルトの名無しさん
08/01/14 21:53:30
>>840
一応そのイメージで839を書いたんだけど・・・。
要はmallocを使いたくない(or知らないので分からない)ってこと?

どうしても配列ってことであれば、おそらく分からないだろうけど
C89ならムリ。C99なら出来る。
つまりコンパイラによる。
例えば俺が知ってるうちではVCでは出来ない。gccは最近のであれば出来る。

842:816
08/01/14 21:53:33
>>839
/* int input_NG[MAX] <- これはムリ。配列の宣言では定数しか使えない */
すみませんようやく意味が分かりました。
本当に詳しくありがとうございました。

843:816
08/01/14 22:01:13
>>841
#include <stdlib.h>とセットでちらっとだけ見た事があるので
調べて分かれば使えると思いますが、分からないということでお願いします。

別のプログラムで指定した値をファイルに出力し、当プログラムで読み込むというような方法はあるのでしょうか?

844:デフォルトの名無しさん
08/01/14 22:08:52
>>843
とりあえずfopen辺りでファイルの入出力ができるよ(他にもあるけど)
それも分からないの?

845:816
08/01/14 22:17:29
>>844
そこは以前にある程度習っているので復習すればできると思います。
ありがとうございます。

846:デフォルトの名無しさん
08/01/14 22:18:52
>>843
>調べて分かれば使えると思いますが、分からないということでお願いします。
お願いされてもwww
とりあえず十分に大きい固定サイズの配列を用意するか、
mallocを調べるのが良いと思うよ。

847:816
08/01/14 22:34:59
>>846
>お願いw
すみません余計でした^^;

>固定サイズ
とても参考になりました。
0~固定サイズまでで値を指定することならできそうです。
ありがとうございました。

時間があればmallocを扱えるようにしたいと思います。

848:デフォルトの名無しさん
08/01/15 16:44:03
質問。
ハッシュ法について勉強してるんだけど、格納されたデータ(学籍番号と氏名)を読み取る際に、学籍番号の数(生徒数)を読み取る部分的なプログラムが分かりません。
どういう構文使えばいいでしょうか?
読み込みはこんな感じです↓
/* データファイルの読み込み */
if ((fp=fopen("DATA","r"))==NULL){
printf("File \'DATA\' is not found !\n");
}


while ( fscanf(fp, "%d %s", &data_zipcode, data_address) > 0 ) {
printf("%d : %s\n", data_zipcode, data_address);
/* データの格納 */
if ( StoreData(data_zipcode, data_address) == 0 ) {
printf("Hash Table is full !\n");

}
}
fclose(fp);

849:デフォルトの名無しさん
08/01/15 17:05:19
>>848
ファイル内のデータの総数を知りたいなら、一回空読みすればよかろ。
つーか、それってハッシュ法と関連するのか?

850:デフォルトの名無しさん
08/01/15 17:50:05
>>849
ハッシュするための下準備。んで、出来ました。ありがとうございました。

851:デフォルトの名無しさん
08/01/15 20:06:23
if ((fp=fopen("DATA","r"))==NULL){
printf("File \'DATA\' is not found !\n");
}

いっつも思うんだけどさ、これって何したいの?

ファイルオープン失敗したまま処理続けるなよ

852:N
08/01/15 20:07:27
ナップザック問題を解説付きで教えてください。

853:デフォルトの名無しさん
08/01/15 20:17:11
>>851
その箇所だけならなんとも言えんだろーがw

854:デフォルトの名無しさん
08/01/15 21:25:42
#include <stdio.h>
#include <stdlib.h>

#define MAX_LINE 128

int main(void);

int main(void)
{
char buf[MAX_LINE];
int n;

printf("降水確率を入力してください。\n");
gets(buf);
n = atoi(buf);
ptintf("降水確率は %d %% です。\n", n);
if (n >= 50){
printf("傘を忘れずにね。\n");
}
else {
printf("傘はいりません。\n");
}
printf("いってらっしゃい。\n");

return(0);
}

/*これ↑のどこが悪いのか教えてください*/

855:デフォルトの名無しさん
08/01/15 21:31:57
gets(),ptintf,return(0);

856:デフォルトの名無しさん
08/01/15 21:47:31
ていうかなんでmain関数にもプロトタイプ宣言してんの?

857:デフォルトの名無しさん
08/01/15 22:01:51
>>852
ググった方が早いと思うよ。
検索ワードはナップザック・ナップサック・動的計画法とかで
アプレット使った図解解説ページがあったと思う。
C言語の質問というよりアルゴリズム全般、数学の方が分野としては近いと思う。

858:デフォルトの名無しさん
08/01/15 22:39:47
mainクソワロタwwwwwwwwwwwwwwww

859:デフォルトの名無しさん
08/01/16 01:21:59
>>854
>/*これ↑のどこが悪いのか教えてください*/
降水確率が40%でも傘を持たせない根性。

860:デフォルトの名無しさん
08/01/16 07:03:52
グレゴリウス暦の定義を利用して入力された日は何曜日か計算するにはどうしたらいいでしょうか?


861:デフォルトの名無しさん
08/01/16 07:28:06
>>860
つ[time.h]

862:デフォルトの名無しさん
08/01/16 07:31:21
>>860
ツェラーの公式

863:デフォルトの名無しさん
08/01/16 08:29:24
>>860
適当な起算日からの日数を計算して7で割ったあまりを得よ。

864:デフォルトの名無しさん
08/01/16 16:44:51
typedef struct{
int data[100];
} test;

int func(const test *x);

int main{
test data;
... //省略
for(i=0; i<10000; ++i){
int temp;
temp = ...; //省略。dataの要素を使ったなんかやたら複雑な計算
func(&data);
printf("%d", temp);
}
return 0;
}

ちゃんとしたコンパイラなら、
funcの引数がconstポインタだからループ中でdataの値は変更されない、と解釈して
毎回やたら複雑な計算をするようなことはしないように最適化してくれますよね?

865:デフォルトの名無しさん
08/01/16 16:48:20
ちゃんとしたコンパイラがあればね。

866:デフォルトの名無しさん
08/01/16 16:57:04
ないんですか?
たとえばVCとかgccではどうですか。

867:デフォルトの名無しさん
08/01/16 17:03:13
自分で確かめろ

868:デフォルトの名無しさん
08/01/16 17:18:47
いやgccもVCも持っていなくて……
アセンブラも読めないし

869:デフォルトの名無しさん
08/01/16 17:21:57
なら入手して確かめればいいじゃん。

870:デフォルトの名無しさん
08/01/16 17:22:36
constなんかキャストすればいくらでも外せるからな・・・最適化してしまうわけにはいかんような気がする

871:デフォルトの名無しさん
08/01/16 17:42:48
>>864
そんな保証はどこにも無いから素直にループの外に出しておけ。
自分の為だけなら好きにすりゃいいけど、他人が読むなら言いようの無い不安感
(このコードを書いた奴はまともな人間知性を持っているのか・・・他にも問題ありそうだな・・・)
を煽るだけだからやめておけ。

872:デフォルトの名無しさん
08/01/16 17:47:40
ループの中で毎回計算しないものを、ループに入れる神経がわからない。

873:デフォルトの名無しさん
08/01/16 17:59:29
>(このコードを書いた奴はまともな人間知性を持っているのか・・・他にも問題ありそうだな・・・)
あるあるw

874:864
08/01/16 20:11:05
要するに最適化してくれないということですね? ありがとうございます。

それと、「const*って最適化に使われているのかな」という疑問が唐突に湧いてきたので質問したものでして、
別にこのコードを実際に使うわけでもないのでいろいろとご安心ください。

875:デフォルトの名無しさん
08/01/16 20:16:37
一度計算した結果はまた同じになることが保証されてるのは関数型言語だけだからな。
Cは最悪裏でサブスレッドがなんかやってるかもしれないし最適化には限界がある。

876:デフォルトの名無しさん
08/01/16 20:25:22
>>874
const*自体は最適化のヒントに使われているよ。
ただ、>864のケースでは使ってないと思うけど。

877:デフォルトの名無しさん
08/01/16 20:43:46
>>864
その最適化はまともなのか?


878:デフォルトの名無しさん
08/01/16 20:48:22
txtファイルの中にある100を探し出してカウントするプログラムを書かないといけないのですが
100を見つけるたびに一つカウントしていくプログラムを組む場合どのような事をすればいいのでしょうか

879:デフォルトの名無しさん
08/01/16 20:50:14
char *sの中から100を検索するコードを書け
それを一行に複数あっても見つかるように拡張しろ
それを複数行に対応させろ
いじょ

880:デフォルトの名無しさん
08/01/16 23:57:56
十分に大きな配列を用意
txtファイルを読み込む
strstrでNULLがでるまで検索
検索した回数を数えればおk

881:デフォルトの名無しさん
08/01/17 02:20:28
ありがとうございます
やってみます

882:デフォルトの名無しさん
08/01/17 04:31:11
でかい配列なんてイヤだっていうならこんな方法もある。

char buf[4] = {0};
int ch, cnt = 0;

while((ch=fgetc(fp)) {
buf[0] = buf[1];
buf[1] = buf[2];
buf[2] = ch;
if(atoi(buf)==100) cnt++;
}


883:デフォルトの名無しさん
08/01/17 04:31:54
while((ch=fgetc(fp))!=EOF)だった。

884:デフォルトの名無しさん
08/01/17 06:32:40
>>882
っ 1000

885:デフォルトの名無しさん
08/01/17 06:52:16
>>884
ばーかwww

886:デフォルトの名無しさん
08/01/17 07:47:18
>>884
具体的に説明していただけませんか?

887:デフォルトの名無しさん
08/01/17 08:15:05
>>884
僕には「100」が含まれているように見えますが・・・?

888:デフォルトの名無しさん
08/01/17 08:38:06
buf[3]が常に'\0'であることに気付いてないのでしょう。

889:デフォルトの名無しさん
08/01/17 14:27:15
int filename;

scanf("%d",&filename);
fopen("filename.txt","w");

キーボードから任意のファイル名でファイル作りたいんだけど
うまくいかないです。お願いします。

890:デフォルトの名無しさん
08/01/17 14:28:41
char filename[32];

scanf("%s", filename);
fopen(filename, "w");

891:デフォルトの名無しさん
08/01/17 14:31:00
>>890
どうもです
intじゃダメか…

892:デフォルトの名無しさん
08/01/17 16:44:02
なぜintでいけると思ったんだよw

893:デフォルトの名無しさん
08/01/17 16:45:39
int fileNo;
scanf("%d", & fileNo);
char fileName[100];
sprintf(fileName, "file-%d.txt", fileNo);

894:884
08/01/17 18:43:09
これがフルボッコというものかwww

エスパー解釈して数値が並んでいるテキストから
特定の数値の個数をカウントするんだと思ったんだが違うのか?

>>878
テキストに含まれる "100" という文字列の数を数えたかったの?

895:デフォルトの名無しさん
08/01/17 18:46:50
仮に>>878の真意が数値のうちから100を数えたかったとしても、
>>878だけしか書かれていない以上、>>882は十分な答えになってるだろ。

896:デフォルトの名無しさん
08/01/17 18:48:42
っていうかそんな問題ならfscanf()で数値を読めばいいだけで悩むこともないと思うが。

897:デフォルトの名無しさん
08/01/17 22:06:17
除算法を使ったハッシュ関数ってどうすればいいの?
一文字読み込むごとに割って余りを出してその余りを足していけばいいのかな?
で最後まで読み込み終わったらまた割って余りを出すという感じか?
全く見当違いのことを書いていたらすまん。

898:デフォルトの名無しさん
08/01/17 22:12:51
>>897
ん?
ハッシング(Hashing)↓
URLリンク(www.u-gakugei.ac.jp)

899:デフォルトの名無しさん
08/01/17 22:20:25
>>898
それだ。
文章を読み込ませてハッシュ値を出したいんだが、>>897のような感じでいいのかな?

900:デフォルトの名無しさん
08/01/17 22:29:46
精度を気にしないならそれでいい

901:デフォルトの名無しさん
08/01/17 22:35:26
ありがとう。
一応考え方は間違っていないようで安心した。

902:デフォルトの名無しさん
08/01/17 23:26:26
>>861-863
ありがとうございます
とりあえず前年度までの総日数と現在の総日数を出せたたのですが
そこからどうしたらいいのでしょうか?
for文とか使うんですか?

903:デフォルトの名無しさん
08/01/17 23:42:19
>>902
ツェラーの公式

904:デフォルトの名無しさん
08/01/17 23:50:47
1月と2月の計算に注意な

905:デフォルトの名無しさん
08/01/18 10:43:47
まず基準となる日の曜日がわかってないとだめだよw

906:デフォルトの名無しさん
08/01/18 10:50:23
だからそんなことしなくてもmktime()で教えてもらえばいいだろ。

907:デフォルトの名無しさん
08/01/18 11:18:52
それで最初の質問の用件、「グレゴリウス暦の定義を利用」したことになるのか?

908:デフォルトの名無しさん
08/01/18 11:38:56
>>902
1582年10月15日が金曜日だから、そこからの日数を7で割れば何曜日かわかるでしょ。

909:デフォルトの名無しさん
08/01/18 11:46:01
>>907
Cの標準関数がグレゴリウス暦の定義を利用していないとでも?

910:デフォルトの名無しさん
08/01/18 11:52:28
>>909
たとえそうでも、元の質問者の意図通りじゃないだろう

911:デフォルトの名無しさん
08/01/18 11:53:53
標準関数は1970年以降しか扱えない時点で
グレゴリウス暦の定義を利用しているともしていないともいえない。

912:902
08/01/18 20:21:50
とりあえずこんな感じの問題です
西暦1年1月は月曜日
1年は通常365日、閏年は366日
4で割り切れる年は閏年
400で割り切れる年は閏年
100で割り切れる年は閏年ではない

変数名関数名を作成
goto文は使用しない
関数途中でのreturnプログラム途中のexitはしない
外部関数は使用しない

913:デフォルトの名無しさん
08/01/18 20:29:48
>西暦1年1月は月曜日
意味不明。

914:デフォルトの名無しさん
08/01/18 20:29:51
>>912
丸投げするならこちらへどうぞ
C/C++の宿題を片付けます 101
スレリンク(tech板)
これは現行スレじゃないがな

915:デフォルトの名無しさん
08/01/19 00:09:54
西暦1年とかまで考えようとしたら、
途中暦を正すために何日かすっとばしたのも考慮に入れるのけ?

916:デフォルトの名無しさん
08/01/19 01:14:29
>>913
そうなんですか?
問題にはそう書いてあるのですが・・・
>>914
ありがとうございます
そっちでやってみます


917:デフォルトの名無しさん
08/01/19 17:16:00
質問させていただきます。
URLリンク(www.geekpage.jp)
このページで紹介されている様なUDP受信プログラムから、
受信したパケットの送信元IPアドレス(192…)を調べるにはどうすればよいでしょうか?

918:デフォルトの名無しさん
08/01/19 17:21:22
>>917
recvfrom
スレリンク(tech板)

919:デフォルトの名無しさん
08/01/19 18:11:04
>>918
おかげさまで解決できました。どうもありがとうございました。

920:デフォルトの名無しさん
08/01/20 18:03:14
C#厨です。C始めました。

#define A 1
#define B 2

int main(){
int i = A + B;
int j = A + B;
int hoge[i][j];
}



新規テキスト ドキュメント.c
新規テキスト ドキュメント.c(7) : error C2057: 定数式が必要です。
新規テキスト ドキュメント.c(7) : error C2466: サイズが 0 の配列を割り当てまたは
宣言しようとしました。
新規テキスト ドキュメント.c(7) : error C2057: 定数式が必要です。
新規テキスト ドキュメント.c(7) : error C2466: サイズが 0 の配列を割り当てまたは
宣言しようとしました。
新規テキスト ドキュメント.c(7) : error C2087: 'hoge' : 添字がありません。
新規テキスト ドキュメント.c(7) : error C2133: 'hoge' : サイズが不明です。

です。どうしたらいいでしょうか?

921:デフォルトの名無しさん
08/01/20 18:11:44
C言語は変数を用いて配列の宣言はできひんのよ

922:デフォルトの名無しさん
08/01/20 18:17:43
1. C++コンパイラの力を借りる。
拡張子cppにして、こういう風に書く

const int i = A + B;
const int j = A + B;
int hoge[i][j];

2. プリプロセッサの力を借りる。
#define i (A + B)
#define j (A + B)

本当に実行時まで変数の値がわからない時の話はまた今度。
お前の見ている本やWebサイトを読み進めていれば、その内出てくるだろうし。

923:デフォルトの名無しさん
08/01/20 18:17:55
>>921
なぬぅ!なんて使えない糞言語!
ユーザーの入力.etcによって必要なだけ配列を確保するにはどしたらいいん?

ポインタはいいとして(C#にもあるし)、プロトタイプ宣言とか、変数の宣言はブロックの先頭とか、
面倒な決まりが多いぜ…orz

924:デフォルトの名無しさん
08/01/20 18:19:04
その例で無理矢理実現するなら。

#define A 1
#define B 2
#define i (A+B)
#define j (A+B)

int main(){
int hoge[i][j];
}

925:デフォルトの名無しさん
08/01/20 18:19:11
>>923
mallocとか使え

926:デフォルトの名無しさん
08/01/20 18:19:52
C++ の std::vector 使った方が

927:デフォルトの名無しさん
08/01/20 18:20:23
まさに高級言語により生まれたゆとり世代。

928:デフォルトの名無しさん
08/01/20 18:20:45
>>926
つ[スレタイ]

929:デフォルトの名無しさん
08/01/20 18:22:06
>>922
いあ、C#で書いた迷路の生成プログラムを移植してて、
コマンドライン引数で指定した迷路のサイズによって
2次元配列のサイズを変えたいのね。

コンパイラはVC++EEのコマンドライン使ってるのでC++のコードもおkだけど
出来ればCの範囲でやりたいでふ。

930:デフォルトの名無しさん
08/01/20 18:23:10
>>925
麻呂?首ググって来る

931:デフォルトの名無しさん
08/01/20 18:23:12
malloc 一択。
演算子のオーバーロードとかないから、
何かアクセス関数作っとけ。

932:925
08/01/20 18:23:14
(´・ω・`)

933:デフォルトの名無しさん
08/01/20 18:25:02
あらかじめ最大サイズを決めておくという手もなくはない。
エレガントではないが。

934:デフォルトの名無しさん
08/01/20 18:27:32
gccで-std=c99使えばいいよ。

後の規格改定で、変数宣言の位置の縛りもなくなったし、
配列の要素数に変数が使えるようにもなった。
が、しかし、需要がなくてVisual C++は対応していない。

935:920
08/01/20 18:33:38
URLリンク(www9.plala.or.jp)
この麻呂でいけそう。超thx!
これってフリー忘れるとプログラム終わってもメモリ使えないままなの?
だとしたら怖い。
C#は案セーフじゃなければ何やってもプログラムが落ちるだけだから何でも試せたのに。

>>934
それって、今のANSI?の規格なら出来るけどVCは遅れてる子だから駄目ってこと?
ならVC2階の窓から捨てる。

936:デフォルトの名無しさん
08/01/20 18:36:31
>>935
フリーを忘れないようには
どうするといいかってのを
考えながらくむのも
おもしろいもんだよ

937:デフォルトの名無しさん
08/01/20 18:37:57
>>935
プログラムが終了すればおk
C#のunsafeとほぼ一緒だと思うけど

938:920
08/01/20 19:09:27
>>936
{書いたら直ぐに
}書いて、その間にコードを書くみたいに
麻呂したら直ぐにフリーして間にコード書いちゃ駄目?

>>937
よかた。ちゃっちゃいプログラムなら大事にはならなさそうね。

939:デフォルトの名無しさん
08/01/20 19:10:38
いやいやいやいや、
終了すれば大丈夫だからって
放置する癖は付けない方がいいぞ

940:920
08/01/20 19:22:43
>>939
それはだいぢょぶ。
ただ、びくびくしながら書いてたら上達しにくい気がするから心配だっただけ。

もひとつ質問していいかな。
int main(){
int hoge[10][10];
hoge[10][10] = 100;

poke(hoge);
return 0;
}

int poke(int *moge){
return *moge[10][10];
}

って平気?一次元だと出来たんだけど。
試してもいいかなぁ?

941:デフォルトの名無しさん
08/01/20 20:06:48
mallocを麻呂って書くヤツはカス。

942:デフォルトの名無しさん
08/01/20 20:17:08
>>935
大丈夫。VC++みたいなのが世の中の多数派。使う人間、誰もいないし。

たとえ解放し忘れても、プログラムが終了すればWindowsが丸ごと解放する。
あと、マネージドなプログラムで何やってもプログラムが落ちるだけというなら、
アンマネージドなCのプログラムだって、
何やってもプログラムが落っこちるだけで済むと言える。
9xのWindowsでもない限り。

943:デフォルトの名無しさん
08/01/20 21:26:32
>>940
そもそもhoge[10][10]の参照はまずくないか

944:デフォルトの名無しさん
08/01/20 21:29:30
mallocってなんて読むの?
えむあろっく かと思ってるんだけど

945:デフォルトの名無しさん
08/01/20 21:31:57
>>944
宗教論争みたいになっちゃうけど人間関係に問題が起きない範囲で好きに読めばいいと思う。
俺は普段はまろっくって読んでる

946:デフォルトの名無しさん
08/01/20 21:40:08
ネイティブはマロックって言うらしい
ソースは俺

947:デフォルトの名無しさん
08/01/20 21:40:51
まろっくって読んでるけど個人でやってるから口に出した事ないな
プログラマだと口に出して言うことあるのか?

948:デフォルトの名無しさん
08/01/20 21:43:23
動的確保!って叫んでる

949:デフォルトの名無しさん
08/01/20 21:43:26
普段はC++だから口に出して言ったことは無いな

950:デフォルトの名無しさん
08/01/20 21:46:54
【char】変な読み方するな その2【ちゃー】
スレリンク(prog板)

マジレスするとカタカナ表記でGoogle検索して多い方を使っておけばノープロブレム。

951:デフォルトの名無しさん
08/01/20 21:48:41
ちゃーだと最近のクソ芸人のギャグまでひっかかる

952:デフォルトの名無しさん
08/01/20 22:45:34
>>940
平気じゃない。
2次元配列を1次元配列にマップしたときのインデックスを計算汁。

953:デフォルトの名無しさん
08/01/20 22:50:46
int hoge[10][10];

配列の最後は
hoge[9][9];
よってオタワ

954:デフォルトの名無しさん
08/01/20 22:53:56
int poke(int (*moge)[10]){
return moge[9][9];
}

こういうのならいいんでしょうか・・?

955:デフォルトの名無しさん
08/01/20 23:08:57
int poke(int moge[][]){
}
って感じにできなかったっけか?

956:デフォルトの名無しさん
08/01/20 23:10:32
>>955
それはない

957:920
08/01/20 23:16:34
>>952
でけた。THX
でも、こんなの読めないよ…。
hoge[2番目の長さ * 1番目の添え字 + 2番目の添え字]

hoge[1番目の添え字][2番目の添え字]
と同じだなんて気付きようがないぬ
もっと可読性が高い書き方はないかにょ…。

958:デフォルトの名無しさん
08/01/20 23:24:05
>>955
最低でも int poke(int moge[][N]) の N が必要


959:デフォルトの名無しさん
08/01/20 23:36:12
>>957
関数にすればいいじゃん

960:デフォルトの名無しさん
08/01/20 23:41:59
>>957
>>954
の方法は?

961:デフォルトの名無しさん
08/01/20 23:45:25
>>960
2番目の長さが固定になるだろ・・・

962:デフォルトの名無しさん
08/01/21 00:49:55
Cプログラマ必須テキストです!

URLリンク(mori.eco.to)

963:デフォルトの名無しさん
08/01/21 01:21:37
マルチ乙としかいいようがないな

964:デフォルトの名無しさん
08/01/21 01:23:42
ざっと見てみたけど自意識過剰サイトでわろた
しかもテキストごときに8000円とか誰もひっかからんだろwww

965:デフォルトの名無しさん
08/01/21 01:40:05
在学中に情報系の国家試験である、基本情報処理技術者、ソフトウエア開発を取得

極普通じゃねーかwwwww

966:デフォルトの名無しさん
08/01/21 01:45:21
ばかじゃねーの
8800円あったら専門書買うわーバーカ

967:デフォルトの名無しさん
08/01/21 02:05:24
構造体の初期化で教えてください。

(1)
struct Type x = {.var = NULL};

(2)
struct Type *x;
x = (struct Type *) malloc(sizeof(struct Type));
x->var = NULL;

(3)
struct Type *x;
x->var = NULL;

とあって、(1), (2) だと問題ないのですが、
(3) だと segmentation fault になってしまいます。
どういう理屈からでしょうか?


また、構造体を 「*変数名」で宣言したときは、最初に値を設定するときに、
必ず malloc をしてからでないといけないのでしょうか?

よろしくお願いします。

968:デフォルトの名無しさん
08/01/21 02:07:49
ポインタってのはどこかの実態をポイントしてなきゃアクセスできるわけがねぇ

969:デフォルトの名無しさん
08/01/21 02:08:12
xはその構造体の型へのポインタだから

970:デフォルトの名無しさん
08/01/21 02:10:05
>>967
ポインタがなんなのかまったく理解できてない

struct Type *x;
で用意されるのは構造体struct Type がどこにあるかを表す変数だけ
構造体の本体はない
mallocでそれを用意してやってる

971:デフォルトの名無しさん
08/01/21 02:26:02
long と long int は何が違うんでしょうか

972:デフォルトの名無しさん
08/01/21 02:33:25
いっしょです

973:デフォルトの名無しさん
08/01/21 02:33:43
タイプ数

974:デフォルトの名無しさん
08/01/21 10:20:07
音声を出力するにはどうすればいいのかな?

975:デフォルトの名無しさん
08/01/21 10:20:44
環境書け

976:デフォルトの名無しさん
08/01/21 10:31:16
センサーがあるのでそれで感知をした時に
音声を出力するプログラムを作るにはどうすればいいですか?

977:デフォルトの名無しさん
08/01/21 10:34:52
センサーの入力を監視する部分と、音声を出力する部分を作ればいける

978:デフォルトの名無しさん
08/01/21 10:36:40
音声の出力する部分を作るには
どうすればどのようなプログラミングを作ればいいですか?

979:デフォルトの名無しさん
08/01/21 10:40:22
Cの標準機能じゃ無理だからOSとかコンパイラとかを書かないと答えようがない

980:デフォルトの名無しさん
08/01/21 14:33:40
>>978
putchar('\a');

981:デフォルトの名無しさん
08/01/21 14:44:54
>>978
「プログラミング」は作れません。

982:デフォルトの名無しさん
08/01/21 14:54:47
>>978
音声合成とか勉強すれば...

983:デフォルトの名無しさん
08/01/21 14:56:35
センサーって、組み込み?
それなら、周辺回路によるけどどこかのポートをパタパタ。


984:デフォルトの名無しさん
08/01/21 19:47:42
>>978
window.hをインクルードしてBeep関数使えば鳴らせるよ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch