【ANSI-C】 C言語なら俺に聞け! Part 128
1 :
デフォルトの名無しさん :
2006/06/26(月) 09:34:44
2 :
デフォルトの名無しさん :2006/06/26(月) 10:09:48
>>1 乙
しかし、何故「標準C」にしなかったのか?
以下のように、構造体自体は実装ファイルで定義し、そのポインタのみをヘッダでtypedefすることで 構造体のメンバを隠匿する、という方法を見たのですが、これはANSI Cで認められている方法でしょうか? 手元の書籍等見ても記述がなく、ネットで検索しても分かりませんでした。 // MyData.h typedef const struct PrivateMyData*MyDataRef; // MyData.c struct PrivateMyData { char a; char b; };
>>4 不完全型(incomplete type)として認められている。
6 :
デフォルトの名無しさん :2006/06/26(月) 16:28:24
長さが3文字以上の文字列を入力として受け付けて,先頭と最後の文字を除いた文字列を出力せよ。ただ し,入力される文字列が3文字以上であることは仮定して良い。ってどうゆうふうになりますかねぇ???
>>6 void printCuttedString(const char * str)
{
#if 0 /* checkが必要なら
if (str == NULL || strlen(str) < 2) return;
#endif
printf("%.*s", strlen(str - 2), str + 1);
}
8 :
7 :2006/06/26(月) 16:35:30
微妙に訂正。 - #if 0 /* checkが必要なら - if (str == NULL || strlen(str) < 2) return; + #if 0 /* checkが必要なら */ + if (str == NULL || strlen(str) < 3) return;
>>7-8 ×printf("%.*s", strlen(str - 2), str + 1);
○printf("%.*s", strlen(str) - 2, str + 1);
11 :
デフォルトの名無しさん :2006/06/26(月) 16:41:51
スレ違いでした。。すいません
>>5 了解です。
オブジェクト型・関数型・不完全型という分類を知りませんでした。
ありがとうございました。
13 :
7 :2006/06/26(月) 16:48:42
>>9 指摘THX.
#いかんなぁ、未だ寝ぼけてるようだ。
>>11 おいおい、回答しているのに無視かい。
14 :
デフォルトの名無しさん :2006/06/26(月) 17:10:19
すいません。 ありがとうございました。
>>13 > おいおい、回答しているのに無視かい。
この手の質問に、わざわざ回答するのもどうかと思う。
>>10 の対応で十分。
hoge.cの中でグローバル変数(externではない)gを用意 main.cで適当なポインタpをhoge.cの関数に渡す hoge.cの中で、受け取ったpにgを入れてあげる main.cでpを扱う というのはアリでしょうか? /* main.c */ int main(void) { char *p; func_hoge(p); printf("%s\n", p); return 0; } /* hoge.c */ char g[1024] = "hogehoge"; void func_hoge(char *p) { p = g; }
ヒント void func_hoge(char **p)
18 :
16 :2006/06/26(月) 23:43:17
ありがとうございます。これで動いているっぽい?です・・・ /* main.c */ int main(void) { char *p; func_hoge(&p); printf("%s\n", p); return 0; } /* hoge.c */ char g[1024] = "hogehoge"; void func_hoge(char **p) { *p = g; }
19 :
デフォルトの名無しさん :2006/06/27(火) 22:34:20
アゲ
調べたのですがわからなかったので質問をば *(ushort *)a=3; この文はどういう意味なのでしょうか? ポインターのポインターなら ushort **a=3; となると思うのですが・・・ よろしくお願いします
>>20 何者かわからないaをushortのポインタとみなし(キャストし)、その
指し示す先に3を代入するという意味で、ポインタのポインタではありません。
なるほどキャストでしたか どうもありがとうございました
ところでANSIでは左辺値のこういうキャストは認められていなかったような
別にaが定数(配列とか)とは書いてないし。
entypeってどんな型でしょうか?検索したけど書いてないので・・・
むしろ教えて欲しい
>>23 全然問題ない。
(ushort *)aは右辺値だが、間接参照演算子の結果は必ず左辺値。
28 :
デフォルトの名無しさん :2006/06/28(水) 10:12:27
[1] 授業単元: プログラミング [2] 問題文: 階乗を計算するdouble型の関数を使い、1から10までの階乗を表示するプログラムを作成してください。引数を使わないで、外部変数を使って、main関数からユーザー関数に、1から10までの値を送ってください。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 今日 [5] その他の制限:お願いします。なるべく早く・・・
29 :
デフォルトの名無しさん :2006/06/28(水) 14:11:54
93 :ひよこ名無しさん :2006/03/28(火) 02:03:32 0 別に竹石圭佑がゲイでもホモでもどーでもいいだろ。関わらずに無視すりゃ良いだけだし。 大体、ほっとけば勝手に犯罪起こして、また逮捕されて社会から消えるような野郎だしな。
31 :
デフォルトの名無しさん :2006/06/28(水) 14:38:24
きも
>>25 > entypeってどんな型でしょうか?
標準Cにそんな型はない
34 :
デフォルトの名無しさん :2006/06/28(水) 17:00:06
この質問はANSIでいいのかな? WindowsまたはLinuxで動かす予定のソフトを作っているのですが、 仮にそのどちらでもないOSでソースをコンパイルした場合に #if defined (_MSC_VER) func_windows(); #elif defined (__GNUC__) func_linux(); #else //コンパイル時にここに来たらエラー表示してコンパイルを中断する方法を教えてください。 //よろしく。 #endif
#error
>>34 errorディレクティブ。
その前にその条件ではWindowsかLinuxかになっていないぞ。
本当にWindows/Linuxで判別したいなら_WIN32/__linux__が定義されているかを使うべきだと思う。
37 :
デフォルトの名無しさん :2006/06/28(水) 17:15:30
#error でしたか。皆さんありがとうございます。 >本当にWindows/Linuxで判別したいなら_WIN32/__linux__が定義されているかを使うべきだと思う。 アドバイスありがとうございます。 私自身、どれを使ったらいいのか良く分からないまま_MSC_VERと__GNUC__を使っていました。
38 :
デフォルトの名無しさん :2006/06/28(水) 22:09:20
文字列が書かれたファイルを読み込みたいんですが、 while(fscanf(fp,"%c",char)!= EOF ){ こう記述すると、最初の1文字しか入りません。どうしたらいいですか?
>>38 > どうしたらいいでしょうか?
ファイル操作について勉強するといいよ。
getcharでいいだろ。 そして次はcharがchar型で問題が起きて聞きに来る予感。
char型のspって名前のところに入れたいんですが while(fscanf(fp,"%c",sp)!= EOF ){ でもだめだし while(fscanf(fp,"%c",getchar(sp))!= EOF ){ でもだめなんです・・・・
getcharでぐぐれよ。 サンプルコードぐらいすぐ出てくるだろ。
いろいろ試したんですけど、左辺値が必要とかいわれたり、もう限界です
× sp ○ &sp
>>47 fp= NULL;
do{
printf("\nデータファイル名を入力して下さい");
scanf("%s", datafile);
fp = fopen( datafile, "r" );
}while( fp == NULL);
while(fscanf(fp,"%c",&speech)!= EOF ){
fclose(fp);
}
最初の1文字しかよみこまれないです・・・・
>>48 落ち着いて自分が何を書いてるのかよく考えてみろ
時間ないので優しくしてください
あのなぁ、試行錯誤ってのは分かってる人間しかやっちゃ駄目なんだよ。 分かってない人間は、まず基礎を学べ。 その「教科書」とやらを窓から投げ捨て、すぐに書店に走れ。
開いてないでしょ
>>48 文字読み込む度にfclose()してどうする。
覚えようと言う気が、全く感じられないし、
才能もセンスもないみたいだから、辞めた方がいいよ。
>>48 while(fscanf(fp,"%c",&speech)!= EOF ){
fclose(fp);
}
これの意味を日本語で説明してくれ
うぜーむかついてきた 素直に答え教えろカス
>>55 あれ?君宿題スレの人?
これからやるつもりだったけど、やる気なくなっちゃった。ごめーん。
素直に教えてくれる友達に聞け
>>54 55は俺じゃないです
説明できないっす。適当に書きました
上で&って言われたので入れてみたんですが
まぁ、初心者スレにでも逝けと。
while( fscanf( fp,"%c",&speech) != EOF ){ puts(speech); } にすると読み込めてるんですが、あとの処理では配列がからのままなんですが。。。
なんつうか、こうもうちょっと検索するなり 試行するなりしてから書き込めよ
↓次の方どうぞ
とりあえず検索するなり試行するなりしてかいるのかもしれないが、 少なくとも今までの姿勢からはそう見えない。
>>66 いろいろやってみました。
しかし文字列にスペースが入るとまた配列の最初から上書きされてしまうみたいです
いろいろとは?具体的に。w
で、どこに配列があるの?
手取り足取り教えろとでも言うのかよ
>>71 言ってるようなもんだろう、
いつまでも居座ってるって事は。
そういう自助努力をしない人はプログラマーには・・・っていうか,どの職業も同じだな
74 :
デフォルトの名無しさん :2006/07/01(土) 03:56:02
x86系とmips系ってどっちがC言語向きでしょうか?
ゴリラとチンパンジー、どちらが日本語向きでしょうか?
76 :
デフォルトの名無しさん :2006/07/01(土) 04:55:50
すみません どこで聞いたらいいのか分からないのですが・・・ <-Bcc; *;{ ... { #00ff00;kill(int;s1)>>;file); w3 = exe->item;Goods*(Attach.) alpha = exe->(TM)GOODIES; act_probe = X->status.your_XP_adress; act_layer = int;s2 = (x,$%&"#_LAYER(i++)); act_Demo = Xact_layer->list_of_files->next; for(i=0;i,act_layer->(MS++GO;TO;DIE(=)); とか act_probe = listt->zxcvb.local_XP_adress; act_layer = GO/DEMO.sit(EXE-XXXX_LAYER(exe)); act_Demo = EXE_#layer->list_files->s1+=;xlan,0 for(i=0;i,exe->number_of_files;i++) { exe_#000000 = exec_#file->s2+=;b(off++)); ってなんかのソースですか? それともプログラムですか? 教えてください
>>76 GoodTimesだっけ?
ベースになってるネタはC言語のプログラムだけど、
それそのものはソースとしては成り立ってないし、何かのプログラムでもない。
そもそもウェブアートなんだから。
ム板のクソスレによく書いてある
main()
{
>>1 氏ね;
}
みたいなものか
>>74 前にビット演算スレでC言語向きなCPUについてぎゃーぎゃー騒いでたよ。
勿論標準Cの仕様にCPUの向き不向きなんて書いてないからここでやるな。
質問です。 wchar_t型の文字の半角、全角を判別する方法はありますでしょうか? 標準関数の中からは見つかれらなかったのですが、どなたかご存知 の方いらっしゃいましたらお願いします。
>>80 突っ込み所はたくさんあるものの、結論から言うとないです
83 :
デフォルトの名無しさん :2006/07/01(土) 17:28:07
何故T_CHARではないかと・・
85 :
デフォルトの名無しさん :2006/07/02(日) 01:37:59
>>80 使う文字にある程度制限があれば、
既知の半角文字だけ自前で判定すればいい。
なんでCの入門書とかscanfとか使うなっていわれてる関数を例につかってるの・・。 初心者に対して例として使いやすいからってんだろうけどマジかんべんしてください。 #include<stdio.h>をおまじないと言って無理やり次に進むならscanfやgetsも 別の関数で無理やりおまじないとして使って例を挙げてください。 特にこの関数は使ってはいけない関数ですとか言って、後の記述に ちゃっかり使って例を出してたりした時にはもう死にそう。 初心者より
>>87 そりゃぁあんた、実務経験のない人間が入門書を書いているんだからぁしかたがない。
尤も、実務経験のある人間で入門書を書けるセンスのある奴もなかなかいないわけだが。
制御文よりも配列よりもポインタよりも先に、入出力は教える必要があるわけだが これらを一切使わずに、int 型変数に整数値を取り込む簡単な方法が scanf 以外にあるなら教えてください
ポインタを教えずにscanf()を使うくらいなら、 fgets()+atoi()で充分。
ハゲドー
実務で使う関数は、標準関数じゃないものばかり。 そんな環境依存の本は「言語の入門書」にはならないよ。
93 :
デフォルトの名無しさん :2006/07/04(火) 19:26:42
>>90 fread()+sscanf()はどうよ?
95 :
デフォルトの名無しさん :2006/07/05(水) 01:09:48
沢山の変数の中から2つを選び出すには、何を使えばよいでしょうか?
↓エスパー登場
/::::::::::::::::::::::;: ―-::、:::::ヽ /::::::::::::::::::::::::::/ `゙ヾi /:::::::::::::::::;;::::::::::l -、 、__| l:::::::::::::/;ヾ:::/ ,,.-、_ :i;!ーi }:::::::::::::';r'ソ ゙' ,.-━;;;ァ; ;:! 、、__,....ノ;::::::::::::::iヾ ` ゙フ´ : i゙ /:::::::ヾ;、:::::::;:べリ. /_ i ノi::::::::::::::::::ゞ'" . ,._ `ヾ:::;' ノ;::::::::::::::::/ : :_ i: '゙``ー:/ 俺の出番かな? i'i;、:;;r‐'" ̄``丶、 .ヾ::::゙:...._ '"゙:i' / -ー- 、、 `ヽ、ヾ:;;;;;;;;;;;;;;'ノ
ポン
ちょwwwwそこロンだってwwwwww
101 :
初心者 :2006/07/05(水) 09:51:52
c言語初心者なんで口柔らくお願いしますmーーm 数列の長さを設定しました。 キーボードで文字を入力します。 入力した文字が設定した長さを超えるとごみが出て 次の入力を影響します。 設定した長さ以後のごみをメモリからとる方法は?? (どんなの関数?)
>>101 >口柔らくお願いしますmーーm
ふざけるな。お願いするのなら顔文字なんか使うな。
そして初心者スレに逝け。
恐らくgets()かscanf()を使っていると思うのだが、
fgets()を使うことを強く勧めておく。
fgetsって改行文字も入れてくれちゃって使いにくい。 getsみたいに改行を取ってくれればいいのに。
>>104 #define gets_f(a,b) do{fgets(a,b,stdin);a[strlen(a)-1]='\0';}while(0);
>>106 それだと最終行の行末に改行記号がないときに一文字落ちちゃうよ。
ファイルじゃなくて標準入力なんだからいいじゃんいいじゃん。
>>108 目的がオーバフロー対策なんだから、標準入力からでも末尾に改行がないときの対策こそ必要だと思うが。
まぁ、こんな感じだろ。
inline char * gets_f(char * a, size_t b)
{
if (fgets(a, b, stdin) == NULL) return NULL;
char * p = strchr(a, '\n');
if (p) * p = '\0';
return a;
}
こうか? void chomp(char* s){int l=strlen(s)-1;s[l]=s[l]=='\n'?'\0':s[l];} char* gets_f(char s, size_t len){char* res=fgets(s,len,stdin)&&chomp(s);return res;}
111 :
初心者 :2006/07/05(水) 13:23:45
101です、101の字は2チャンネルのデビューになります。
”C言語なら俺に聞け!”と書いたのでレス間違いました、
初心者レスに行きます。(以上礼!)
>>106 御免今の能力で読めない><;
112 :
名無しの初心者 :2006/07/05(水) 16:00:27
isalnumはどういった使い方をすればいいんでしょうか?
文字がアルファベット[A-Za-z]か数字[0-9]のいずれかであるかどうか判定したいとき。
114 :
デフォルトの名無しさん :2006/07/05(水) 20:44:44
ランレングス法を使った文字列圧縮法 実行結果は 圧縮前文字列→AAABCCCCCCDDDEFGHHHHJJJ 圧縮前文字数→23 圧縮後文字列→AAAB@C6DDDEFG@H4JJJ 圧縮後文字数→19 という風になります。 sprintf(&cCnt,"%d",iCnt); cHairetu[soeji]=cCnt; を使うみたいです。 途中までやってみたのをとりあえず乗せてきます。 #include <stdio.h> void main() { int iCnt; int gokei; int i=0; int b=0,b2=0; char mojiretu[50] = "AAABCCCCCCCCDDDEFGHHHHJJJ"; char mojiretu2[50]; char taihi; i = 0; printf("圧縮前文字列 → "); while(mojiretu[i] != '\0'){ putchar(mojiretu[i]); i++; } putchar('\n'); printf("圧縮前文字数 → %d\n",i);
で質問は? 完成させてほしいなら宿題スレへけ
116 :
デフォルトの名無しさん :2006/07/06(木) 15:03:35
質問が二つあるんですけれど、 (1)どうして、この二つの関数は引数の並びが違うんでしょうか? void *calloc(size_t nelem, size_t elsize); void *malloc(size_t size); 同じにしてもらったほうが、規則性があって分かりやすいような気がするんですが。 (2) int *p = (int *)calloc(10, sizeof(int)); int *p = (int *)calloc( 1, 10*sizeof(int)); は同じですか?
118 :
デフォルトの名無しさん :2006/07/06(木) 22:19:19
プログラムの初心者なんですが教えてください。 1.web掲示板をつくる。 2.PDAのメモ帳を使って、その掲示板にリアルタイムで書き込みをしたい。 自分でも、よくわかってないんですが、 こういうことをしようとするには、どうやって進めていけばいいんですか? 馬鹿げた質問なんてことはわかっているんですが、教えてください
小菅昭一って誰でしょうか? この人のwebページなり書籍なりありませんか?
>>116 (1)質問に質問で返して恐縮だが、一つしかないものと二つあるものを較べて並びが違うと言う、真意は?
少なくとも私には一つのものと二つのものを並びが違うとは言えないのだが。
(2)>117
>>118 1.WebProg板へどうぞ。
2.モバイル板へどうぞ。
116じゃないけど、
>>117 の言いたいことは上が正しくて、下が誤りってこと?
122 :
117 :2006/07/07(金) 00:17:47
どの「上」「下」か知らんけど、 (2) 環境によっては、同じではない。 (1) 従って、要素数と要素サイズを別の引数として与えるのと 要素数 * 要素サイズをひとつ渡すのとでは 等価ではない可能性がある。
>>118 まずそのPDAのメモ帳に通信機能はないでしょ。掲示板の方はPHPとかで簡単に作れる。受信したデータでWebページを生成
getch()について質問があります
#include <stdio.h>
#include <curses.h>
int main(void)
{
char ch;
char test[20];
int i=0;
ch=getch();
while(ch!='\n'){
test[i++]=ch;
}
printf("%s",test);
return(0);
}
をコンパイルしようとすると
ld: Undefined symbols:
_stdscr
_wgetch
と出ます。
ググって調べたら
ttp://forums.macnn.com/archive/index.php/t-131565.html の問題と同じなんですが解決法はないでしょうか?
結論だけ言うと、君にはcursesは使いこなせないから、getch()はあきらめて 別の道を探せ。
>>126 じゃあ他の方法でgetch()と同等の処理を実現できますか?
conio.h使え
>>125-
>>128 スレ違い。
環境依存OKスレか、初心者スレにでも逝け。
-lxxxxxx 抜けてるんだろうな
mkdir関数についての質問があります。 予約デバイス名である AUX CON NUL PRN CLOCK$ COM1〜COM9 LPT1〜LPT9 以上の名前のディレクトリの作成は失敗するらしいのですが、 何故かCLOCK$だけディレクトリが作成されてしまいます。 どなたか理由をご存知の方がいらっしゃいましたら ご教授願えませんでしょうか?
とりあえず環境依存OKのスレへ行ってください
名前の最後を見ればわかる
135 :
デフォルトの名無しさん :2006/07/09(日) 10:51:06
関数をポインタを受け取るように定義したんですが、 なぜその関数を実際に使う時は"&"で直接アドレスを渡す必要があるのでしょうか? どなたかお願いします。
>>135 いや、その必要は無いはず。
#include <stdio.h>
typedef void (*pfn)();
void f() {puts("hello");}
void g(pfn p) {p();}
int main(void)
{
g(f);
return 0;
}
137 :
135 :2006/07/09(日) 11:07:06
やはり問題ないですよね・・・違う原因を探ってみます。ありがとうございました。
思いっきり話が噛みあっていない気がするのは漏れの気のせい?
>>135 初心者スレ辺りで実際のコードを貼ってみるといいと思うよ。
139 :
デフォルトの名無しさん :2006/07/09(日) 14:36:07
C言語もプロトタイプ宣言って必須になったの? gcc 3.4.4でエラーが返って来たんだけど
141 :
デフォルトの名無しさん :2006/07/09(日) 15:01:48
>>140 どうもです。
近いうちに規格が変わる予定ってあるんですかね?
>>141 規格のほうはまだ先だろうが、コンパイラの実装が C99 に追いつくのは
「いまがんばってるとこ」って感じだから、実際に使用する規格が
C89 から C99 に変わるのは近いうちなのしれない。
既にデフォルトオプションではC99相当の構文解析をするコンパイラも大分出てきたので、 今のうちに対策を始めた方がいいのかもしれない。 #しかし、個別の話はここではスレ違いだな。
ソースコードは、C99とC89のどっちで書くのが理想的なの? おれは大体いつも意識して古臭い書き方してるけど。
間を取ってC++。 ベターC部分はC89とC99を足して2で割ったものに+αしたような感じだろ。
おれの場合だいたい、gccならC99、Visual C++ならC89 そんで、使えるもんは使っとく、使えなかったら諦めるってだけだが
完全に浸透するまでは C89 を使うのが無難だと思うが、 色んな理由から元々コンパイラ依存なコードを書いてるのであれば、 そのコンパイラで C99 が使えりゃ C99 を使っていいと思う。
ファイルに書き出すために文字列を結合してさらにそれをまた結合するプログラムですが 変数自体は破損してないようなんですが途中で文字化けしてしまいます。 文字列の結合に問題があるんでしょうか? 教えてください。 for(i = 0 ; i < nowMaxNum-1 ; i++) { if(i != 0) { wsprintf(lpCmdLineX2 , "#%s\r\n\0" , mapSetAd[i]); lpCmdLine2 = strcat(lpCmdLine2 , lpCmdLineX2); } for(conpas = 0 ; conpas < 4 ; conpas++) { if(cnMaxNum[conpas][i] > 0) cnMaxNum[conpas][i]--; for(id = 0 ; id < cnMaxNum[conpas][i]+1 ; id++) { wsprintf(str , "S%d %s" , cnNum[conpas][i][id] , cnStr[conpas][i][id]); MessageBox(hWnd,str,"確認",MB_OK); wsprintf(lpCmdLineX2 , "%d,%s,\0" , cnNum[conpas][i][id] , cnStr[conpas][i][id]); lpCmdLine2 = strcat(lpCmdLine2 , lpCmdLineX2); } wsprintf(lpCmdLineX2 , "|,|,\0"); lpCmdLine2 = strcat(lpCmdLine2 , lpCmdLineX2); if(conpas == 3) { wsprintf(lpCmdLineX2 , "\r\n\0"); lpCmdLine2 = strcat(lpCmdLine2 , lpCmdLineX2); } } }
>>150 「変数自体は破損していない」「文字化けしてしまう」というのが
具体的にどういうことなのかわからないので、はっきりとはわからんが、
strcat() の戻り値を使ってるあたりが勘違いの一端と思われ。
lpCmdLine2 の指してるバッファが足りないんじゃないの?
/* 1〜99 までの奇数を表示 */ #include <stdio.h> int main(void) { int n = 0; while (++n > 0 && n < 100) { if (n % 2) printf("%d ", n); } return 0; } 結果 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 … … 79 81 83 85 87 89 91 93 95 97 99 hoge% ↑を ↓ _1__3__5__7__9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 … … 81 83 85 87 89 91 93 95 97 99 hoge% のように並べたいのですけど、ご教示いただけないでしょうか。
>>153 突っ込みどころ満載だが、ここではスレ違いなので
初心者スレか宿題スレへどうぞ。
>>153 1桁の表示のアンダースコアについてよう分からんけど
面倒だからwhileの中をこうしたら?
if (n % 2) printf("%2d ", n);
if(n%10==0) printf("\n");
なんてこったい。
157 :
153 :2006/07/11(火) 00:02:06
>>155 ありがとうございました。
できました。
未熟者でして、最初簡単だと思ってやったらハマッテしまっていました!
> 1桁の表示のアンダースコアについてよう分からんけど
桁数の表示を揃えたいということを伝えるために一桁のところに
アンダースコアを入れてみました。
>アンダースコアを入れてみました。 おっきした
_ ∩ ( ゚д゚)彡 変態!変態! ⊂彡
アンダースコートを穿いてみました。
脱げ
脱がぬなら、(我が)脱いでみようホトトギス
構造体のことについて質問があります。 typedef struct data{ int **data; }Data; という構造体があったとして、以下のようにmain()からfunc()に構造体を渡した場合、 正常に動くのでしょうか? main(){ Data a; int **data; data = (int**)malloc(sizeof(int*)*10); for(i=0;i<10;i++) data[i] = (int*)malloc(sizeof(int)*10); a->data = data; func(a); } func(Data *a){ int i,j,sum=0; for(i=0;i<10;i++) for(j=0;j<10;j++) sum += a->data[i][j]; } つまり何を聞きたいのかというと、 2次元配列を動的確保した構造体を別の関数に渡した場合、 その配列に正常にアクセスできるのか、ということです。 自分で試したところ、一応動いているみたいなのですが、なんかすごく不安です。
165 :
164 :2006/07/12(水) 02:31:24
すみません、main()の Data a; → Data *a; でした。
>>164-165 Data a; に戻して、 a.data = data とし、 func(&a) とすれば問題ない。
Data* a; だと不定な領域を指しているポインタを使うことになるのでアウト。
168 :
167 :2006/07/12(水) 02:38:34
>>166 ぐはっ、その通り。よく見てなかった。 orz
169 :
164 :2006/07/12(水) 02:46:52
170 :
デフォルトの名無しさん :2006/07/13(木) 13:16:18
昨日からC言語の勉強を始めたのですが どのように勉強していけばいいでしょうか?
最初は本読みながら。 その後、とりあえず何か簡単なものを作ってみる。
日本語や英語と同じだ 文法を覚えながらいろんなソースを読んで書くべし
>>171 ,172
取り合えず「猫でも分かる〜」を買ってきたので
それ見ながら勉強します!
早速、分からない所があるのですが、
作ったプログラムの結果が表示される
黒い画面はどこにあるのでしょうか?
>>173 コンピュータの中
単体で立ち上げたいなら スタート > アクセサリ > コマンドプロンプト
あるいは スタート > ファイル名を指定して実行 > cmd
>>170-176 初心者スレでやればいい話をぐだぐだ続けるんじゃない。
そもそもスレ違いだ。
>>177 お前何?このスレの主?お前に命令されたくないんだけど?
黙ってくれない?
>>177 いちいちそういうこと言うなよ、ケツの穴の小さいクズだなぁをいっ
>>176 宣伝乙。
わざわざ無料で使えるよりANSI準拠度の高いコンパイラを否定してまでとはご苦労なこって。
178 :デフォルトの名無しさん :2006/07/13(木) 17:21:11
179 :デフォルトの名無しさん :2006/07/13(木) 17:21:42
みごとに31秒だね。よっぽど宣伝したいらしいなぁ、
>>178 =
>>179 =>176は。
>>180 >否定して
覚えはない、何ボケてんの?自分が勧めたもの以外を勧めた奴がいると
何かと気に食わないと言わんばかりのレスを入れる奴は自己中
手軽さを考慮したらまだBCCで問題ない。それを勝手な基準で問題としている香具師は 大掛かりな開発環境の方が良いとしか言えない奴。 それと、VC+2005EEを宣伝したがっているのは誰だよ?w
>176は「アルゴリズムの勉強程度」にはVC++がむかないと言っているだけだな。 つーか、喪前様方スレ違いですよっと。
>>185 誰もむかないとは言っていないが?ここって自分の気に入らないレスを
悪いようにしか解釈できない頭の固いというか固定概念しか持っていない
汎用性の無い香具師が多いんだなw
おめーらの発想力は貧弱すぎ、プログラマに向いてないよw
BCCが問題だとしている香具師はいないな。 >180は糞みたいなシェアウェアをけなしているだけだから。
>>186 素朴な疑問なんだが、>176が仮に「VC++がむかない」とは言ってないのだとしたら
なんでまた>176は糞みたいなシェアウェアなんか紹介しているんだ?
そんなに小遣い稼ぎがしたいのか?
#いや、生活かかって必死なのかも知らんが。
自分が手にしなかったもの、使わなかったものは全部糞としか言えない香具師はダメぽ 手軽さを考慮したら、BCCはまだまだ使えるよ。 そういう俺はVC++2005ExpressEditionとBCCの両方を使って アルゴリズムの勉強程度ならBCC、WindowsアプリならVC++と使い分けているし。 VC++なら単純なソースを書くにも使えるけど、開発環境の仕様を理解していない 初心者に果たして向くだろうか?ってところまでは考えてないんだろうけどさ。 お勧めするくらいなら、参考になる本くらい紹介してやれば?
>>188 > 糞みたいなシェアウェア
え?
> Borland? C++Compiler 5.5無償ダウンロード
って文字が見えませんでしたか・・・?
>>190 >176のリンク2個目
--
CPad for Borland C++Compiler
Borland C++Compiler用のC/C++開発環境(送金義務なしのシェアウェア)
--------------------------------------------------------------------------------
動作OS:Windows2000 Windows98 Windows95 WindowsNT
動作機種:汎用
ソフトの種類:シェアウェア 1,575円
BCC は Borland からウザいメールがくるので嫌だ。
あらら、>191でネタばれしたら途端に静かになっちゃったよ。 まぁ、句点を使ってないレスを見れば一目瞭然なんだけど。
194 :
デフォルトの名無しさん :2006/07/13(木) 17:56:21
多倍長演算を使ってπやらeやら求めてみたいと思ってるんですがそれらについて書いてあるおすすめのサイトが有りましたら教えてください
cygwin+gccでおk
197 :
デフォルトの名無しさん :2006/07/13(木) 19:36:29
>>193 > 送金義務なし
屁理屈うざ杉、フリーで使えることには変わりはなし。開発者は任意でって言っているし。
そもそもそれはエディタであって、使わなくても問題なし。コンパイラにおいてはフリーだろ。
そういう性格じゃプログラマに向いていないから、悪いことは言わないからやめとけ。
お前、プログラマだけでなく人生も失敗するぞ。
void main() { int i; int data[10]; for(i=0;i<10;i++){ data[i]=i; } } こうした場合に例えばdata[-1]やdata[13]などを表示すると、どういう値がでてくるのでしょうか? 実際に試すと、よくわからない数字が出てきて、これが一体何を表すのかわかりません・・
>>198 そういうこと。よくわからない数値が出るというのも、もっとも起こりそうな挙動の1つ。
0xff,0xab,0x12 と入力したときにそれぞれ別の文字列に格納したいんですが、 どういう風に記述すればいいんでしょうか?
>>200 いつまでやってんの?明らかに、BCCを否定しただけの奴の方がうざい。
BCCを勧めた奴はVC++は否定していないし。
>>203 お前もいつまでやってんだよ?お前に命令されたくない。何お前?ここの主?
だとしても2ちゃんねるじゃお前の勝手な意見は拘束力がないから無駄だけどね(プ
誰かひろゆき呼んで来い
餓鬼は巣に帰れ
また初心者同士の煽り合いか
グローバル配列変数の宣言時の初期化に関して質問なんですが、 int hoge[2] = {1, 2}; extern hoge[2]; を一文で書く何かいい方法はありませんか? 配列でなければ #ifdef GLOBAL_DEFINE #define EXTERN #define GLOBAL_INIT(x) = x #else #define EXTERN extern #define GLOBAL_INIT(x) #else EXTERN int hoge GLOBAL_INIT(1); とかでいいんですが。。。
>>210 そんな無理にCとそりのあわない考え方をやろうなんてことは、よしておいた方がいいよ。
EXTERN int hoge[2] GLOBAL_INIT({1, 2}); じゃダメ? #そのマクロの存在自体の問題は兎も角。
規模が大きくなるほど、変数初期化は専用の初期化関数に任せたほうが保守性がよくなる。 規模が小さけりゃ、そんな変なマクロ使うまでもない。
>>210 ムリしてプログラムしなくてもいいと思うよ
ごめん、環境書くの忘れてたよ、
環境はVC6.0です。
>>212 の方法はエラーで弾かれました。
すこし状況を公開すると、
#ifdef GLOBAL_DEFINE
int hoge[3] = {1, 2, 3};
#else
extern int hoge[3];
#endif
こんなグローバル変数が大量にある。
ヘッダに書いてるので、ソース側の変更作業が発生しないような修正を施したい、というわけです。
修正する必要はあるの?
217 :
216 :2006/07/14(金) 00:55:03
ごめん、流れ読めてなかった。
>>216 確信をつかれました、結論から言うと、無いです。
過去から受け継いで受け継いでで半ば枯れたコードになりつつあるため、
触らないのが無難なのは分かってるんですが、
何か方法があるかなと思い質問してみたというわけです。
>>213 確かにそのとおりでしょう、そのうちコード整理をしてみたいと思います。
結論は出ました、有難うございました。
>>201 いまいち意味がつかめんが、
#include"stdafx.h"
#include<stdio.h>
#include<string.h>
#include<malloc.h>
int main(void) {
char str[3][256];
int i, j;
for (i = 0; i < 3 ; i++) {
for (j = 0; j < 256 && str[i][j] != '\n'; j++) {
str[i][j] = getchar();
if (str[i][j] == ',' || str[i][j] == '\n') {
str[i][j] = '\0';
break;
}
}
}
for (i = 0; i < 3; i++) {
puts(str[i]);
}
return 0;
}
こんなんじゃ、だめかな。あまりいいプログラムじゃないが。
>>219 はもちろん#include<stdio.h>
以外のヘッダはいらないです・・・(消し忘れ)
>>207 それはお前。お前が宿題スレから出るんじゃない。キチガイが多いなぁ、ここは、ったく。
222 :
デフォルトの名無しさん :2006/07/14(金) 03:42:09
#include<stdio.h> #include<stdlib.h> #include<time.h> struct card { int face; char *suit; }; typedef struct card Card; void fillDeck(Card *,int [],char *[]); void shuffle(Card *); main() { Card deck[40]; int face[] = {1,2,3,4,5,6,7,8,9,10}; char *suit[] = {"hart","daiya","kurab","superd"}; srand(time(NULL)); fillDeck(deck, face, suit); shuffle(deck); printf("baeojunnbisimasu"); return 0; }
223 :
デフォルトの名無しさん :2006/07/14(金) 03:44:39
void fillDeck(Card *wDeck,int wFace[],char *wSuit[]) { int i; for (i = 0;i <= 39;i++){ wDeck[i].face = wFace[i % 10]; wDeck[i].suit = wSuit[i / 10]; } } void shuffle(Card *wDeck) { int i,j; Card temp; for (i = 0;i <= 39;i++ ){ j = rand() % 40; temp = wDeck[i]; wDeck[i] = wDeck[j]; wDeck[j] = temp; } } ここからカードを5枚表示させてその数字の合計を表示する プログラムにしたいのですが どなたか教えていただけないでしょうか よろしくおねがいします
>>174 ,175
レス遅れました。
アドバイスありがとうございます!
昨日はエディターっていうのをゲットしましたよ♪
>>225 釣りじゃないなら頼むから初心者スレに行ってくれ。
ANSI-CでURIを解析する関数ライブラリってどっかに無いでしょうか? http URLからabsoluteURIからホストとポートを取得したいのですけど、
>>225 そうか
おれは昨日, Max OSXをインスコしたVMwareの仮想マシンをtorrentにてゲットしましたよ
プログラミング超初心者にオススメのC言語本ってなにですか? できればprintfとか以降でポインタぐらいから解説してくれてるのがいいです
>>230 ポインタからプログラミング始めるなんて猛者だな。
普通の入門書で問題ないと思う。
本屋に行って自分が一番読みやすいのを選ぶべし。
私的にはインターネットのウェブサイトにある解説でも、入り口としてはいいと思う。
>>231 ポインタまではどうにか理解できたんで
明日にでも本屋いってきます
ポインタまで理解できたのならあとはmanpageでも読めば済むだろ
>>230 オレはK&Rを一通りやったあとに
自分でviクローンを作ってみた
その後, Win32とGTK+でGUIをつけたり
2バイト文字対応とか
いろいろ機能を加えたりして
勉強したよ
やっぱり実践が一番じゃない?
K&R読んだだけでviクローン作れたら天才だな。
void SetPoint(int**,int,int*,int,int,int*,int*, int*,int*, int*,int*,int*,int*,BOOL); void SetPoint(int **num,int cps,int *numB,int way,int uWay,int *movX,int *movY, int *sotoMaxX,int *sotoMaxY, int *yobiX,int *yobiY,int *pntX,int *pntY,BOOL bl) { SetPoint(&num, 3, numB, 0, 3, &movX, &movY, sotoMaxX, sotoMaxY, &yobiX, &yobiY, &pntX, &pntY, TRUE); エラー E2034 D:\MyProg\game2\game7\game7.cpp 325: 'int ( *)[4]' 型は 'int * *' 型に変換できない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) ) エラー E2342 D:\MyProg\game2\game7\game7.cpp 325: パラメータ 'num' は int * * 型として定義されているので int ( *)[4] は渡せない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) ) ポインタのポインタとか指定したらわけわからんようになってしまいました。 どうすればいいですか?
まず引数の意味をひとつづつ説明してもらおうか。
>>236 int **pnum;
pnum = #
SetPoint(&pnum, 3, numB, 0, 3, &movX, &movY,
sotoMaxX, sotoMaxY,
&yobiX, &yobiY, &pntX, &pntY, TRUE);
239 :
238 :2006/07/14(金) 23:37:36
間違った ×int **pnum; ○int *pnum;
キャストしたらどうよ。
>>237-240 ありがとうございます。
けど肝心な事言い忘れました。num、numBは配列です。
SetPoint内のnumが多すぎて書き直せない状況なので、
ポインタを利用して打破できないかと思いましたが。
>>238 エラった。よく分かりません。ごめんなさい。
'int ( *)[4]' 型は 'int *' 型に変換できない
>>240 キャストってどうやってですか?
まず引数の意味をひとつづつ説明してもらおうか。
>>241 > けど肝心な事言い忘れました。num、numBは配列です。
型についてのエラーなのに、変数の型を明記してくれないで何をどうさせようってんだ?
配列です、だけじゃ全然わからん
すみません。 static int num[4] , numB[4]; 一応int型なんですが、 引数ひとつひとつ説明するより もう一つダミーの関数を呼び出してみたらこっちはエラー出ませんでした。 void SetPoint2(int **num) { *num[0] = 0; return; } よく分かりません。すみません。
245 :
238 :2006/07/15(土) 00:19:33
>>241 >num、numBは配列です。
それを先に言ってくれ。それなら
int *pnum;
pnum = num;
SetPoint(&pnum, 3, numB, 0, 3, &movX, &movY, ....
念のため聞くけどsotoMaxX, sotoMaxYも配列だよね。あと拡張子cppになってるけど
C のつもりで答えていいの? C++は知らない。
>>238 ありがとうございます!
テンパってて諦めかけていました。
そうです。sotoMaxX, sotoMaxYも配列です。
説明不足すみませんでした。
C++の意味は多分ないんでしょうけど、念のためそうしてます。
まだ未熟者で掟破りなコードですみません。
>>235 いや, K&Rだけを読んだだけでぱぱっとviクローンを作ったわけじゃなくて
かなり試行錯誤したよ
GUIつけた後, Small Cのインタプリタを組み込んで
今でも改良しながら使ってるよ
大変お見苦しいようですが、また質問させて下さい。
>>245 さんの通りにやってみたのですが、
関数内で*num[1],[2]を使ったらフリーズしてしまいました。[0],[3]はいいんですが、
はじめに0を代入したはずなのに、しかも[0],[3]の中身は乱れています。
たぶんnumがローカルになっているせいだと思うんですが、
ポインタだだけでなくnum配列自体を関数に受け渡す方法はないでしょうか?
あ、それができたら、そのまま配列使えばいいだけか。 スミマセン。
250 :
ひみつの検疫さん :2025/01/08(水) 05:25:36 ID:MarkedRes
汚染を除去しました。
>>248 >関数内で*num[1],[2]を使ったら
関数内でのアクセスは *num[1]じゃなく (*num)[1] でしょ。
その関数でint**を使う必要が本当にあるの?
無理して2重ポインタなど使わず設計を見直すことをお勧めする。いやマジで。
C言語では、二次元配列を関数に渡すことはできません。
一次元配列を渡すこともできないぞ。渡せるのはポインタだ。
まず引数の意味をひとつづつ説明しろ。
Set Point する関数になんで、movX とか movYとかいう 怪しげな引数が必要なのかは、確かにに聞いてみたい気がするな。
C言語の命令ばっかりを載せてる単語帳みたいな本又はサイトってありませんか? できるだけ小さくて薄いので
>>257 ないな。作ってもいいが、表紙と裏表紙だけで本文がないがな。
E2040 c:\Borland\Bcc55\include\winnt.h 5417: 宣言が正しく終了していない と怒られてしまいました。 //sort #include<stdio.h> #include<stdlib.h> #include<time.h> #include <windows.h> #include <mmsystem.h> #define N 10000 こいつのどこかに問題があるか、C以外の問題だと思うのですが、どうすればいいでしょうか。 処理時間を計測しようと悩んでいるのですが・・・。
>>260 スレ違い。BCCスレか環境依存OKスレ、初心者スレにでもどうぞ。
質問させてください。 char buf[100]; strlen(buf) と、sizeof(buf) って何か違いがあるのですか? 「文字列のバイト数を数えるのにstrlen使うな」と言われたのですが……
>>262 strlen()は、ヌル文字で終わっている文字列の長さを調べる関数。
sizeofは、変数や型の大きさを調べる演算子。
sizeof bufはいつでも100だが、strlen()は、中に入っている文字列によって変わる。
どのような開発環境で、どのような文脈でstrlen()を使うなと言われた
のかはわからんが、ヌル文字で終わっている文字列の長さを調べる
のにstrlen()を使うのは、ごく普通のこと。
>>262 逆にいうとヌル文字で終わっていない場合は暴走する。
strlenはたまに危険なので、暴走しないようにstrnlenというのもある。 ANSIじゃないかもしれないけど……。
'\0'を含むマルチバイト文字に使用しようとしているとか
'\0'を含むマルチバイト文字なんてあるの?
>>267 余裕である。つか、どうやってターミネートすると思ってるんだ?
269 :
268 :2006/07/16(日) 12:30:25
うは、誤読。取り消すorz
270 :
262 :2006/07/16(日) 12:52:43
みなさんありがとうございます。
実は、char buf[100]中にはバイナリデータが入る場合もある事を
書いていませんでした……
この場合、\0で抜けてしまうstrlen()じゃダメですよね。
おそらくそのミスを指摘されたんだと思います。
でも
>>263 さんの解説を見ると、sizeof()もダメな気が……
>>270 うん、全く駄目。
バイナリデータを扱うときには、そのデータをセットした人(関数)が、
データサイズを戻す必要がある。
普通は関数の戻り値でサイズを戻したり、アウトパラメータで戻したりする。
そうしないと、なにかの関数を呼んでそのバッファにデータがセットされても、
外部から何バイトセットしたのかはわからない。
初めまして。現在C言語を勉強しているのですが、malloc関数でつまずいてしまいました。 mainルーチン内でmallocを使う場合は、 int main() {
すいません。上の続きです。 int main() { int *x; x = (int *)malloc(sizeof(int) * 10); free(x); } みたいな感じで使うと思うのですが、メインルーチン内で宣伝したポインタ型変数xを サブルーチンに渡して、領域を確保する事はできるのでしょうか? void sub(int *x) { x = (int *)malloc(sizeof(int) * 10); } このようなサブルーチンを作って、メインルーチンでxに代入するとエラーが出てしまいます。 これの理由と、解決法を教えてください。 よろしくお願いします。
int *sub() { return (int *)malloc(sizeof(int) * 10); } x = sub(); もしくは void sub(int **x) { *x = (int *)malloc(sizeof(int) * 10); } sub(&x);
>>274 おお!出来ました!!
ポインタって難しいですね・・・もっと勉強します!
レスありがとうございましたm(_ _)m
277 :
デフォルトの名無しさん :2006/07/16(日) 17:58:40
ANSIって何ですか!?
ポール・サイモンのギター曲だ、名曲だぞ。
>>277 American National Standard Institute
米国規格協会
標準Cは最初にここで規格化されたので、それを指してANSI Cというわけだ。
280 :
デフォルトの名無しさん :2006/07/16(日) 21:04:16
>>279 なるほど。って、何かとアメリカ基準ですな・・・
>280 アメリカ製の言語なんで当然では?
ISOやJISよりANSIが先に仕様を決めて それをISOが取り込んだんだから当然
283 :
デフォルトの名無しさん :2006/07/17(月) 04:22:56
すいません。教えてください。 void func(const int *a){ printf("a=%d\n",*a);} int main(void){ int a=10; func(a); return 0; } のように、呼び出し元のポインタの内容を変えないことを補償するために、 constを付けることはよくやりますよね? 同じことを、ポインタのポインタを引数に持つ関数でやるには、 どうすればいいのでしょう? const int *a; int *b; なa,bに対して、a=b;は、問題なく出来るのですが、 const int **a; int **b; に対しては、a=b;は、コンパイラがエラーを吐きます。 const int **a; が、(const intへのポインタ)へのポインタだから、って理由は分かるのですが、その解決策が分かりません。 よろしくお願いいたします。
>>283 const int* const* a; にするとか const int** b にするとか、いくらでもあるんじゃないの?
何がしたいのかわからんのでどれが解決策になるのかわからんが。
285 :
デフォルトの名無しさん :2006/07/17(月) 04:48:15
すいません。具体性に欠けてました。 void func(int (*a)[10]){ /* aは、参照するだけ */ } int main(void){ int a[10][10]; func(a); } これを、 void func(const int (*a)[10]){} のようにしたいのですが、ANSI-Cでは許してくれないようなのです。
>>285 それは難しい問題だったような気がする。
C++ では int const a[][10] で通るみたい。
C だとそもそもポインターの型違いがエラーにならなかったような
覚えがあるんだが、なんてエラーメッセージが出るの?警告?
287 :
285 :2006/07/17(月) 05:14:40
gcc-3.4.4だと、 warning: passing arg 1 of `func' from incompatible pointer type で、警告です。 動作に問題は出ないだろうとは思うのですが、この警告何とか、 出来ませんかね?
288 :
デフォルトの名無しさん :2006/07/17(月) 05:27:54
>void func(int (*a)[10]){ これじゃ関数ポインタだし
289 :
285 :2006/07/17(月) 05:34:41
>>288 すいません。意味が分かりません。
aが、関数ポインタって意味ですか?
>>288 アホ。
>>287 呼び出し側をcastしてやればwarningは消せるが・・・。
void func(const int (*a)[10]) {}
main() {
func((const int (*)[10])a);
}
291 :
285 :2006/07/17(月) 05:51:45
>>290 有難うございます。
確かに、それでWarningは消せるのですが、ポインタのキャストなしでやりたいのです。
というものも、MISRA-Cという組込み世界のコーディング規約のようなものがあるのですが、
その中で、
・ポインタのキャストは駄目
・ポインタ演算は、+1(−1)するもの以外、使っちゃ駄目
・ポインタを引数にする関数で、ポインタが指す元の領域を書き換えないなら、constをつけろ。
というようなルールがあります。
何とか、これに沿ったものを作りたいと思ってます。
ただ、もしかしたら、int(*)[10]から、const int(*)[10]へのキャストは、例外として
認められるのかもしれませんね。
また、調べてみてから、報告したいと思います。
キャスト無しって・・・・・プロトタイプ宣言もしないアホウですか?
293 :
285 :2006/07/17(月) 06:36:57
>>292 ???
ポインタのキャストとプロトタイプ宣言が関係ありますか?
それとも例に挙げたコードが、プロトタイプ宣言していないから、
アホウ呼ばわりされてるんですかね?
>>290 MISRA-C対応のあるソースコードの静的解析ツールにかけたところ、
やっぱり駄目でした。2次元配列をあきらめた方がいいのかな。。。
>>285 よくわからないときにはtypedefするが吉。
typedef int hoge[10];
void func(const hoge *a);
int main(void){
int a[10][10];
func(a);
}
>>294 同じwarningです。gcc3.4.2(MinGW) Cモード(gcc.exe)
C:\Documents and Settings\****\My Documents\MinGW\Learn5\intconst2.c: In function `main':
C:\Documents and Settings\****\My Documents\MinGW\Learn5\intconst2.c:11: warning: passing arg 1 of `func' from incompatible pointer type
結局Cでは警告を防げないのか。
typedef const int boke[10];
>>297 俺個人の意見だけど、理由がわかっていて危険ではない事も調査済みなら
ワーニングを放置するのはありだと思うが、素直にキャストしたほうが
無駄にエネルギー使わなくてすっきりすると思う。
299 :
272 :2006/07/17(月) 13:02:57
>>275 レス遅れてすいません。
動いたけど、理解は出来なかったのでいろいろ試行錯誤してたいだい理解したので、
今度は、ポインタのポインタ(2次元配列もどき)の領域を確保しようと試みているのですが、
はやり、理解が浅いせいかうまくできません。
void sub(int ***x)
{
int i, j;
*x = (int **)malloc(sizeof(int) * 10);
for(i=0;i<10;i++)
*x[i] = (int *)malloc(sizeof(int) * 3);
for (i=0;i<10;i++) {
for(j=0;j<3;j++) {
*x[i][j] = i*j;
}
}
}
int main()
{
int **x;
sub(&x);
// 表示処理x[][];
}
今の自分の知識では上のような感じなんですが、エラーがでてしまいます。
よろしくお願いしますm(_ _)m
>>299 たぶんこうだと思う。
void sub(int ***x)
{
int i, j;
int y = 10, x = 3;
*x = (int **)malloc(sizeof (int*) * y);
for(i=0;i<10;i++)
(*x)[i] = (int *)malloc(sizeof (int) * x);
for (i=0;i<y;i++) {
for(j=0;j<x;j++) {
(*x)[i][j] = i*j;
}
}
}
>>300 おいおい「たぶん」で書かないでくれよ。
必死こいてテストコード書いてたんだからさOTL
合ってるんだけどね。
今回は*と[]の優先順位の問題だね。
>>299 >>1 > エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
303 :
299 :2006/07/17(月) 13:21:15
>>300-301 ありがとうございますm(_ _)m
仰る通り優先順位の問題だったみたいです。
初歩的な所からやり直さないとだめみたいですね・・
それにしても、この住人の方々は凄いです
自分はこのプログラムで数時間悩んだというのに、数分で解決してしまうなんて。
尊敬しますm(_ _)m
>>302 すいません。以後気を付けます。
今回のは、OSのエラー?(問題が発生したため〜)だったのでエラーと書いただけで省いてしまいました。
>>297 C99 の規格読んだが gcc の解釈は正しい。もしくは規格の規定が悪い。
gcc 使えるんなら C++ でコンパイルしちゃえばいいんじゃないかな?
305 :
285 :2006/07/17(月) 13:45:23
みなさん、有難うございます。 MISRA-Cも、明確な理由をつけることによる、ルールの逸脱は 認めているので、 「int (*a)[] から const int (*a)[] への(キャスト無しでの)変換は ansi規格で認められていない。」 という理由により、キャスト(もしくはWarningを無視)で、 大丈夫だと思います。 もしかして、私が知らないだけで、何らかの手があるかもと思い、 質問させて頂きました。 有難うございました。
306 :
デフォルトの名無しさん :2006/07/17(月) 20:22:24
微妙にスレ違いかもしれませんが… gccのエラーメッセージの日本語化をしたいのですが、 出力されたエラーメッセージから日本語に変換するためには どうすれば良いのでしょうか。 お願いします。
>>306 環境変数LANGなど。詳しくはgccのスレで聞け。
タブのつもりですか?
310 :
デフォルトの名無しさん :2006/07/18(火) 21:13:11
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2392.txt 実行後に標準入力からコマンドを入力し、そのコマンドをgetcl関数でスペース毎に
argmv[0],argmv[1]...に格納し、exec_one_command関数で実行。
その中にパイプがあればパイプの処理をするという仕様です。
自分でやったところはexec_one_command内でgetclでできたコマンドからパイプを
見つけてそれをNULLに置き換え、パイプの数に応じてexecvpで実行していくという
ところです。 実行してもパイプの処理になった場合にエラー終了してしまいます。
どのようにすれば繋いでいくことができるのでしょうか?
他のスレ回ったのですが、スレ違いっぽい内容だったのでお願いします。
311 :
デフォルトの名無しさん :2006/07/18(火) 21:31:56
linuxのソースで見かけたコードなんだが、 struct hoge { ・・・ void *foo[0], } で、malloc(kmalloc)するときに sizeof(struct hoge) + foosize分をallocateして サイズを自由に変動させるような実装がある。(メンバfooにfoosize分の領域が割り当たる) こういうのはANSIで認められてる? それともGCC拡張?
>>311 C99で導入された。
でも元はgcc独自拡張だったような気がしなくも無い。
>311 昔のDOSでもあったというかやってた。でもvoid *foo[0]じゃなくchar *foo[1]だったな。 これで(可変長の)文字列の長さ分を足したサイズをアロケートすると'\0'の分も確保される。
314 :
デフォルトの名無しさん :2006/07/18(火) 21:43:03
>>311 これが出来るのは2つ以上のメンバを持っていて、
なおかつ最後のやつだけ。
hogeは配列には出来ない制限がある。
316 :
デフォルトの名無しさん :2006/07/18(火) 21:55:49
>>310 あのさあ、C/C++系のスレは巡回してる人がかなり重複してるから、
スレ変えても今のままだと回答来ないよ。
知りたいことを最小限のコードで書いてみて疑問点を質問するとか。
「全く分かりません」であるなら却下。
318 :
デフォルトの名無しさん :2006/07/18(火) 22:40:56
間違いを教えて下さい!! アルファベット文字からなる文字列(31文字以内)を入力すると 全部大文字にして出力させる。 [例]入力 AbcDeFGHijk → 出力 ABCDEFGHIJK #include<stdio.h> main() { char moji[31]; int i=0, n=0, m=0; scanf("%30s", moji); while(moji[n]!='\0'){ if('a'<=moji[i] && moji[i]<='z'){ m=moji[i]-32; } else{m=moji[i];}m++; i++;} putchar(m); }
突っ込みどころが多くて何とも・・・。 ・ n はどこから来てどこへ行くのか ・ putchar が while の外に ・ m++ って?
#include<stdio.h> main() { char moji[31]; int i=0, n=0, m=0; scanf("%30s", moji); while(moji[n]!='\0'){ if('a'<=moji[i] && moji[i]<='z'){ /* m=moji[i]-32; */ m=moji[i]-'a'+'A'; } else{ m=moji[i]; } putchar(m); /* m++; */ i++; } /* putchar(m); */ }
321 :
310 :2006/07/18(火) 22:48:39
>>317 for(i=0;i<cmdnum;i++){
if ((pid = fork()) == 0){
if(n-->1){
pipe(fd);
close(1);
dup(fd[1]);
close(fd[1]);
close(fd[0]);
}
if(i>0){
close(0);
dup(fd[0]);
close(fd[0]);
close(fd[1]);
}
if (execvp(argmv[pl[i]], argmv) == ERR) {
perror("execvp");
exit(1);
}
} else if (pid >= 1) {
wait(&status);
} else {
perror("fork");
exit(1);
}
}
具体的にはこの部分なのですが、cmdnumはパイプで区切られたコマンドの数で、plにはパイプの
場所が格納されています。このまま実行すると2つ目以降のコマンドが繋がらなくてエラーが起こって
しまうのですが、closeやdupなどのところでおかしいところなどが見つかりましたらお願いします。
322 :
デフォルトの名無しさん :2006/07/18(火) 22:49:08
すいません!! 一応通るんですけど、 イマイチわからないんです……。
>>320 whileのmoji[n]をmoji[i]に。
>>321 アホ。
最小限のコードというのは「抜き出したコード」じゃなくて、コンパイル・実行
可能なコードのことを言うのだ。
>>321 例えば一つ目のコマンドがlsで、二つ目のコマンドがgrepなどと決めうちして
コードを書いてみて、どこでどのようなエラーになるのか質問しろ。
326 :
デフォルトの名無しさん :2006/07/18(火) 23:06:42
ありがとうございます!! ちゃんと出力されました☆
つーか、pipe()はスレ違い。 #あ、close(), dup()もそうか。
329 :
310 :2006/07/18(火) 23:37:26
>>329 続きはUnixプログラミングスレで。
少なくともexecが成功するコードで質問してね。
331 :
デフォルトの名無しさん :2006/07/19(水) 00:00:11
某書の覆面算をするプログラムを丸写しした(はず)なのですが、 SEND+MORE=MONEYで解が1つはあるはずなのに解なしになってしまいます。 ちょっと点検していただけませんでしょうか? あと、このプログラムが一体何をしているのか、解説していただけたら嬉しいです。 よろしくお願いします・・・ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> enum {FALSE, TRUE}; #define N 10 int imax,jmax,solution,word[N][128],digit[256],low[256],ok[10]; void found(void) { int i,j,c; printf("\n解 %d\n",++solution); for(i=0; i<=imax; i++) { for (j=jmax; j>=0; j--){ c=word[i][j]; if (c!='\0') printf("%d",digit[c]); else printf(" "); } printf("\n"); } }
丸写ししたんなら宿題スレにまるごと貼ればいいのに、とおもう
333 :
310 :2006/07/19(水) 00:05:07
あ、パイプ以前の問題が見つかったので聞きたいのですが、 execvpなどで配列の最初からではなく、途中からそれ以降を実行するような ことは可能なのでしょうか?
>>333 あのねぇ、UNIXプログラミングスレでも相手してもらえなくなるよ。
素直にいけよ、糞ガキ
文字列配列を関数の引数に引き渡す方法を教えて管足。お願いします。
>>335 それぐらい自分で書け。それでわかんなかったらコードを添えて相談しろ。
できるだけ短くまとめようと思ったんですが、 BOOL LoadEveFile(char *strFile , char **mainCode) { LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { LPSTR mainCode[256]; LPSTR *pMainCode; pMainCode = mainCode; LoadEveFile("map.txt" , pMainCode); : pMainCodeを渡すとmainCode自体は引き渡せないので困っています。お願いします。
>>337 char* xxx[256];
xxx[0] = mainCode[0];
...
LoadEveFile("map.txt", xxx);
#include <stdio.h> int c; int T(int n){ int i,tmp=0; if(n==0) return 0; else{ for(i=0; i<n; i++) tmp += T(i); return (tmp*2/n + c*n); } } int main(void){ int n; do{ printf("c = "); scanf("%d", &c); }while(c<=0); do{ printf("n = "); scanf("%d", &n); }while(n<0); printf("T(n) = %d\n", T(n)); return 0; } というプログラムで、c=1と入力し、nに100以上の数字を入力すると、 処理にものすごく時間がかかってしまうのですが、短い時間で処理できるようにするにはどうすればいいですか?
T(n) = {T(0) + T(1) + T(2) + ... + T(n-1)} * 2 / n + c * n を解くんだな。 T(0), T(1), ... をいちいち再帰で求めないで、配列に入れていけば速くなる。 あと、数学的に解いて公式もとめて突っ込めばもっと速くなる。
342 :
337 :2006/07/19(水) 12:33:19
343 :
デフォルトの名無しさん :2006/07/19(水) 13:52:51
int n; struct *a; a = malloc( ); ここで、a に n だけ割り当てたいのですが、どのようにすればいいのでしょうか? カッコの中身をいろいろ試してもうまくいかないので。(sizeof(struct)*n) など・・・
344 :
デフォルトの名無しさん :2006/07/19(水) 13:53:44
はじめて書き込みします。 C言語でUnixTimeを日付時刻に変換するような関数があると聞き、dateaddという関数を見つけたのですが使い方がよくわかりません。 戻り値 = dataadd(第1パラ , 第2パラ , 第3パラ); という書式らしいのです。 VBでの記述は多々みつかるのですが、Cでかかれたものが見つからなくて。。 なにか手がかりでもよろしいので、お力をお貸しください。 お願いします。
345 :
デフォルトの名無しさん :2006/07/19(水) 13:58:29
ごめんなさい。 つづり間違えました。 dateadd です。
347 :
デフォルトの名無しさん :2006/07/19(水) 14:03:55
346さま、ありがとうございます。 やってみます。 助かりました。
>>343 struct *a;って何ですか?
> struct hoge *a;
> a = malloc(sizeof *a * n);
>> 344
Unixにはdateaddなんていう関数はない。それはWin限定で使えるAPI
locatetimeとtm構造体を調べてみろ
349 :
343 :2006/07/19(水) 14:40:27
>>348 配列を構造体で定義したものです。
たとえば、
struct char* hoge;
a[0].hoge = "ABC";
a[1].hoge = "abc";
と言った感じに代入は行われるみたいです。
343: struct *a; 348: struct *a;って何ですか? 348: > struct hoge *a; 343: 配列を構造体で定義したものです。 軽くイラッと来た。
351 :
343 :2006/07/19(水) 15:35:48
typedef struct { char* key; } elementtype; #define MAX 1000 elemenntype b[MAX]; a と異なる配列はこのように定義されているのですが、私の説明は間違っているのでしょうか?
断片的に書かれても、わけ分からん。
絶望的にプログラミングに向いてないやつって、いるよね
Hello,C Worldからいきなり構造体へ飛んだみたいな人だな
やりたいことはなんとなくわかるが、理解させる自信がない
359 :
351 :2006/07/19(水) 16:50:11
問題は構造体じゃないんです。mallocなんです! #define N 10000 struct a[N]; とすると、作業領域を10000だけ確保しているわけですが、これを動的にmallocを用いて確保したいんです。
いいからお前はまず、構造体の配列を使ったプログラムをコンパイル成功させろ コンパイル成功したらそのソースをここでさらせ
>#define N 10000 >struct a[N]; コンパイルして見ろよ、これ。
362 :
デフォルトの名無しさん :2006/07/20(木) 10:02:35
ファイルが作成された日時を取得する方法を教えてけろ。 linux なら ls -l で表示される情報 DOS なら dir で表示される情報 です。よろぴく。
きっと脳内言語だからコンパイラは無いんだよ
365 :
デフォルトの名無しさん :2006/07/20(木) 10:56:54
>364 Thank you.
366 :
デフォルトの名無しさん :2006/07/20(木) 16:19:18
すみません教えてください 授業の問題なのですが、 問_整数 a,b を直角三角形の直角を挟む2辺とするとき、a,bを入力したとき、斜辺の長さと面積を表示せよ。 #include <stdio.h> #include <math.h> void main(void) { int a,b; double c; printf("2辺の値を入力する。\n");scanf("%d,%d",&a,&b); c=a*a+b*b; c=sqrt(c); printf("三角形の斜辺の長さは %lf 面積は %f です。\n",c,(float)(1.0*a*b/2)); } 最後の行の、(float)(1.0*a*b/2));の意味が分からないんです。 教えてくださいm(__)m
演算した結果をfloat型にcastしているだけだが、casrする理由は知らない %fは別にdouble型で出力可能だし演算結果はdouble型になるんで冗長なcastだな
368 :
デフォルトの名無しさん :2006/07/20(木) 16:55:42
>>367 レスありがとうございます
もうちょっとだけお願いします><
(1.0*a*b/2)ってどうすれば思い付くんでしょうか。特に1.0が気になります
すごく初歩的な質問ですみません
>>368 式に一つでもdouble型がある場合、double型になることを利用しただけ
# 正確な式の型の繰り上げ規則は調べてくれ
a*b/2だとint型になってしまう為、小数点以下が切り捨てられてしまうから
1.0というdouble型の数値を入れることによって結果をdouble型にしたんだろう
でも、a*b/2..0の方が綺麗だと個人的には思うけどな
370 :
デフォルトの名無しさん :2006/07/20(木) 17:37:44
>>369 分かりました!
ありがとうございますm(__)m
>369 a*b/2.0 と 1.0*a*b/2 は a*b が int の範囲に収まらない場合、挙動が違うんじゃね?
floatにキャストしたり%lfなんてやってたら、おれ絶対先生に突っ込んじゃうだろうなあ・・・ 上げ足取りなのかもしれんけど
>>371 前者はintで掛け算が行なわれるから結果が異なるね。
まぁ、(double) a * b / 2でいいとも思うが。
「&配列名」は、「配列名」や「&配列名[0]」と同様に配列の先頭アドレスが 取れるようですが、これはANSI Cで認められているのでしょうか?
>>374 型が違う。
int a[10];とあったとき、
aや&a[0]と言った式ではint*型の値になるが、
&aではint (*)[10]型の値になる。
378 :
374 :2006/07/21(金) 16:46:53
>>375 なるほど、そういう違いがあるんですね。ありがとうございます。
で(^^;)、ソースコードの汎用性を考えた場合、
char a[10], b[10];
memmove(&b,&a,10); //aをbにコピー
は
memmove(b,a,10);
に変えておいた方がいいのかどうか、が気になっております。
自分的には変更の可能性がある場合&を付ける 変更の可能性が無い場合は付けないと区別している あくまで個人の趣味であり、押しつけるつもりはない
>>375 a の型はまぎれも無く int [10] だぞ。
int* に暗黙にキャストできるというだけであって。
sizeof a とか考えてみそ。
setvbufでバッファがセットされるとき、それ以前に使われていたバッファはどうなるんですか?
ちょっとした知識を披露したかったんだろうが、とんでもない無知をさらけだした例。
if(!isdigit(atoi(smb))) これchar型のsmbに数値が入っていて、それをintに変換、10進でなかったら実行ってことですよね。 atoiで数値にできるのに実行してしまうんですが、何でですか? お願いします。
あ、もしかして0は!の対象じゃないってことか
あ、でも違うな。誰か教えてください。
文字列smbで表される数値が'0'〜'9'か調べてる
>>392 char smb[] = "1";
printf("%s\n" , smb);
仮置きしてみたんですが、これじゃ駄目みたいです。
c = getchar( );
で直接入力したらうまくいきました。
if (isupper(c)) /* 英大文字なら */
printf("英大文字です。");
else if (islower(c)) /* 英小文字なら */
printf("英小文字です。");
else if (isdigit(c)) /* 数字なら */
printf("数字です。");
else if (isspace(c)) /* スペースなら */
printf("スペースです。");
else /* 上記のいずれでもなかったら */
printf("何かわかりません");
これを使って検証したんですが、ためしにcに数値を入れたら、elseのケースになってしまいます。
何か重大なミスしてる悪寒。
'1'と1は違う
>>394 ありがとうございます。
ああ、そうか。
ってことは前述のコードはatoiに文字列渡したのがまずかったわけか。
>>389 isdigit()の引き数は文字、atoi()の戻り値は数値、全く噛み合っていない。
>392は釣りかネタ。
atoi()の引き数は文字列。
>>397 ああ、そうだった。
今気づいて戻ってきました。
つまりいらないわけですね。
すみません。
>>398 bool evalAtoi(long * val, const char * buf)
{
if (val == NULL && buf == NULL) return false;
char * end;
* val = strtol(buf, & end, 0);
return * end == '\0';
}
文字コードがASCIIなら smb="48"から"57"で isdigit(atoi(smb))は真になる 48が文字'0'で57が文字'9'な
と思ったけどsmbがchar型とか言ってる時点でなんか全然違うことを考えてるな エスパースキル足りなかった
403 :
デフォルトの名無しさん :2006/07/22(土) 11:36:10
ファイルサイズを正確に調べたいのですが、 lseekでファイルの末端までいってftellで取ってきた値が そのままファイルサイズになっちゃったりしますか? ほかにもっといい方法があればご教授お願いしたりします。
>>403 ファイルシステムとかに思いっきり依存するので、C言語固有の
方法はない。例えば
>>403 の方法ではintとかunsignedの大きさに
制限されてしまう。
405 :
デフォルトの名無しさん :2006/07/22(土) 11:54:41
>>404 どういう意味なの?
ftellで返ってくる値が1バイトとは限らないって意味なのなの?
freadで読み込んでいけば確実でせうか?
>>405 時間が掛かるけど、バイナリモードで開いてfget()当たりで1バイトずつ
カウントしていけばいいかもしれんね。
>>404 は、C言語固有の方法を使うよりも、OSのAPIを使った方がいいと
いう事。
×fget() ○fgetc()
例えばさ、ftell()の戻り型は、longじゃん。 もし、ファイルシステムで表せるファイルの大きさがlongで表せる大きさを 超えていたらどうなる?ftell()じゃあ正確に調べられないだろ。 身近な例ではNTFSとかな。
stat()の類でわかるけど 標準Cではないって事
410 :
405 :2006/07/22(土) 12:09:52
なるほどです。勉強になりました。 とりあえずバイナリモードで開いて実際に読み込んでサイズ見ていきます。 でもgetcでみなきゃだめですか? freadで1024バイト単位ぐらいで読み込んでいきたいんですが・・・
>>410 そこら辺は任せる。要するにカウンタがオーバーフローしないで
調べられればそれでいい。
412 :
405 :2006/07/22(土) 12:34:59
>>411 うぃっす。了解です。ありがとうございました。
z=100; x = (char *)malloc(sizeof(char)*z); この時にポインタxからzの数値を求める方法ってありますか? sizeofでいけると思ってたのに無理でした。
_
構造体を使うといいかも struct { int size; char *buf; } x; x.size=100; x.buf=malloc(sizeof(char)*x.size);
>>416 あーなるほど。
でも残念な事にやろうとしてたのが、xを関数に渡して
関数内でデータをあれこれするのにどれだけメモリ確保したか
知りたかったんですよ。
大人しくzを引数で渡した方が簡単そうですね。
だから引数で構造体をやりとりしろよw
>>409 stat()って一般的に64ビットイントになってたっけ?
そうでないならfseek()+ftell()でも同じようなものかもしらん。
いずれにしても、標準Cでは手段がないことには同意。
fgetc()で終わるまで読もうと思ったら実はキャラクタデバイスで、
いつまで経っても終わらなかったりするかもしらんし。
型 off_t を使う。これは 32 ビットアーキテクチャ上では 32 ビット符号付き型である。ただし、 #define _FILE_OFFSET_BITS 64 を定義してコンパイルした場合は 64 ビット符号付き型である。
Windowsなら_stat64とか_lseek64とか
ソースを複数に分けてプログラムを書くときは、グローバル変数を使うと、 引数などをいちいち書く必要が無くなるし、見やすいような気がするのですが、 グローバル変数はあまり使わない方が良いんですか? ローカル・グローバル変数のメリット、デメリットなどあれば教えてください。
その釣りツマンネ
ポインタが理解できたら急にCが面白くなった
fpos_t自体が実装依存で 中身が何であるか(整数なのか構造体なのか)全く規定されていない上 fgetposとfsetposでの使用しか保証されていないから。
fseekのI/Fが悪いって事で せめてsize_tで移動できたらよかったのに
あ、それじゃ戻れないか ssize_tとかで
質問させてください。 20あるデータのうち0.3の割合で1、0.5の割合で2、0.2の割合で3を含んだデータを生成したいのですが、うまい表し方が思いつきません。 思いついた方法は ・1を6つ、2を10つ、3を4つと普通に配列にデータを代入する ・0〜1のランダムな値を出し、ランダムな値が 0 <= random < 0.3 なら1 0.3 <= random < 0.8 なら2 0.8 <= random < 1 なら3 を配列に代入する という方法なのですが、どちらもいまいちぱっとしない気がします。どなたかうまい表現方法、あるいは確率分布データを生成する正統派な方法等ご存知の方ご教授願います。
1、2、3のデータを割合分だけ作ってその他のデータとランダムに混ぜるくらいしか思いつかん
>>430 2つ目の方法だと、たまにしか割合がきっちり 3:5:2 にならないが、それでもいいの?
いまいちどんなデータを作りたいかが分からん
433 :
430 :2006/07/24(月) 00:17:00
>>431 ,432 わかりにくい説明に付き合っていただきありがとうございます。
統計で使うデータを作りたいと思いまして、かんたんなサンプルデータとして、3:5:2でそれぞれの値を含んだデータをプログラムに作成させようというものです。それでc言語で確率を用いてデータ処理をしている例がみつからなかったので質問させていただきました。
>>430 十分に要件を満たしうる方法について、「いまいち」とか「ぱっとしない」なんて答えしか出せないなら、
どんな方法を出してもそんなこと言われそうで答える気がしなくなる。
>>433 なにが障害になってるのか、やっぱり分からない。
それでいいじゃんっていう気がする。
もしかして、値・発生確率・項目数などを自由に変えられるような
汎用性のある関数を書きたいということ?
>>430 1つ目の方法と2つ目の方法じゃ得られるデータの性質が明らかに違うやん
20個のデータの中に必ず、1が6個、2が10個、3が4個、現れるようにしなければならないの?
そういうシャッフルをしたいならたくさんやり方あるね
てか、統計ってそういうもんじゃないよね・・・
>>430 「どちらもいまいち」って事は、それ別々の方法として例示してるんだよね?
前者の方法は、何より「10つ」が気になる…のは置いといても、
ランダムでなければそれでいいんじゃないか?
後者の方法は
>>432 も指摘しているように、3:5:2にはならん。
「いまいちぱっとしない」以前の問題。
う〜ん、どれもいまいちぱっとしないなあ〜
439 :
430 :2006/07/25(火) 03:36:22
>>434-437 皆様、鋭い指摘ありがとうございます。
たしかに後者の方法は常に同じ割合にならないのですが、前者に比べると作為的でないというかなんというか説明しにくいですがそんな理由で考えました。
3:5:2という割合になるようにしたいのでやっぱり前者が適していると思うのですが、なんか作為的な感じがして…
これ以上はアルゴリズムの話題になりそうなのでやめますね。皆様おつきあいありがとうございました。
超基本的なDQN質問です。以下のようなコードがあったとして、 data[0] にアクセスするのは安全なのでしょうか? 要点は *a は自動変数で消滅してしまうけど、*a の指しているアドレスにある "nullpo" という文字列はいつまでも残っていますか? という感じです。 それとも、*a も malloc してあげないとダメなのでしょうか? ちなみに以下では malloc は失敗しないものとして解釈してください。 #include <stdio.h> #include <stdlib.h> int main(void) { char **data = NULL; data = set_data(data); puts( data[0] ); return(0); } char **set_data(char **p) { char *a = "nullpo"; char *b = "damepo"; (char **)p = malloc( 3 * sizeof(char *)); *p[0] = *a; *p[1] = *b; *p[2] = NULL; return(p); }
うわ、なんだこれ。少しミスりました。以下でお願いします。 #include <stdio.h> #include <stdlib.h> int main(void) { char **data = NULL; data = set_data(data); puts( data[0] ); return(0); } char **set_data(char **p) { char *a = "nullpo"; char *b = "damepo"; (char **)p = malloc( 3 * sizeof(char *)); p[0] = a; p[1] = b; p[2] = NULL; return(p); }
全く問題ない
(char **)p このキャストは不要、むしろ邪魔。
*aなんて変数はない。あるのはあくまでもaだ。
446 :
441 :2006/07/25(火) 10:18:16
>>442 速攻レスありがとうございます!他の方の意見も聞きたかったので
お礼が遅れてしまいました。
>>443 そうですね。返って来るのは void * ですし、char **p と宣言して
いるから不要ですね。ご指摘ありがとうございます。
>>444 キーワードまでありがとうざいます。さっそく見て来ましたが、
自分の考えていた通りなのが分かって良かったです。
>>445 はい。*a ではないことは分かっていたのですが、a だけだと
どこに書いてあるのか分かりづらいと思ったので、あえて *a と
表記しました。でも紛らわしいですね。すみませんorz
以上であります! とってもありがとうございますた。
だれか printf (const char*, ...); の実装を教えてください。 第二引数以降ってどうやって処理されてるのかがわかりません
stdarg.h
449 :
447 :2006/07/25(火) 14:05:47
448サンてばステキ!どうもありがとう!
450 :
デフォルトの名無しさん :2006/07/25(火) 18:56:00
typedef struct { int a; } elementtype; void binary(int n) { elementtype *x; x = malloc(.....); ... } このような関数で x を動的に確保したいのですが、malloc(); をどのようにすればいいのでしょうか? (配列をx[10000]のように定義せず、x に n だけ割り当てる)
x = malloc(sizeof (elementtype) * n); if (x == NULL) { /* どうしよう */ }
"←などの文字でchar型を初期化する時は、 char a[128] = {'"', '\0'}; 等のように、ひとつずつ囲むしかないのでしょうか? char a[128] = {"""}; みたいにするとエラーが出ます。
\"
printf("%d", n1, n2); と書いた場合、 n2は無視されることが保証されますか?
普通無視される。でも後遺症が怖いよ。
>>453 キーワード:C言語 エスケープシーケンス
458 :
453 :2006/07/25(火) 19:38:23
>>454 ,457
ありがとうございますm(_ _)m
>>460 スタックに乗るだけで、後にも先にも問題ない。
abortってなんか変わった? 環境変えたらmake通らなくなったでよ。 abort(1)って引数入れちゃ駄目なのかしら。
>>462 だめ。
ANSI Cのabortは引数を取らない。
>>463 即レスサンクス
前任者が全部引数居れてやがって全部直さんと駄目かorz
逆に全部あるんだったらこういうのはどう? #define abort(...) abort() 可変個引数なマクロを扱えないんだったら、...をxにでもすればいいけど、 暇なときに少しずつ直していくということができない。
スクリプト組んで一気に直しちまえ
>>465 ,466
ライブラリだけdefine切ったものでこっそり先に作って
時間あいた時に直す事にしますわ。
レスありがd
abort(i++); とかあったりしてw
ありそうでコワス
470 :
前任者 :2006/07/26(水) 01:25:33
そんな風に中で処理はしませんよ。 後始末関数を呼んでabortするだけですから。
>>470 おまえかっ
ってかコンパイルオプションきつきつにしないと駄目っぽくて
余計な警告出過ぎでやる気が無くなっt(ry
取り合えず明日に備えて寝ますわ
ちょっと笑って元気が出た
ありがd
>>468 #define abort(x) ((x), abort())
でどうよ。
char*型を「もしmallocでメモリ確保してなかったならば」という文にしたいんですが、 どうすればいいですか?
476 :
デフォルトの名無しさん :2006/07/26(水) 08:11:06
常套手段で char* pc = NULL; pc = malloc(100); ・・・ if (pc == NULL)
>>474 はメモリ確保した手段が何か知りたいのかと思われ。
きっと、char *を受け取った関数でその領域を解放すべきか判断したいのではないかと。
で、環境に依存せずにそんなことはできないので別の手段を考えろ、と。
>>477 dです。
>>478 ごめんなさい。説明不足でした。
freeすべきかどうか調べる方法迷いましたけど、フラグ使ってましたw
480 :
C言語超初心者 :2006/07/26(水) 17:16:15
ax^2+bx+c=0 のa,b,cを任意に入力したときのxの解を求めるプログラムを作りたいんです。 誰か教えてくれませんか?
481 :
C言語超初心者 :2006/07/26(水) 17:18:52
ちなみに解に虚数iが出る場合とかに分けなきゃいけません
誰かこの問題を実装してください。
↓
http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H18a2/pm10.html 再帰構造体って、どーやって宣言すりゃいいの?
typedef struct letter {
char c; /* 英単語を構成する文字 */
struct letter *follow; /* この文字に続く文字へのポインタ */
struct letter *other; /* この文字に代わる別の文字へのポインタ */
char *trans; /* 訳語の文字列へのポインタ */
} LETTER;
LETTER *p_root;
って宣言してたらmainにはどーやって書いたらいいのか??
>>484 東京理科大の先生に聞け
メールで俺からも頼んでおこう。
>>484 連結リストでググれ
というかデータ構造とアルゴリズム勉強しろ
ググったけどわからん!! とりあえず、 char *trans_test[6]={"男、人間","主な","郵便物","電子メールソフト","名前"}; とは書いてみた。 その他がヽ( ´ー`)ノ
興味があるだけなんですが、char の配列に機械語入れてそれを実行(jmp する) したい場合、どうすればいいのでしょうか? JIT とかってこれと似たことしてるんですよね?
Cの範囲ではできないと考えていい。
そこでgets()で以下略ですよ
バッファオーバーランを使って実行させるやりかたは知ってるけど、 まっとうなやり方は知らない。
糞団子にでも聞いて来い。
>>498 ということは、スタックのレイアウトを仮定した上でリターンアドレスの書き
換えを行うことになるのでしょうか?
; 一般的に JIT 書くときどうするのか気になたもので...
>>493 まぁスレ違いだな。
ということで、>498に期待。
>>488 その配列変数をaとすると、((void (*)())(intptr_t)a)()で行ける環境がそこそこある。
ANSI Cの規格合致プログラムではなくなること請け合い。
その配列の最後には呼び出し元へ戻る命令を入れておいてね。
ま、機械語という時点で処理系依存バリバリになってしまう char のポインタを関数ポインタに無理矢理キャストして関数を呼ぶとか
めんどくさいからksk
498 :
デフォルトの名無しさん :2006/07/27(木) 15:50:15
>>486 どうやら連結リストではなくトライ木らしいですよ
499 :
ど素人 :2006/07/28(金) 02:11:38
前期の追試です。この2問に単位がかかっています。ぜひ、お願いします。 2.通常プログラムカウンタはプログラムの実行にしたがって一定の大きさだけ増えていく. しかし,時に,プログラムカウンタに直前の値とは大きく異なる値がセットされる 時がある.それはどんな時か? 3.次のプログラムは何を行うプログラムか.簡単に説明しなさい.また, 結果を得るまでに,A[k]==aの比較が行われた回数を書きなさい. A=new Array(3, 8, 19, 20, 22, 24, 45); i=0; j=A.length-1; a=19; k=Math.floor((i+j)/2); while(i<=j){ if(A[k] == a){ break; } else if(A[k] > a){ j = k - 1; } else{ i = k + 1; } k = Math.floor((i+j)/2); } if(i>j) k=-1; document.write(a," ",k);
試験のとき問題文も読まない奴は落第すること請け合いだな > GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は > 専門の別スレッド↓があるのでそこへさようなら。
Javaかよ
>>499 板違い
>>501 おいおい、これがJavaコードに見えるなら一度眼科に行った方がいいぞ
JavaScript かな。
document.writeがキメテです
Cじゃ無いことだけは確かだな
A.lengthやMath.floor()は?
Javascriptだろ。
a = 1; if (a < 2 && a > 0) { }else{ } elseの中の処理をelseを使わずにやりたいのです。 a > 2 && a < 0という書き方ではなく別の書き方はありますか? !=みたいな・・・・
>>509 意味が分からんが != じゃだめなの?
a が整数型だと仮定しての話だけど
ついでに a > 2 || a < 0、な
int a = 1;ならswitchとか
>>509 if(!(a < 2 && a > 0)) {}
>>510 おいおい、a==2とa==7のとき死ぬだろ。
514 :
509 :2006/07/28(金) 21:42:39
みなさんいろいろありがとうございます。
私がしたかったのは、
>>512 さんのやつでした。
助かりました。
説明が下手で申し訳ありませんでしたm(_ _)m
515 :
デフォルトの名無しさん :2006/07/31(月) 17:03:03
char s1[],s2[],のとき、 strcpy(s1,s2); と strcpy(&s1,s2); って同じですか?
>>515 strcpy(&s1, s2);はコンパイル時に警告が出ると思うぞ。
s1はchar配列の先頭要素のアドレス、
&s1はchar配列のアドレス、
が得られる。結果は置いておいて、それの意味するところは違う。
string.hで定義されているstrcpyのプロトタイプで求められている引数は
char配列の要素のアドレスだ。
>>515 これならいい
strcpy(&s1[0],s2);
s1と&s1[0]の返す値は同じだっておかあちゃんに昔習わなかったか?
s1と&s1の違いはs1を1以外の適当な大きさの配列として、 printf("%p,%p\n", s1, &s1); printf("%p,%p\n", s1+1, &s1+1); を実行してみれば分かる。
>>516 ,517,518
どうもありがとうございます
皆さん頭いいっすね
そんな皆さんを見込んで、もう一つ質問 文 This is a test.を単語ごとに配列に入れて最後にNULLをつけなさい。 といわれたんで(そういわれたわけじゃないけど問題を解釈して)、 char str[][]={"This","is","a","test",NULL}; ってやったら警告出ちゃうんですけど、なぜですか? 試しにポインタ型の文字列でやってみたら、何も言われなかったんですけど。 char *str[]={"This","is","a","test",NULL}; この違いは何?
>>520 前者は文法違反です。そんな書き方はない。JavaやC#と違うんだから。
>>520 char str[][]={"This","is","a","test",NULL};
はcharの2次元配列を宣言しようとしているが中途半端なのでコンパイラがエラーを出す。
宣言&初期化するなら、
char str[][5]={"This","is","a","test",NULL};
とかすれ。
char *str[]={"This","is","a","test",NULL};
はcharへのポインタの配列だから、この二つのstrは全然意味が違う。
ポインタや配列をもう一回勉強せい。
>>523 あの〜そうやっても
warning: initialization makes integer from pointer without a cast
って出ちゃうんですけど。
まさか警告は無視しろと?
>>523 > char str[][5]={"This","is","a","test",NULL};
これ ANSI-C で許されたっけ?
char str[][5]={"This","is","a","test", ""};
なら判るけど。
あーここANSI-Cのスレだった。 もちろんNULLはないね。
えーとポインタくらいは分かるよ
Thisとかをどこかにとってそこへのポインタの配列入れてるんでしょ?
そのぐらいは・・・
>>525 そうなんですか…
でも最後にNULLが来たらなんちゃらしろってプログラム書かなきゃいけないんですけど
""でもNULL返されます?
>>527 char str[][5]は配列の配列だからNULLポインタは使えない。
char * str[]はポインタの配列だからNULLポインタも使える。
詳細は初心者スレでどうぞ。
>>527 ポインタ判るなら自明だと思うが NULL は返らないぞ。
>>528 ,529
どうも・・・でなおしてきます
(・ω・)
ポインタは分かるという初心者は 大抵ポインタが分かってないの法則
532 :
デフォルトの名無しさん :2006/07/31(月) 23:11:42
例えば1000個の要素を持つ3次元の配列 data[z][y][x] (x,y,z=0〜9) で、zのサイズを11(z=0〜10)に変更したい場合、 新たにその大きさの配列を確保してデータをコピーすれば可能だと思いますが、 そうではなくて、もともとの配列だけを使って、動的に配列の大きさを変更する ことって可能でしょうか? つまりその、上の例で言うと、x*y=10*10の2次元配列がz方向に10階建てになって いる感じだと思いますが、そこで例えばz=4と5の間に、新しく1階を挿入して z=11階建てにできますか?
realloc
メモリを確保しなおさないでやるのは無理 LISTとか使わないと
535 :
デフォルトの名無しさん :2006/07/31(月) 23:37:18
皆さんありがとございます。 >533 realloc すると、途中に挿入することができないように思うのですが、どうでしょうか。 つまり、reallocで10階の上に1階を追加できますが、4階と5階の間に挿入できないのでは と思います。 >534 LISTっていわゆるリスト構造ってやつですか? それも考えたのですが、でもそれだと、配列を data[z][y][x] のように表現できないですよね。 そのかわり、リストがポインタで連結されているややこしい構造になるのがちょっと 抵抗あります。 何かいい方法ないでしょうか?
x,yが伸縮しないなら z だけポインタの配列にすれば挿入とかのオーバーヘッドは かなり抑えられる。けど、(*data[z])[y][z] てな書き方になるので 激しくバグの元。すなおに get(x,y,z) と set(x,y,z,val) つくったほうがいいね。 むしろ x,y,z それぞれ伸縮する場合のデータ構造でいいのあるのか知りたい。
>>537 >>でいいのあるのか
日本語でどうぞ。
539 :
デフォルトの名無しさん :2006/08/01(火) 08:33:22
申し訳ないのですが、シェルの組み込みコマンドをプログラム中で使うにはどうすればよいのでしょうか? cdコマンドを使いたいのですが、exec や system でも出来ないですしどうしたらいいものかと。 検索してみても上手いこと素敵なのが発見出来なかったので、もしどなたか良い場所をご存知でしたら教えていただければ幸いです。
おお、さげ忘れました… ごめんなさい
ファイルを出力するのにcdコマンドは無用
542 :
デフォルトの名無しさん :2006/08/01(火) 10:13:19
cdの動作を考えればsystemじゃだめなのは一目瞭然という気もするが。 とりあえずchdir関数じゃだめなの?
>>542 このスレ的にはそんな関数ない。
>>539 スレ違い。環境依存容認スレか該当環境専門のスレか初心者スレにでもどうぞ。
544 :
539 :2006/08/01(火) 15:43:34
>>541 ファイル出力する訳ではなくて、FTPを実現するプログラムを作ってたので送受信する際の
カレントディレクトリを動かしたいと思っていました。
>>543 あいさ、すみませんでした。
そっちで聞いてみます。ありがとうございます。
なんでカレントディレクトリを移動させる必要があると考えるのかが不思議
ファイルのコード変換でibmjからEUCに変える場合って 改行コード追加してやらんと駄目だよね? ibmjtoeucとか使ってたんだけどソラリス9用にiconv使わんといかんのかなー。
スレ違い
549 :
デフォルトの名無しさん :2006/08/03(木) 00:57:58
#include <stdio.h> main() { int x,y,z; printf("数値を2つ入力して下さい : "); scanf("%d %d",&x,&y); for(;;) { if(x%y==0) break; else { z=x; x=y; y=z%y; } } printf("最大公約数 : %d",y); } c言語はやり始めて間もない状態です。 最大公約数を求めるプログラムは上記のようになるらしいのですが、for文の(,,)内に条件や初期設定等を示さないのはなぜなのでしょうか? また、7行目の"break"の意味は「繰り返し作業を終える」と捉えてよろしいのでしょうか? ご教授の程、宜しくお願い致します。
無能が書いたプログラムは読まないようにしましょう (当然、無能が書いた本も)
551 :
デフォルトの名無しさん :2006/08/03(木) 01:09:49
ということは上記プログラムは正常に作動しないということなのでしょうか? (現在動作確認できる環境下に無いもので、くだらない質問で申し訳ないです。)
552 :
連投すいません :2006/08/03(木) 01:14:20
因みに
>>549 はreturnやwhileの使用が禁じられた状態で、for文とif文を中心に遠回りに作成したプログラムであります。
こうかいてもいいお。 for (scanf("%d %d",&x,&y); x%y != 0; z=x,x=y,y=z%y); だが多くの人はこうかく。 scanf("%d %d",&x,&y) while (x%y!=0) { z=x; x=y; y=z%y; } 理由はそれが見やすいと思うから。うまいひとはどう書けばきれいか常に気を使ってるお。
554 :
デフォルトの名無しさん :2006/08/03(木) 01:27:30
関数にポインタで引数を渡す参照渡しというのがあるのですが 関数が受け取ったアドレスが、変数のアドレスなのか、配列のものなのか区別はしないものなのでしょうか
必要ならしますお。配列として扱う関数はいっしょに要素数をもらうのがいっぱんてきですお。
>>553 せみころんがぬけたorz
556 :
549 :2006/08/03(木) 01:40:52
557 :
デフォルトの名無しさん :2006/08/03(木) 01:51:47
>>555 ありがとうございます。
ちょっとテストしてみたのですが
#include <stdio.h>
void add (int *p) {
*p += 10;
*(p+1) += 10;
}
int main (void) {
int a = 10, b = 20;
printf ("変数aの値は%d:アドレスは%p¥n", a, &a);
printf ("変数bの値は%d:アドレスは%p¥n", b, &b);
add (&a);
printf ("変数aの値は%d:変数bの値は%d¥n", a, b);
return 0;
}
変数 aと bのアドレスがとなりあってる場合、関数によって配列でもないのに変数 bの値が書き換えられてしまいます
仮に、配列を扱う関数で、配列の後ろに関係ない変数があった場合、
意図せず変数まで書き換えてられてしまう可能性もあると思うのですが、
そういうのは自分で注意するべきなのでしょうか?
VCだとランタイムがチェックしてくれなかったっけ?
>>558 VCは使ってないのでよく解らないのです。
>>560 そうなのですか
文字列のようにNULL文字で制御できる場合以外は、気をつけたほうがよいですね。
どうもありがとうございました。
563 :
デフォルトの名無しさん :2006/08/03(木) 03:11:06
↑スルーで
(↑これはループせんでいいです)
(↑これはぬるぽせんでいいです)
(↑これは再帰せんでいいです)
(*゚ー゚)マターリいこうよ
ぬるぽく行こうよ
571 :
デフォルトの名無しさん :2006/08/03(木) 19:24:52
K&Rについての質問です。 演習5-5のstrncatなんですが void strncat(char *str1, char *str2, int n) { int i; while(*str1) str1++; for(i = 0; i < n; i++) *str1++ = *str2++; *str1 = '\0'; } とやるとうまくいくんですが、whileの部分を while(*str1++); にすると文字列が連結されません。 なにがいけないんでしょうか?
なんでって、そりゃポインタのアドレスを先に進めるか、 変数の値を増やすか、ぜんぜんちゃうやろ?ありがちなミスだな。
紙に[a][b][\0][\0]って書いてwhile抜けたときにどこ指してるか比べてみればわかる
575 :
571 :2006/08/03(木) 20:01:21
>>574 str1が\0の次まで進んでしまっているということですね。
whileのあとで str1--; としてみたらうまくいきました。
ありがとうございます。
577 :
デフォルトの名無しさん :2006/08/03(木) 22:53:26
おい、スーバープログラマども、教えてください。 int main(void) { int a = funcA(); return 0; } void funcA(void) { int index = 1; return index++; } 上のようなコードがあった場合、main の a に入る値は funcA の戻り値です。 この戻り値には、何が入るのでしょうか。 return に、indexの値が入れば、戻り値は1 return に、index++の値が入れば、戻り値は2 どちらが正しいのでしょう。 直感的に、(index++)の結果をreturnする、と解釈し、2だと思いましたが、 実際にVisual C++でテストしたところ、結果は1でした。 もし、return index のあとに index++ となるとしても、return というのは、 関数のコンテキストを離れてしまうわけで、そうすると既にfuncAのスタックとかは 残ってないわけで、何に対して++をするのかわかりません。 もしかして、この++は無効だとしてコンパイラが自動的にはじいているのでしょうか? 混乱してます。
>>577 まず、returnで返すのは「値」だ。
この場合、なんの値を返すかと言うと、
「index++」の演算結果
であって、「index++」そのものを返す訳ではない。
>>577 ++index って書いたら幸せになれるよ
>>577 #include <stdio.h>
int main(void);
int funcA(void);
void funcB(void);
int main(void) {
int a = funA();
printf("a->%d\n",a);
funcB();
return 0;
}
int funcA(void) {
int index = 1;
return ++index; //式を評価する前に増加
//return index++; /式を評価してから増加
}
void funcB(void) {
int index1 = 0;
int index2 = 0;
printf("index++ ->%d\n",index1++);
printf("++index ->%d\n",++index2);
}
戻り値もちゃんと考えようね
> もしかして、この++は無効だとしてコンパイラが自動的にはじいているのでしょうか? はじくかもしれない。 1.戻り値に使用されると決められているレジスタに index の値を入れる。 2.スタック上の index の位置に index+1 をいれる。。 3.return - スタックはもはや無効。2の処理に意味がないと気づいたコンパイラははじくかも。
そういや昔、VC で return のところで ++ 使ったら 変になるバグってなかったっけ? 今のだと大丈夫だろうけど。
自分が知りたいことが、一体どのジャンルの事なのかよく分かっていなくて 申し訳ないのですが、外部変数やexternについて教えてください 例えばmain.cとfunc.cという2つのソースファイルとmydef.hというヘッダファイルが あるプログラムで、その中で使っているグローバル変数AAAを、mydef.hの中で 以下のように、二重に宣言しないようにする事があるかと思います。 #ifndef MYDEF #define MYDEF int iAAA; #else extern int iAAA; #endif このようなヘッダファイルを、main.c、func.c両方でincludeしている場合に ・iAAAの実体(extern宣言されない方)はどのソースにあるものとされるのでしょうか ・cc -o exe.exe main.c func.c といった一括コンパイルではなく、Makefileを 使ったりして分割コンパイル→リンクしている場合、それぞれのコンパイルの時は プリプロセッサは独立して動作しているので、それぞれのソースで 毎回「#ifndef MYDEF」が有効になると思うのですが、その場合にmain.cとfunc.cで iAAAは二重に宣言されないのでしょうか 用語等、適切ではない部分はご容赦下さい…
gcc v3.4.4でコンパイルしたけど弾かれないな
PPC Mac だけど gcc -O ならはじかれたよ?
>>584 あー、なにか重大な誤解をしていると思うんだが。
複数のソースを同時に指定してもプリプロセッサもコンパイラも別々に動くよ。
だから
> cc -o exe.exe main.c func.c
でもmain.c、func.c両方でiAAAが定義されている。
でもって普通はヘッダーにexternだけ書いてソースに定義を書く。
実体をヘッダに定義するのは気持ち悪いし ヘッダはextern宣言だけにして実体はcファイルの中でやるほうが綺麗。 もちろん、実体を定義してるファイルにextern宣言のヘッダをインクルードしても問題ない。
ほとんどの処理内容が、ヘッダに書かれてて、cppの中身がマクロニ、三個と #include 行しかないの見たことがある。 書いたのは素人じゃないと思うんだけど、どういう意図があるんだろね。 # boostではないですよ。
>>589 このスレにそれを書き込む、お前の意図が知りたい
C++でテンプレートベースのライブラリだと大抵そうだよね
>584 普通はヘッダに定義を記述しない。つまり int AAA; はどこかの.cに書く。あるソースコードのコンパイルで extern int AAA; と int AAA; が同一のコンパイル単位に登場しても問題ない。
593 :
デフォルトの名無しさん :2006/08/04(金) 00:24:17
すみませんが教えてください ファイル(i.txt)に 0 1 2 と10まで出力させたいんですが以下のプログラムだとうまくいきません なぜなんでしょうか?お願いします #include<stdio.h> #include <stdlib.h> main(){ int i; FILE *fp1; if((fp1 = fopen("i.txt","w"))==NULL){ printf("ファイルが開けません\n"); exit(1); } for(i=0;i>10;i++){ fprintf(fp1,"%d\n",i); } fclose(fp1); return 0; }
594 :
584 :2006/08/04(金) 00:29:57
>>587 > 複数のソースを同時に指定してもプリプロセッサもコンパイラも別々に動くよ。
そうなのですか・・・
ソースを同時に指定すれば、定義されたMYDEFがコンパイル中はずーっと
有効なんだろうなあと勝手に想像していました・・・
> でもって普通はヘッダーにexternだけ書いてソースに定義を書く。
>>588 > ヘッダはextern宣言だけにして実体はcファイルの中でやるほうが綺麗。
> >584
> 普通はヘッダに定義を記述しない。つまり
皆様ありがとうございます。勉強になります。
私が挙げたような、#ifdefで実体と外部変数の宣言の処理を分けるというのは
ちょっと変な事をやってしまっていたようですね・・・
>>593 for(i=0;i>10;i++){
何コレ?ふざけてるの?
596 :
デフォルトの名無しさん :2006/08/04(金) 00:34:58
ありがとうございます 自分の馬鹿さにびっくりしました
そもそもをして、グローバル変数を使うこと自体、もっと慎重になった方がいい。
それには同意せざるを得ない
>>597 漏れもそれには同意なのですが、でもコマンドラインパラメータとして与えられた
オプションのフラグを関数の奥のほうまで運んでやる必要がある時とか、
ついついグローバル変数に入れてしまうな
そんな時、グローバル変数でないとするなら、オプションを格納した構造体を
ずーっと持ち回る、くらいの作り方しか分からんのだが、それもどうなのだろうな
おいらなら、オプションは最初に解析しておいてその結果をモジュールローカルに格納し パブリックな関数を呼び出すインターフェイスにするかな。 どこからでも「書き込める」のがよくない。
どこかで意図的に書き込んで奥のほうを騙すやり方の誘惑は強い。
関数インターフェースの設計に失敗して直すの面倒な時 に使う
printfとputcharの違いってなんですか?
ようするに、putcharは単純低機能で、printfは複雑高機能。
過去ログ半分しか読んでないんで、既出かもしれないけど質問 char Siki[256]="(3+2)*4/5" と入れてあるときにKeisan(Siki)で4を出力するような関数Keisanって作れませんか
作れるけど、初心者にはかなり大変。
>>606 bison flex でググってみれ。
>>606 手書きなら再帰下降解析で10分で作れる。
610 :
609 :2006/08/05(土) 09:10:41
コード書く時間より, 1レスで収めるように改行とかを潰す時間のほうがかかったorz #include<ctype.h> #include<stdlib.h> int addsub(char**); int atom(char**p){ int v;if(isdigit(**p))v = strtol(*p,p,0);else if(**p=='(')++*p,v = addsub(p),++*p; else{while(**p)++p;return 0;}while(isspace(**p))++*p; return v; } int pre(char**p){while(isspace(**p)|**p=='+')++*p; if(**p=='-'){++*p;return-pre(p);}return atom(p);} int muldiv(char**p){ int v = pre(p); for(;;)if(**p == '*')++*p,v *= pre(p);else if(**p == '/')++*p,v /= pre(p); else return v; } int addsub(char**p){ int v = muldiv(p); for(;;)if(**p == '+')++*p,v += muldiv(p);else if(**p == '-')++*p,v -= muldiv(p); else return v; } int Keisan(char*p){return addsub(&p);} int main(){ char Siki[256]="(3+2)*4/5";printf("%d\n",Keisan(Siki)); }
>594 >私が挙げたような、#ifdefで実体と外部変数の宣言の処理を分けるというのは >ちょっと変な事をやってしまっていたようですね・・・ --mydef.h--- #if defined(MYDEF) int i; #else extern int i; #endif としておいて、通常使うときはそのまま #include、実体定義用のファイルでは --mydef.c--- #define MYDEF #include "mydef.h" というのならありじゃないかな。mydef.h 1ヶ所だけで管理が可能だし。
そんなキモイ事するくらいなら外部リンケージの変数を 一箇所にまとめたcファイル作れ。
その昔 #ifndef MYDEF #define extern #endif extern i; っていうやり方を見たことある。 なにか理由があった気がするが忘れた。
#ifdefだった
理由:アホな奴がそのコードを書いた
memset()の使い方で質問があります。 2次元配列 data[y][x] があったとして、 この配列を初期化する場合に、 memset( data, 0, y*x); とやっても問題ないでしょうか? 自分でコード書いた限りでは上手く動いているようなのですが、 実際のところはどうなのでしょう?
今後、自分だけの価値観だけでアホだの無能だのバカにするだけで
自分の意見を言わないような
>>615 みたいなのは放置な。うざい
>>616 memset(data, 0, y*x*sizeof(char))
みたいに型サイズも入れた方がいいんじゃないかな
>>618 それを書くなら、問題のある型を書きましょう。
>>619 charならsizeofは不要。
sizeof (char)は常に1と決まっているから。
623 :
616 :2006/08/05(土) 21:26:10
みなさんレスありがとうございます。 配列は unsigned char なものを使ってます。 データ型を指定する癖をつけていこうと思います。
戻り値が二次元配列になる関数はどうやって作成したらよいのでしょうか。 関数ポインタや配列とポインタについては調べたのですが、よくわかりません。 どなたかご教示ください。
>>624 僕の天才的関数で一発だb
void** a(void b[2][2])return b;
>>613 そもそもそれバグありなんだが、それ以外にも問題ありすぎだろ。
>>626 ありがとうございます!早速組み込んでみたいと思います。
>>629 ですよね・・・・void**てなんだろ と思いましたし(void b[2][2])って意味わからないし・・。
どなたか本当の答えを教えてください。
>>630 Cでは配列を返せない。
で、void型変数というのは型を特定しないこと。
・呼ぶ側は、二次元配列となる変数を宣言する ・呼ばれる関数の中でも二次元配列となる変数を宣言する ・呼ばれる関数でメモリを確保したり0で初期化したりする ・呼ばれる関数での戻り値は、配列の先頭アドレス ・呼ぶ側は、宣言した二次元配列のアドレスを、関数からの戻り値にあるアドレスに書き換える int main(int argc, char **argv){
633 :
606 :2006/08/05(土) 22:29:26
>>610 ありがとうございます
今の自分のレベルでは無理っぽいみたいで、内容も把握しきれませんでした
607の指摘の通り、初心者の身には難しいようで、もう少し精進して自力で組めるようになりたいと思います
>>631 そうでしたか。Cでは配列は返せないのですね。voidについてもわかりました。ありがとうございます。
>>632 なるほど。配列は返せないので作った配列のアドレスを返すのですね。がんばってみます。
みなさんありがとうございました。
>>623 sizeof(char)は1だから、必然的にsizeof(unsigned char)も1。
従ってsizeof(char)やsizeof(unsigned char)は書く必然性がない。
#そもそも内部でcharを書き込む処理をするのだから当然と言えば当然なのだが。
あるプログラムを作成し、コンパイルしたのですが、 『インクルードファイル’stdio.h’をオープンできない』 というエラーが出ました。 他のパソコンだと普通にコンパイルできるのですが・・・。 原因がまったくわかりません。 どなたか教えてください。
stdio.h自体が存在しないか、 stdio.hがあるフォルダへパスが通ってない
>>636 コンパイルしたパソコンにちゃんとコンパイラ、開発環境が入ってっかぁ〜?
>>636 初心者スレ、或いは該当環境のスレへどうぞ。
>611 だめだろ、ふつうに。なんのために extern int foo; int foo; で定義、宣言が両方あっても問題ないようになってると思ってんだ?
実はフリースタンディング環境の処理系だったということが あるあ…ねーよwww
BCCってちゃんと自分でパス通さないと使えなかったような
#include <stdio.h> #include <time.h> int main (void) { int ans; clock_t start, end; start = clock (); puts ("55 かける 55 はいくつでしょう?"); scanf ("%d", &ans); if (ans == 55*55) puts ("正解です"); else puts ("間違ってます"); end = clock (); printf ("%.1f秒かかりました¥n", (double)(end - start)/CLOCKS_PER_SEC); return 0; } 上のようなプログラムで、計算にかかった時間を表示させようとしたのですが、 どんなに時間をかけても、「0.0秒かかりました」としか表示されません。 ためしに printf ("%d, %d", start, end); で表示させても start, end ともに「0」でした。 どこか問題があるのでしょうか?
>>643 その程度の演算、今のコンピュータなら1msと掛からずに処理できる。
ユーザー入力部(scanf)があるのに コンピュータの性能も糞もねぇだろw
明らかに読んでなかった 吊ってくる
>>645 出ますか...
自分 mac なんですけど、環境による影響ってないですよね...なんでだろう
ちょうど処理に2^32秒かかったんじゃね?
651 :
649 :2006/08/06(日) 02:22:01
マジレスキタワァ*・゜゚・*:.。..。.:*・゜(n‘∀‘)η゚・*:.。. .。.:*・゜゚・* !!!!! コンパイラの問題なんじゃね?
>>643 scanf()の前と後ろに
printf("%f\n", (double)clock());
入れたらどうなる?
>>649 スイマセン本当は意味解ってなかったです。
コンパイラですか...おそらく GCC 4 なんですが、これがダメなんでしょうか?
>>652 やってみました。
とりあえず入力までに5秒くらい間をおいてみたのですが
scanf の前、後ろとも「0.000000」でした。
それ明らかにちゃんと機能してないわけだが
656 :
デフォルトの名無しさん :2006/08/06(日) 06:53:19
おれ今ちょうどマカーなので試してみた。ゼロといわれた。 頭に volatile int i; for (i = 100000000;i;i--); をいれてみた。 72といわれた。ちなみにCLOCKS_PRT_SECは100と小さい。 scanf()の入力待ちはselect()かなんかしててCPU食わない。なのでゼロが かえってきてるってことではないかと。
-CLOCK_PRT_SEC +CLOCK_PER_SEC まっくのキーボードに慣れてないせいにしとく。。
man 3 clock
...
clock() はプログラムの使用したプロセッサ時間の近似値を返す。
つまり
>>644 が正解。
リロード… orz
660 :
611 :2006/08/06(日) 10:23:34
>640 ---mydef.h--- extern int i; ---mydef.c--- #include "mydef.h" int i; として他のソースでも #include "mydef.h" しろ、という意味?自分で書くならこう書くけど。 で、>611 みたいに書いた場合のデメリットって、キモイ以外に何かある?
>660 書き込んだ後で気づいた。型が違ってる場合にエラーが出るか否かが違うな。 じゃ、これでどうだ。…キモ度があがったような気がするが。 ---mydef.h--- #if defined(MYDEF) #define EXTERN #else #define EXTERN extern #endif EXTERN char c; EXTERN int i; #undef EXTERN ---mydef.c--- #define MYDEF #include "mydef.h"
15年くらい前にexternをdefineしたことあるよ。externつけて宣言したら定義書けなかったんではないかと 回想してみた。はっきり覚えてないんだけどAIXのCでANSI準拠だったと思う。 定義専用のCファイル作ればいいんだけど、ちゃんと両方に書かないといけないから同期が面倒だったんだわ。
>>663 同期が面倒になるほどグローバル変数を使うのか、お前は。
当時はへっちゃらだったなあ。
666 :
663 :2006/08/06(日) 13:21:43
visual studio使ってるんだが、 func.cで作った関数をmain関数のあるmain.cで呼び出すにはどうしたら良いんだ? ソースを2ファイル以上に分けて記述する方法がわからん・・・
ヘッダファイルに関数プロトタイプを書け
669 :
667 :2006/08/06(日) 14:13:38
>>668 できた。ありがとう
これでヘッダファイルに処理書かなくてすむ
>661 なおさらだめなコードだと思う。俺の部下が書いてきたら速攻でつき返す。 というかインクルードファイルには通常多重インクルード防止の ガードマクロを用意するのが普通だが、その辺の配慮とかは? 要はそのインクルードファイルを使うやつがいろんなことを配慮しなきゃ いけないようなのはよくない、というのが最近の流れだな。
まあ、グローバル関数でも .h と .c の2カ所に同じような事書いてんだから、 グローバル変数で同じように2カ所に書いたところで今更なんだって話だな。
>>666 の本には初期化子がある場合のこともガードマクロのこともちゃんと書いてたぞ
中途半端に紹介するのはよくないな
>>632 またまた質問ですみません。
・呼ぶ側は、宣言した二次元配列のアドレスを、関数からの戻り値にあるアドレスに書き換える
とありますが、戻り値にあるアドレスに書き換えるとはどうすればよいのでしょうか。
#include <stdio.h> int (*echo(int p[][2]))[2] { return p; } int main(void) { int dim[2][2] = { { 1, 2 }, { 3, 4 }, }; int (*p)[2] = echo(dim); printf("%d¥n", p[1][1]); return 0; }
675 :
デフォルトの名無しさん :2006/08/08(火) 17:06:05
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
2の乗数で乗除するとき。 R5G5B5をアンパックするとき。 ソースに2ちゃんねるのレスを埋め込むとき。 暇をつぶすとき。
>>674 解答ありがとうございます!
よくわからない部分もありますが、それはもっと勉強しようと思います。
ありがとうございました。
679 :
デフォルトの名無しさん :2006/08/09(水) 00:24:40
10進数→16進数に変換し、ファイルに出力するプログラムなのですが ファイルへのヘキサ出力の方法を教えてください。 下記のようなコードを記述したのですが、例えば、「1024」という 数値を入力した場合、ファイル出力への期待する結果は、 「0x0400」なのですが、現在、「0x30343030」という形で 数字が狂ってしまうのです。(1→31という風に扱われています。) 何卒、ご教授ください。 [ソース]--------------- #include<stdio.h> int main() { FILE *outputFile; unsigned int a; unsigned char Hex[256]; /* 出力ファイルオープン (バイナリ出力 上書きモード) */ outputFile = fopen( "aaa.txt", "wb+" ); /* 変換対象の数字 */ a = 1024; /* ヘキサに変換し、文字列で受ける */ sprintf( Hex, "%02X", a ); /* ファイル出力 */ fprintf( outputFile, "%s", Hex ); fclose( outputFile ); return 0; }
681 :
デフォルトの名無しさん :2006/08/09(水) 00:53:45
>> 680さん ありがとうございました。 名前のところにあったとおり 記述をしたところ動きました。 色々試行錯誤していたのですが このやり方に気づきませんでした。 仰るとおり勉強不足でした。 もっと努力します。 本当にありがとうございました。
ファイルを読込んで半角スペースで区切られた文字列からfooを含んだ行だけを 出力したいのですが どうしたらできますか。 例 hoge.txt 内容 abc def ghi foo jkl nmo pqr stu vwx y foo 結果 abc def ghi foo stu vwx y foo
>>682 宿題丸投げなら宿題スレへ行け。
丸投げするつもりが無ければ、どこで何に悩んでいるのか書きなさい。
grep " foo"
open FH, "hoge.txt"; while(<FH>) { if(/ *foo */) { print; } }
686 :
デフォルトの名無しさん :2006/08/09(水) 22:49:43
教えてください。 int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); 第3引数の宣言なんですが、関数へのポインタという 理解でよいでしょうか。 紛らわしいですが、解釈すると。 start_routine は voidへのポインタの引数を持ち voidへのポインタを返す関数へのポインタ。 でよいでしょうか。
あってるが、voidへのポインタという日本語はおかしい。
よい
689 :
デフォルトの名無しさん :2006/08/09(水) 22:53:37
>> 687 ありがとうございます。 では、void * はどのような表現が適切でしょうか。
ヴォイドポインター
void ポインタ
692 :
デフォルトの名無しさん :2006/08/09(水) 22:56:15
>> 690 なるほど。ありがとうございます。
682ですが、
>>685 でOKですか?
自分なりに検索しながら考えて、これでいけると思ったのですが、どうも上手くいきません^^);
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *fp;
char s[256];
char *sp
char str[] = "foo";
if ((fp = fopen("hoge.txt", "r")) == NULL) {
printf("file open error!!\n");
exit(1);
}
while (fgets(s, 256, fp) != NULL) {
sp = strstr(s, str);
if(sp != NULL){
printf("%s\n", s);
}
}
fclose(fp);
return 0;
}
>>694 256(俗にマジックナンバーと言われる)は#defineしといたほうがいい
お〜〜〜〜〜
>>695 こうしたら、上手くいきました、しかしなぜ256では駄目なんですか?
#include <stdio.h>
#include <string.h>
#define READ_DATA_SIZE 256
int main(void)
{
FILE *fp;
char s[READ_DATA_SIZE];
char *sp;
char str[] = "foo";
if ((fp = fopen("hoge.txt", "r")) == NULL) {
printf("file open error!!\n");
exit(1);
}
while (fgets(s, READ_DATA_SIZE, fp) != NULL) {
sp = strstr(s, str);
if(sp != NULL){
printf("%s\n", s);}
}
fclose(fp);
return 0;
}
>>696 二箇所に出てくる256が、変えたくなったときに両方とも同時に変えなければならない性質なら
マクロなりconst定数(但しC99)にしておくべき。
但し、>696の場合はfgets(s, sizeof(s), fp)とするのが常道であり、
その場合は必ずしも積極的にマクロにしておく必要がない。
#でもしておいた方が意味を持たせると言う点では可読性が高いので好ましい。
sizeofに括弧は必要ありません。
>>698 常に不要なら書かないという選択肢もあるが、
必要な場合もあるから書く香具師が多い。
そんなことくらい、大抵の香具師は知っている。
sizeof が演算子だと知って知識を自慢したいんだろ。
701 :
デフォルトの名無しさん :2006/08/10(木) 15:33:19
これはANSIの質問でないかもしれませんが、まちがっていたらごめんなさい。 わりと大きなプログラムを作る場合に、 プログラム全体を通して使う エラー番号とエラーメッセージ をあらかじめヘッダーとか初期設定の関数とか、あるいはファイルなどで定義しておいて、 それらをプログラム中で使うような方式が、一般的かどうか知りませんが、 わりとよく使われているのでは、と思うのですが、 私も、そういう方式を真似してみたいのですが、どこかに参考となるような ソースコードありませんかね? よろしく。
>>701 グローバルにenumとconst char* []を用意しておくだけ。
703 :
デフォルトの名無しさん :2006/08/10(木) 16:41:03
>702 ありがとうございます。 わたしもそんな感じで作ってみようかと思ったのですが、 例えば、メッセージの数が増えて100個くらいになったとすると、 enumの並びと char *[]の並びがずれて、混乱するとか そういう問題ってありませんか?
>>703 errordef.h:
MSG(NO_ERROR, "no errors"),
MSG(xx_NOT_FOUND, "not found"),
...
errors.h:
enum ErrorCode {
#define MSG(e, m) e
#include "errordef.h"
#undef MSG
};
errors.c:
#include "errors.h"
const char *Messages[] = {
#define MSG(e, m) m
#include "errordef.h"
#undef MSG
};
705 :
デフォルトの名無しさん :2006/08/10(木) 18:07:09
>704 おお素晴らしい。これなら、メッセージの数が増えても混乱しませんね。 世の中には、優秀な人がいるもんだと感心しています。 さっそく利用させていただきます。ありがとうございました。
ぜんぜんすばらしくないよ。
自分で定義した関数への二次元配列の受け渡しってどうしたらできますか?
710 :
デフォルトの名無しさん :2006/08/11(金) 00:11:46
ポインタについて質問です。 よく関数で sample(char **ptr){ ....... } というようなものを見かけるのですが、実際に**ptrが何を指すのかいまいちわかりません。 char型をさすポインタをさすポインタなんだろうなーというくらいで K&Rを読んでいると 「*pとp[]は同じ」 のようなことが書いてあって、だいぶ混乱してきました。 ひょっとして function(**ptr) と function(*ptr[]) と等価なのでしょうか? つまり**ptrは「ポインタが格納された配列」と読み替えていいのでしょうか? よろしくおねがいします。
ポインタ変数をさすポインタです。 それ以上でもそれ以下でもありません。
713 :
デフォルトの名無しさん :2006/08/11(金) 01:06:13
>>712 何命令してんだよ?お前に聞いてねーし、答える気がないならいちいちレスするな
役立たず
おー、夏らしくて清清しいね。
「K&R 5.9ポインタ対多次元配列」の辺りも読んでみるといいと思うよ。
>>710 function(**ptr)
と
function(*ptr[])
と
function(ptr[][])
は等価で、すべて
function(**ptr)
として扱われる。
>>716 嘘付け。
>function(ptr[][])
こんなのがコンパイル通るわけがない。JavaやC#じゃないんだから。
718 :
デフォルトの名無しさん :2006/08/11(金) 02:08:43
**ptrで貰って*ptr->hogeとかしてヲッチ汁
>アーグググググググ! アーグブイ! アーグシー! これ見るたびに美味しんぼ思い出す。グワバババババ!
Cは始めの一歩から混乱してるからねぇ。 int main(int argc, char **argv) int main(int argc, char *argv[])
722 :
名無し :2006/08/12(土) 18:09:18
#include <stdio.h> #include <stdlib.h> #include <time.h> //プレイヤーの手を表示 main() { int player = 0, computer; //乱数の種をまく srand(time(NULL)); printf("【ジャンケンゲーム】"); //プレイヤーの手の入力 printf("ジャンケン・・・(グー:1、チョキ:2、パー:3)>"); scanf("%d", &player); //コンピュータの手の入力 computer = rand()%3+1; printf("コンピュータは"); if(computer == 1) {printf("グー\n");} else if(computer == 2) {printf("チョキ\n");} else if(computer == 3) {printf("パー\n");} //勝ち負け判定と結果表示 if(player == computer) {printf("あいこです");} else if(player == 1 && computer == 2) {printf("プレイヤーの勝ちです");} else if(player == 2 && computer == 3) {printf("プレイヤーの勝ちです");} else if(player == 3 && computer == 1) {printf("プレイヤーの勝ちです");} else {printf("コンピュータの勝ちです");} return 0; }
723 :
名無し :2006/08/12(土) 18:09:57
上は単純なジャンケンゲームのプログラムである。 このプログラムは、自分の手を選択するときに「1,2,3」以外の数字を入力すると コンピュータはグー コンピュータの勝ちです。 このように表示され、コンピュータが勝ってしまう。 さぁ、「1,2,3、」以外の数字を入力したときに コンピュータはグー プレイヤーの不正によりコンピュータの勝利 こういった具合に実行されるようにプログラムを書き換えなさい。
main() { int player = 0, computer; //乱数の種をまく srand(time(NULL)); printf("【ジャンケンゲーム】"); //プレイヤーの手の入力 printf("ジャンケン・・・(グー:1、チョキ:2、パー:3)>"); scanf("%d", &player); //コンピュータの手の入力 computer = player; printf("コンピュータは"); if(computer == 1) {printf("グー\n");} else if(computer == 2) {printf("チョキ\n");} else if(computer == 3) {printf("パー\n");} //勝ち負け判定と結果表示 if(player == computer) {printf("あいこです");} else if(player == 1 && computer == 2) {printf("プレイヤーの勝ちです");} else if(player == 2 && computer == 3) {printf("プレイヤーの勝ちです");} else if(player == 3 && computer == 1) {printf("プレイヤーの勝ちです");} else {printf("プレイヤーの不正によりコンピュータの勝利");} return 0; }
//勝ち負け判定と結果表示 if(player > 3 || player == 0) { printf("プレイヤーの不正によりコンピュータの勝利"); } else if(player == computer) { printf("あいこです"); } (以下略)
//プレイヤーの手の入力 printf("ジャンケン・・・(グー:1、チョキ:2、パー:3)>"); scanf("%d", &player); if( ! (player==1 && player==2 && player==3)){ printf("コンピュータはグー\n"); // ←いるのか、これw printf("プレイヤーの不正によりコンピュータの勝利"); return 0; } (以下略)
727 :
名無し :2006/08/12(土) 18:40:02
>>719 「完全制覇」のページひととおり読んでみた。
K&Rは書かれた時代のハードの事を考えれば、しょうがないかな、って部分もあるし
そのほうが現実的だなって部分もある。(たとえばポインタと配列では一般に前者が速いとか)
現在の環境を踏まえて振り返って批判するのは、ちょっとアレだな、とおもう。
宣言の書きかたについては、まぁ、やっちゃったよね、ってかんじだ。
729 :
デフォルトの名無しさん :2006/08/13(日) 05:22:50
質問です. x86 の movntq をつかったような、キャッシュの汚染をしない memcpy もどき の関数って用意されて無いんでしょうか? また、こういった関数がほしい場合、自分でアセンブリ記述するのが普通なん でしょうか?
>>729 このスレ的には有り得ない。そもそも標準Cにキャッシュの概念そのものがない。
>>730 C99にキャッシュについての記述があるけどな。
restrictedとかvolatile関係で?
main関数の中に、 extern unsigned long型を 宣言することは出来ないんですか?
734 :
デフォルトの名無しさん :2006/08/13(日) 10:59:10
unsigned long ColorBit_test[8][8]={ {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933} }; ねえこの宣言の仕方なんか間違ってる?
736 :
デフォルトの名無しさん :2006/08/13(日) 11:23:49
>>735 こんな警告が出ます
p5.c:80: error: variable-sized object may not be initialized
p5.c:81: warning: excess elements in array initializer
p5.c:81: warning: (near initialization for `ColorBit[0]')
p5.c:81: warning: excess elements in array initializer
p5.c:81: warning: (near initialization for `ColorBit[0]')
p5.c:81: warning: excess elements in array initializer
p5.c:81: warning: (near initialization for `ColorBit[0]')
…
unsigned long ColorBit_test[8][8]={ {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,}, };
738 :
名無し :2006/08/13(日) 13:35:52
さっきから、2chに書き込めないので テスト。
739 :
名無し :2006/08/13(日) 13:43:22
>>738 どうやら書き込めたようだな。
お前はまた、大人への階段を一歩上がったんだ。
おめでとう。
740 :
デフォルトの名無しさん :2006/08/13(日) 13:47:27
>>737 それでもおんなじエラーが出るんだけど…
n=4:1234,1243,1324,1342,1423,1432,2134,2143,2314,2341,2413,2431・・・ のように、1〜n(実行時に決定される、100を超えない)の順列全通りを表示するプログラムのアルゴリズムを教えてください。
>>736 そのメッセージには ColorBit とか書いてあるんだが、
本当に ColorBit_test の部分に問題があるのか?
C言語の宿題やってる俺がマジレス #include<stdio.h> int main(int argc, char **argv) { unsigned long ColorBit_test[8][8]={ {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933} }; puts("動いたにょ"); return 0; }
745 :
名無し :2006/08/13(日) 14:26:32
流れを変えて悪いが、C言語でウィンドウを作ることは可能か?
746 :
デフォルトの名無しさん :2006/08/13(日) 14:27:38
>>742 宣言してません
>>743 あ、ちょっと書き直したんです。気にしないでください。
ColorBitでもColorBit_testでも同じ症状です。
>>745 このスレとしては
コンソールにテキストでなら可能でし
>>747 MS-DOSの頃のIDEはやってたよな
749 :
デフォルトの名無しさん :2006/08/13(日) 15:03:01
原因が分かった extern int Width; extern int Height; main(){ Width=8;Height=8; int w=Width,h=Height; unsigned long ColorBit[h][w]={ {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933} }; これだと警告が出る。 なぜ?
750 :
デフォルトの名無しさん :2006/08/13(日) 15:06:01
main(){ #define w 8 #define h 8 unsigned long ColorBit[h][w]={ {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}, {0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933} };
Win3.1+MS-Cでは自力でWinMainから何から書いてた。 Unixならどうすんだろうね。 OX-Libraryしか使ったこと無いからワカンネ。
752 :
デフォルトの名無しさん :2006/08/13(日) 15:11:08
extern って使っちゃ駄目なの?
externしてる変数の実態は何処に?
754 :
デフォルトの名無しさん :2006/08/13(日) 15:17:41
>>749 のまんま
文の最初でexternして、
直後のmainの最初で=8してる。
あとは下のほうで定義してる関数に使ってる。
externどうのでなくで、配列サイズのhとwは定数でないとだめ ColorBit[h][w] ~~~~~~ C99なら話は別なんだけど
いちいちC99の話をする奴、ウザイな
そんなのいいじゃんと思ったが、C99はANSI-Cじゃないんだよな。 差別すんのもいかがなもんかと思いつつ、何気に決定的な違いも多いし さあどうしたもんか。
758 :
デフォルトの名無しさん :2006/08/13(日) 15:40:03
>>755 d!!
あと余談だけどさ
どうして関数の外でextern定義すると、
p5.c:6: warning: `Width' initialized and declared `extern'
p5.c:7: warning: `Height' initialized and declared `extern'
p5.c:8: warning: `ColorBit' initialized and declared `extern'
って警告されちゃうの?
hoge.c: int Width=8; p5.c: extern int Width; 変数 Width の実体は hoge.c にあって、 p5.c からはそれを参照しているにすぎない。 初期化は hoge.c で行なうべきなのだが、 p5.c で初期化が行われているからだと思う。 Width は extern にすべき変数なのかな?
760 :
デフォルトの名無しさん :2006/08/13(日) 16:21:19
>>756-757 このスレタイの「ANSI」は、C89に限定するためのものではなく
標準Cであることを示すためのものであったはずで、
C99 は ISO だろ、などという下らない突っ込みは却下。
なんなら次スレの名前を【ANSI-C】 C言語なら俺に聞け! Part 129 【ISO C】【JIS C】とするという手もある。
いい加減にしないと、_Complexとかrestrictとか平気で使うぞ。
つーか
>>737 だと8を直に書き込んでるじゃん
>>746 といい勝手にソース書き換えてエスパーに期待してたら
分かるものも分からなくなるに決まってるだろ
こんな感じでどうかね? 【ISO/JIS/ANSI】 標準C 【環境依存お断り】
ここで環境依存な質問する奴は 自分の質問内容が環境に依存する事を知らないと思います先生
2辺りに何が標準で何が非標準かと書くべきか?
誰かしら誘導するからどっちでもよかろ
【どんと来い】C【超環境依存】
もとのタイトルが跡形もなくなるのはどうかと 【ISO/JIS/ANSI/標準C】 C言語なら俺に聞け! Part 129
771 :
デフォルトの名無しさん :2006/08/16(水) 19:05:31
fgetsなどでは、char型のポインタを返しますが、このポインタが指すメモリはどのように確保されているのでしょうか。
ソース嫁
>>771 マニュアルページを読め。
要は、引き数をそのまま返すかNULLを返すかだ。
アドレス帳の作り方を是非
775 :
771 :2006/08/16(水) 19:47:32
呆けてました。 第一引数が必要なサイズが確保されたメモリへのポインタだということが何故か飛んでいました。 すいませんでした。
オーエス!オーエス!
しかしOSのアロケーションを生で使っている処理系ばかりではない。
同じパソコンにインストールしてあるLinuxとwindows2000で、全く同じソースを 同じコンパイラーでそれぞれでビルドして実行したら、実効速度に差は出るものでしょうか。
>>123 そりゃまぁOSのAPIなんかを呼んでいれば当然実行されるコードは異なるわけだから。
781 :
sage :2006/08/18(金) 14:27:50
配列のキャストについて質問です。 int *x1; char *c1; *x1 = 0x3456; c1 = (char *) x1; printf( "x1: %x c1[0]: %x c1[1]: %x\n", *x1, *c1, *(c1+1)); (結果 x1: 3456 c1[0]: 56 c1[1]: 34) のように、2バイトの0x3456を1バイトずつに分割したらどうして c1には34,56の順に入らず56,34の順に入ってしまうんでしょうか?
ファットエイドリアンとスリムエイドリアン
VIPエンディアンとラウンコエンディアン
int i = 0x3456; short s; memcpy(&s, &i, sizeof (s)); こういうのが期待通り動くほうがいいかな〜と思ったからじゃないかとおれは思う。
788 :
sage :2006/08/18(金) 15:08:57
あ、そういうことだったんですね。 Intelだからリトルでした。
なんでビッグエンディアンで統一しないのかね〜 本当にリトルエンディアンは使いづらい。
リトルエンディアンの方が、CPUに取って都合の良いこともあるのだよ
え、逆じゃね? ビッグエンディアンって扱いにくいにも程があるだろ。 ビッグエンディアンの利点があるなら教えてくれ。 とりあえず、リトルエンディアンの利点は int32_tからint16_tやint8_tにキャストするのは単に上位ビットを無視するだけですむ。
792 :
デフォルトの名無しさん :2006/08/18(金) 22:26:17
stdlib.h の rand 関数(一応、環境は VisualStudio.NET 2002 )についてなんですが rand() だけを延々実行しつづけた場合、実行回数が int の上限値に達する前であっても 一度出てきた数字が再度出てくるということはありえますよね?
>>791 上位ビットを無視するってのは、リトルでもビッグでも同じだとおもうが。。。
エンディアンはメモリ上の配置の話だろ。 intN_t から intM_t への変換は(レジスタに収まる限り)関係ないんじゃないか? エンディアンが問題になるようなコードは、どうせ未定義か、 よくて実装定義な動作になるだろうし。
>>791 ビッグエンディアンは人にやさしい(人が理解するのと同じ順番でメモリに格納されるから)
>>792 規格上はありえるんだけど、そういう実装はあんまりないだろうなぁ。
今、LANのドライバ開発をしているけど LANコントローラ(LAN91C111)自体はリトルエンディアンで設計してあり 実際に搭載するCPUはSH-2はビッグエンディアンで、正直作るのにめんどくさい。 しかもレジスタアクセスはバイトスワップでデータアクセスはそのまま。 (接続によってはレジスタアクセスはそのままで、データアクセスはバイトスワップする場合もある) I/Oレジスタアクセスする際にバイトスワップするべきか I/Oレジスタの定義ファイルをリトルエンディアン用とビッグエンディアン用の二つを作るべきか・・・ 2つだとメンテが面倒だがスワップの必要がない分ちょっと処理が早くなるかもしれないけど。 ところで誰かSH-2にLAN91C111を搭載して、コード作った人といる?
>>792 全部の数字がでるまで各数字が一回しか出ない数列を乱数列と呼ぶ人間は見たことがない。
>>797 えーと、一度スレタイ読むことをおすすめします。
>>797 エンディアンの違いを吸収するインターフェースを決めて、
それぞれのエンディアン用に実装を書くのがいい。
そこから先はスレ違いだから、ここで話続けないでね。
すみません。まるっきり場の雰囲気を呼んでいませんでしたね。 後から自分で見ても、何だこの書き込みは・・・と思いました。
間違って呼ばれたのは私ですか?
803 :
デフォルトの名無しさん :2006/08/19(土) 15:04:01
>>791 おまえさん、どっち派だ?
void foo(char *c, int *i)
{
*c = (char)*i; //1
*c = *(char *)i; //2
}
# ビットマスクも気にはなるが話がそれるんであえて外している
Cのスレなんで1だがアセンブラなら通常2かな。いやおれ791じゃないかも。
>>803 漏れは、1
1と2で結果が異なる場合ってある?
int *(*(*i)())[5] とした場合iは何を指してるか教えて、
これってどのような手順で解釈するんですか? ポインタって難しい。
教えて君ですまそ。
ヒント:エンディアン
そういうのを実際に使うソースを見たことがないが、もしあったら日本語に変換する。 iはポインタで(それが指すものは) 関数で戻り値がポインタで(それが指すものは) 要素5の配列で(それの中身は) ポインタで(それが指すものは) int こういうやりかた書いてたのはエキスパートCプログラミングだったかなあ まちがってたらごめぽ
808 :
デフォルトの名無しさん :2006/08/19(土) 16:43:54
K&Rのど真ん中に書いてあるだろ、そんなの
そうなん?英語のK&Rしか持ってなくて探すのが大変。ちょっと探してみるが。 ついでにやりかたを説明しとくぞ。変数名のとこからはじめて 右に向かって解釈、なくなったら左に向かって解釈だ。 括弧はこの順番を変えるものだ。 int *i[] で練習すると iは要素数不定の配列で中身は ポインタで指すものは int これで怖いものなしだ。
K&R の 5.12 Complicated Declarations にありますた。 x is a function returning a pointer to an array of pointers to function returning char char (*(*x())[])() だってさ。
812 :
805 :2006/08/19(土) 17:38:30
みなさま有難うございます。 これは、ポインタの演習問題で、これが正しく解釈できる位だとポインタの解釈に関しては及第点だと言われた。 漏れのint *(*(*i)())[5]の解釈手順は (*i): iはポインタです。 (*i)():iは関数をポイントしている。 (*(*i))():関数の戻り値はポインタである。 (*(*i)())[5]:戻り値のポインタは要素5の配列をポイントしている。 int *(*(*i)())[5]:配列の要素はint型のポインタ(int *型)である。 まとめると、ポインタ変数iはint *型を5つ持つ配列を指すポインタを返す関数を指すポインタである と漏れは解釈したのですが、自信が無かったんで質問したしだいです。何か解釈あってそうでうれしーーです。 逆に、このようなポインタ変数を宣言しろと言われれば、むりぽ。
cdecl
そんな複雑な変数宣言出てくるようなソースは読みたくないな。
K&Rは変数定義の定義を完全に説明しているがわかりにくい。これ読んでいっぱつで理解できたら エスパー認定。
816 :
791 :2006/08/19(土) 18:31:59
>>803 そりゃ普通に前者だな。
エンディアンが絡む処理は言うまでもなく環境に依存しているから必要なとき以外する必要はない。
俺が言いたいのは
>>789 がリトルエンディアンが使いづらいと言う以上、
ビッグエンディアンがリトルエンディアンに勝っている環境に依存した点が存在するはずだろ。
それが何なのか教えてくれと聞いているだけ。
俺はいままでリトルエンディアンは賢いなと思ってた事は数多くある。
でも、ビッグエンディアンは便利だなと思ったことがないからな。そこが疑問になったわけ。
まぁ、C言語の範囲からはどうみても外れるからもういいや。ゴメン
817 :
デフォルトの名無しさん :2006/08/19(土) 18:57:13
>ビッグエンディアンがリトルエンディアンに勝っている環境に依存した点が存在するはずだろ。 どっちもどっちということもあるな だが、それでは「使いにくい二もほどがある」という主張は通らない
>>795 が言ってるが、16進ダンプ眺める場合BIGのが直感的でわかりやすい。慣れの問題だが。
BIG/LITTLEどっちでも動くCPUがけっこうある(MIPSとかARMとか)ことから、CPUにとっては些細な問題なのだろうが
ならば「統一してくれ」という意見ももっとだ。ISO9660の仕様なんかは悲惨すぎる。
ごもっと。
>>818 > ISO9660の仕様なんかは悲惨すぎる。
しかもアライメントを合わせていないから結局1バイトずつ読まなくてはならず
両方のインデックスを持っている意味がないという間抜け仕様
821 :
デフォルトの名無しさん :2006/08/20(日) 02:16:06
ステキ仕様♥
822 :
デフォルトの名無しさん :2006/08/20(日) 22:55:50
case文の値に他のファイルで定義した const int を使用したいのですが どうしたらよいでしょうか
>>822 無理。 case に指定する値は定数式じゃないと駄目。
残念ながら他のファイルで定義した const int は定数式になれない。
const int を #define で置き換えられればいける。
824 :
822 :2006/08/20(日) 23:18:19
>>824 ありがとうございました。
if〜else ifにしました。
これだとbreak;なしの連続処理が出来ないですけど
仕方ないです。
C++なら、ヘッダでconstを付けて定義すれば、それを定数として扱えるはず。
826 :
822 :2006/08/20(日) 23:30:10
>>825 さん
extern 宣言の方にも const 付けているんですけどね…。
値は別の定数 + 定数というものなので define だとだめなんです。。
ビットフラグじゃあかんの?
enumは?
>>826 define だと駄目な理由になってないような気がする。
830 :
デフォルトの名無しさん :2006/08/21(月) 02:18:13
【就職】「中韓などアジアの優秀な人材を、もっと日本企業に」 留学生2000人に無償奨学金月20〜30万円…経産省・文科省[08/20]★7
1 :試されるだいちっちφ ★ :2006/08/21(月) 00:42:25 ID:???0
★アジア留学生に奨学金、日本で就職促す 2千人に国支給
中国、韓国などアジア諸外国の優秀な人材に、日本企業にもっと入ってもらおうと、
日本の大学で学ぶ留学生への無償奨学金制度を07年度から経済産業・文部科学
両省が始める。大学・大学院に、採用意欲のある企業と提携して、留学生向けの専門
講座やビジネス日本語講座などの2年間の特別コースを新設してもらい、その受講生
1人あたり、住居費分、学費免除分、生活費など月計20万〜30万円相当の支給を
検討中だ。支援対象は約2000人を想定している。
特別コースは企業の中核を担える人材の育成が目標で、電機・IT業界、環境関連
産業など特定分野の企業群と提携し、それらのニーズにあった専門性の高い授業を
想定。また、留学生の日本企業就職率が伸びない理由となっている、日本語の力不足
や企業風土の特徴をあまり知らないことなどを解消するため、特別コースには実用性
の高い日本語会話の授業や日本の企業文化などを教える授業のほか、インターンシップ
制度も盛り込んでもらう。両省が授業内容を審査し、奨学金制度を適用するかどうか
決める。
両省は関連予算として07年度予算の概算要求に約60億円を盛り込む方針。この中
には、同じ目的で、既存の国費留学制度を使っている留学生らが無料参加できる就職
支援プログラムも加わる。
経産省によると、04年度は約3万人の留学生が日本の大学・大学院を出たが、日本
国内で就職した留学生は約5700人にとどまった。留学生支援策の拡充で、アジアの
優秀な人材の定着を増やそうとしている。
朝日新聞 2006年08月20日06時24分
http://www.asahi.com/job/news/TKY200608190397.html 前スレ(立った日時:2006/08/20(日) 07:02:40)
http://news19.2ch.net/test/read.cgi/newsplus/1156074203/
831 :
jyo :2006/08/21(月) 13:51:39
計算トレーニングプログラムを作成したいですが? 計算は、足し算、引き算、掛け算、割り算を選択する。 桁数は1桁、2桁をはじめに選択する。 計算式の数値はランダムで表示する。 計算式及び、答えを配列に保存し、終了後に全て計算式と答えを表示する。 問題は10問とする。 そのときの点数を表示する。 結果表示の時、一緒にかかった時間も表示する
832 :
デフォルトの名無しさん :2006/08/21(月) 14:07:46
>>831 そうか、じゃ作れ
=== 終了 ===
>作成したいですが? 質問の全てを「?」に集約されても、何を訊きたいのか判らない。
>>833 きっと、「作成したいですか?」のTypoだよ。
835 :
デフォルトの名無しさん :2006/08/22(火) 13:25:00
2-3木への挿入の関数insertは、2つの節点a,bの、a以下とaからbの間とb以上で場合分けしてそこからまた再帰的にinsert関数使うんでしょうか?
ただの分木ならどこにでも挿入していいはずだが。 ちゃんと説明しろ。
837 :
jyo :2006/08/22(火) 15:56:43
教えるなら教えるえらそうな顔するなぼげ
教えるつもりは毛頭ない。
839 :
デフォルトの名無しさん :2006/08/22(火) 18:23:31
プログラムに与えた引数をうまく保管しておいて、その後の処理でスマートに使いたいのですが、 皆さんどのようにされていますか? 何らかの構造体とか定義しておいて、その中に、引数の情報を保管しておくとか、そういう作戦が よいですか? 今までは、自作のgetopt()みたいなのを、作っていて、それでやっていたのですが、 本物のプログラマーの皆さんはどんな方法でやられているのか、お教え願いたいです。 よろしく。特に、複数のプロジェクトがあっても、汎用的に使えるような 方法があれば、お教え願いたいです。
出たな偽物
841 :
デフォルトの名無しさん :2006/08/22(火) 20:31:27
今週の始めに、やさしいC入門っていうのを買ってきたのですが そのなかに、小さい型への代入と言うのがありキャストをしているのですが サンプルでは float a=10.5; int b; b=a; みたいなことをやっています。 これだと、小数点以下が切り捨てられるだけなのですが int a=100000; short int b; b=(short)a; とすると、わけの分からない数字が出ます。 これは何故なのでしょうか? その本には小さい型に代入すると、情報が一部失われると書いていますが 全く違う数字になっています。
>>839 初期設定の読み込みと書き込みが出来るクラスつくる。まず初期設定読み込んでから
引数で上書きできるようにする。場合によりけりだけどな。
ただしおれはニートだ。
一部失われてるから
186a0 => 86a0
>>841 小さいほうの型で表すことができる値の範囲から外れている場合、結果は不定。
どんな値になってもおかしくはない。
ポインタのポインタとかポインタのポインタのポインタとかってあるじゃないですか。 あれって、いくつ上のポインタを参照してもちゃんとアドレス持ってるんですか? 物理的なイメージがわかないんだけど。。ポインタのポインタくらいならわかるけど
>>847 「上」「アドレス持ってる」の意味がわからん。
850 :
デフォルトの名無しさん :2006/08/22(火) 23:36:02
>>847 いちばん(・∀・)イイ!!のは、ハードウエアでデコーダ作ってみること
74393 と 74139 と LED マトリクスで何か表示させたりしてみると
アドレスって根本的に本質的に何なのかを体でおぼえることができる
>>847 ポインタ
ポインタが指す先にある中身を見ると、実データが入っている
ポインタのポインタ
ポインタのポインタが指す先にある中身を見ると、実データが入っている
ポインタは、「ポインタのポインタ」のアドレスを指し示している
ポインタのポインタのポインタ
ポインタのポインタのポインタが指す先にある中身を見ると、実データが入っている
ポインタのポインタは、「ポインタのポインタのポインタ」のアドレスを指し示している
ポインタは、「ポインタのポインタ」のアドレスを指し示している
ポインタのポインタのポインタのポインタ
ポインタのポインタのポインタのポインタが指す先にある中身を見ると、実データが入っている
ポインタのポインタのポインタは、「ポインタのポインタのポインタのポインタ」のアドレスを指し示している
ポインタのポインタは、「ポインタのボインタのポインタ」のアドレスを指し示している
ポインタは、「ポインタのポインタ」のアドレスを指し示している
僕のちんこもポインタになりそうです
ポインタを安易にアドレスに結びつける説明は疑ったほうがいい。 たとえばアドレスはそこにあるデータの型について無頓着だ。
854 :
デフォルトの名無しさん :2006/08/22(火) 23:56:40
>>851 ちと違わね?
ポインタ
「ポインタ」が指す先にある中身を見ると、実データが入っている
ポインタのポインタ
「ポインタ」が指す先にある中身を見ると、実データが入っている
「ポインタのポインタ」には、「ポインタ」のアドレスが入っている
ポインタのポインタのポインタ
「ポインタ」が指す先にある中身を見ると、実データが入っている
「ポインタのポインタ」には、「ポインタ」のアドレスが入っている
「ポインタのポインタのポインタ」には、「ポインタのポインタ」のアドレスが入っている
ポインタのポインタのポインタのポインタ
「ポインタ」が指す先にある中身を見ると、実データが入っている
「ポインタのポインタ」には、「ポインタ」のアドレスが入っている
「ポインタのポインタのポインタ」には、「ポインタのポインタ」のアドレスが入っている
「ポインタのポインタのポインタのポインタ」には、「ポインタのポインタのポインタ」のアドレスが入っている
>>849 >>850 メモリ上でどういったことをしてるか物理的に理解するべしってことですよね。。
ハードウェアでデコーダを作る…すいません何をすればいいのかすらわかりません。。
アセンブラは興味あるんでちょっとかじってみようかなとおもいました。
>>851-855 なんとなく実態のばしょ差しているって言うのはわかるんですが、Cだとポインタ型って定義すると
領域が確保されて数値が入るじゃないですか。てことはポインタのポインタにも、
ポインタのポインタのポインタにもポインタのポインタの…にも領域が確保されてるのか??
でもそれだといくらメモリがあっても足らないからそんなわけないし…
じゃあポインタのポインタのポインタの…x100のアドレスの数値が入ってる領域って
一体どこにあるんだ〜って思った次第です。こういうの理解されてる方からしたら
何いってるんだこの人って感じなのかもしれないです
>>856 > ポインタのポインタのポインタにもポインタのポインタの…にも領域が確保されてるのか??
確保されてるっつーか、確保しなきゃならねえんだから、億劫がらずにmallocしてやれよ
> でもそれだといくらメモリがあっても足らないからそんなわけないし…
ポインタのポインタの…を何重までやれるかっつーのは処理系によるような気がするが
その気になりゃヒープの限りメモリの限り、そのポインタのポインタの…にmalloc
できるんじゃね?
>>856 何いってるんだこの人。別スレでやってほしいかなぁ。
日本語でおk
そういや、ポインタとアドレスには何の関係もないって暴れてた奴がいたよなぁ
オレは、理解なんかしなくていいと思う そう、理解なんかしなくても使えればそれでいいんだ
ポインタ プログラム上で使用する、何らかのオブジェクトを指し示す為の値。 ポインタのポインタ ポインタの内、指し示してるオブジェクトがポインタであるもの。
まさに「何いってるんだこの人」てかんじなのだが。おそらく正攻法の説明では847を救うことはできまい。
誰かエスパーのひと
>>847 >>856 の頭の中身を解説してくだしい。
execl関数について教えて下さい。 execl関数のマニュアルを読むと、 The exec family of functions replaces the current process image with a new process image. とあります。 直訳すると、現在のプロセスイメージを新しいプロセスイメージに置き換える。 ということになると思います。 いまいちよくわからないのですが、 execl関数を使うシュチュエーションってどういう状況があるでしょうか?
おそらく
>>856 は
int *p;
と宣言するとポインタ以外にint型の領域も一緒に確保されると思ってる初心者。
だめだこりゃ
>>864 UNIX系OSは今でもinit以外のすべてのプロセスはfork()+exec()で作られてんじゃね?
windowsではほとんど使うこと無いなあ。あるプロセスの環境変数変えて実行したいとかstdoutを強制的に
ファイルにして実行したいとかかな。
>>864 環境依存スレに池。標準Cにexeclなんて関数はない
MSDNには Visual C++ 2005 では、この POSIX 関数は使用しないでください。代わりに ISO C++ 準拠の _execl を使用してください。 て書いてるな。標準って難しいぜ。
870 :
デフォルトの名無しさん :2006/08/23(水) 10:39:07
>845 >case by case やはり、そうですかね。 でも、何かうまい方法があるのではと、期待していたのですが。 。。。
>>839 C++ 的にはプログラム全体を統轄するクラスに保持しとくことになるんだが、
C 的にはグローバル変数に保持しとけばいいんじゃないかと思う。
872 :
デフォルトの名無しさん :2006/08/23(水) 11:26:11
コマンドプロンプトが C:\Documents and Settings\○○(本名)> なんですが、テキスト(10日でおぼえるC言語入門教室)は D:\> なんです。この違いは何なのでしょうか。 本名表示されているのですがセキュリティ上大丈夫ですか?
ハゲワラ
>>872 その○○はPCのユーザ名。
詳しくはWindowsのコマンドプロンプトについてだから、板違い。
本買うなりググるなり聞くなりしろ。
>>870 どんな状況でも上手く出来る方法など、ある訳がない。
実生活の話などに置き換えて考えればわかるはずだ。
876 :
デフォルトの名無しさん :2006/08/24(木) 14:51:22
質問です。 main(int argc, char *argv[]) で、各argv[0], argv[1], argv[2] ,,,,が受け取れる文字列の長さ には上限がありますか?
>>876 ない
が、渡す側(シェルとかコマンドプロンプト)には限界がある。
そっちは環境依存なので違う板で聞くといい
878 :
デフォルトの名無しさん :2006/08/24(木) 17:38:16
ハード的に。
何がだ。
880 :
デフォルトの名無しさん :2006/08/24(木) 21:06:54
881 :
856 :2006/08/24(木) 23:27:25
根本的な勘違いをしてました int n; &&&&&…&n; でnのポインタのポインタの…ぽいんたのアドレスが取れるとなぜか思ってました。 やってみたらできなかったです。どうもすいません
882 :
デフォルトの名無しさん :2006/08/24(木) 23:55:10
>>876 仮にその「上限」がわかったとして
その値に依存するコードは間違いなくクソ
ポインタ越しに文字列操作するのってどうやるんでしょうか? void main(){ int score=200; char str[100]; MemoryNewScore(score,str); printf("%s",str); } void MemoryNewScore(int score,char *str){ char newstr[100]; time_t t; t = time(NULL); sprintf(newstr,"%d\t\t%s\n",score, ctime(&t)); str=newstr; } こんな感じに書いたけどうまくいかない。
>>883 最後に strcpy(str, newstr) を入れる。
885 :
デフォルトの名無しさん :2006/08/25(金) 00:25:26
文法上のイディオムばかり暗記しまくっても それらから本質に帰納できるかどうかは当人の天才的ひらめきに強く依存する
>>883 ていうか
void MemoryNewScore(int score,char *str){
time_t t;
t = time(NULL);
sprintf(str,"%d\t\t%s\n",score, ctime(&t));
}
でいいんちゃう?駄目なのかな
>>885 天才的ひらめきっつーか、暗記したものを組み合わせて自分が目的とするものへと
応用していけるかどうか、だろうな
暗記なんてしなくってもよく、自分が必要としているネタがどの本に、とかどのURLに
書いてあったかを憶えていれば問題ないだろ
それが、プログラムを作っていける(どんな言語でもどんなソースでも構わないけど)か
作っていけないかを分ける「センス」っつーやつなのではないかと
>>884 の方法でもいいけれど、
そもそもMemoryNewScore関数内で
char newstr[100]; とローカル変数を用意する必要がないのでは。
sprintf(str,"%d\t\t%s\n",score, ctime(&t));
}
じゃいかんのか、と。
もちろん
static char newstr[100];
でもできるけれども、出力引数を使い、データを格納する領域は
関数呼び出し元が確保しておくのが自然のような気がする。
889 :
デフォルトの名無しさん :2006/08/25(金) 00:34:54
本質や根底は必要ないという主張は伝わったよ 同調はできないが
>>883 滅茶苦茶だな。
引数をローカル変数のアドレスで上書きするだけで何が起こると思ってるんだか。
とりあえず本棚は用意した方がいいと思うぞ。
893 :
デフォルトの名無しさん :2006/08/25(金) 10:53:50
2つのテキストファイルの内容を比較し、同じか違うかだけを判定したいのですが、 ファイルサイズ分の文字列を用意してガバっとfread後、strcmpで出来ますか? それともおとなしくDOSコマンドfcとかを呼び出した方が確実でしょうか?
>>893 1文字ずつ取得して比較するのをwhileでまわせばいいんでないか
intだからifだけでいけるし
文字単位でやるか行単位でやるかは自由だが、
>>893 みたいにファイル全部メモリに読み込むってのは
無茶だろう。
>>895 ファイル全部メモリに読み込むのが無茶かどうかは時と場合によるだろ。
まあ俺ならファイルサイズ比較して、ハッシュ比較して、 その後ようやく全部比較し始めるけどな。
898 :
デフォルトの名無しさん :2006/08/25(金) 12:19:53
894-897 ありがとうございます。緊急だったので助かりました。 ひとまず1文字ずつ比較しましたが パフォーマンス見ながらいろいろやってみます。 やはりサイズ→タイムスタンプ→ハッシュ比較が一般的のようですね。 ちょっと調べてみます。
>>898 タイムスタンプは内容と関係ない。
あと、ハッシュをどうやって計算しているかも考えろ。
int num[4]; という配列があって、これには0〜63のうちの4つの数字(重複有)が入っています。 この中の2番目に大きい値と3番目に大きい値を表示しようと考えているのですが、どうしたらよいのでしょうか。 要素が4つしかないのにわざわざソートするのも大仰なんで、できればそれ以外の方法でお願いします。
void func(int ary[2]={int a,int b}){} int main(void) { int a=0; int b=1; func(a,b); return 0; } こういうような、関数を呼ぶ側では変数を渡して、関数側ではそれを配列の要素として受け取るようなことってできますか?
コンパウンドリテラル=C99
904 :
902 :2006/08/25(金) 16:07:26
>>903 まさにこれでした。
ありがとうございました。
>>901 わざわざソートしない方法を考えるのも大げさなんで、できればソートする方法でお願いします。
1,2,2,2 のとき、1番大きい値は 2 で、2番目に大きい値といったらやっぱり 1 だよな?
vc と gcc で printf("%s", 0); の出力が "(null)" になる事を知って驚愕。 この挙動は実装依存ですか??
907 :
デフォルトの名無しさん :2006/08/26(土) 00:27:27
>>901 ソートする方法と
ソートしない方法の
両方を検討することこそ、
そ の 宿 題
のテーマじゃないのか?
>>906 いや、未定義だろ。
と思って規格を見たんだが、
"the argument shall be a pointer to the initial element of an array of character type."
となっていて、ヌルのときの動作は特に書いてなかった。
まぁ、未定義なんだろうな。
某ネトゲで、(null)って名前のアイテムがあって 初めて気が付いた俺がいる。
910 :
906 :2006/08/26(土) 01:12:57
>908 確かにページフォルトか何かで死んでもしょうがない感じですね。 規格書を調べて頂いて、ありがとうございます。
DOSの時代はNULLに書き込んでも落ちなかったな。 それで、プログラムが終了するときに、ご丁寧にNULLに書き込んでますよってメッセージがでるの。
>>911 メモリモデルによる。
データがfarまたはhugeポインタなら落ちることもあった
>>911 そのためにデータセグメントの最初の8バイトは予約されていたわけだな。
つーか、当時のOSはアクセス例外なんて対応してなかったのさ。
>>869 それは処理系定義の関数は「_」1文字で始めなければいけないという意味であって、
_execl 自体が ISO C++ で規定されているわけではない。
915 :
デフォルトの名無しさん :2006/08/26(土) 09:15:56
a[10]={1234567890}って十個配列があったとします。 1234567890 ↓↓↓↓↓↓↓↓↓↓ 4567890ヌヌヌ ヌ=NULL 上記みたいに3つ横にずらしたいと思っているのですが 何かいい方法はありますか?
一番いい方法は宿題スレで聞くこと
917 :
デフォルトの名無しさん :2006/08/26(土) 09:20:15
了解
宿題スレに誘導するな。テンプレがないとあそこは答える物好きが 少ないからな。
>>918 安心しろ答えておいた。言語指定がないからC++だけどなww
? 理由との間につながりが見えんな
つか見当違いな解答してるな 無能乙
922 :
デフォルトの名無しさん :2006/08/26(土) 10:14:10
>>914 処理系定義の関数って何だ?
しかも、C スレで ISO C++ とは??
923 :
デフォルトの名無しさん :2006/08/26(土) 18:52:05
foo(const char *x, ...) な関数の中から、 bar(int a, int b, const char *x, ...) という関数を呼ぶにはどうすれば良いのでしょうか? ; 以下のようなマクロの仕様は避けたいです。 #define foo(略
924 :
デフォルトの名無しさん :2006/08/26(土) 19:07:05
foo(const char *x, ...) { bar(0, 0, x); }
va_list
926 :
923 :2006/08/26(土) 19:28:42
>>924 それだと foo("x", 1, 2) のように呼び出したときにうまくいきません。
>>925 bar が va_list を引数にとる場合はそれで良いと思うんですが、そうじゃなく
て ... の場合、どうやるんでしょうか?
>>926 int arg1, arg2;
va_list args;
va_start(args , 2);
arg1 = va_arg(args , int);
arg2 = va_arg(args, int);
va_end(args);
bar(arg1, arg2, x);
928 :
927 :2006/08/26(土) 19:39:13
あ、勘違い。取り下げる。
929 :
927 :2006/08/26(土) 19:40:48
俺だったら、そんなあちこちに可変引数を取る関数があるなら、 int argc, char* argv[] を仮引数にするな。
930 :
923 :2006/08/26(土) 19:43:19
えっと bar の方はライブラリの関数で変更不可で、
printf のようなフォーマットを行う関数なので
>>929 のようなインターフェースも避けたいです・・・
>>930 だったら、defineでやるしかないよ
>>926 そういうことになるから、可変個引数を取る関数は、
printf/vprintfのように...とva_listのそれぞれを引数にとる版、両方定義するのが鉄則。
933 :
デフォルトの名無しさん :2006/08/26(土) 21:47:05
>>930 >えっと bar の方はライブラリの関数で変更不可で、
そんならアセンブラだな
綺麗事いっててもベンダが仕様を変えてくれるまで納期は待ってくれないだろ
アセンブラだとどうやれば出来るのかわかってるかい?
「アセンブラだと何でも出来るから、とりあえずアセンブラと言っておく」
みたいな人もいるから困るね。
>>930 スタックフレームを、丸ごとそのままコピーすればよい。
多少でも規格に沿うようにしたいのなら、
va_listで受けて、必要充分な数のint変数に代入し
それを全て引数としてbar()に渡すという手がある。
また、「規格には沿わないが、現存する普通の処理系なら問題ない」という
レベルで良いならば、
va_argで大きな(例えばint20個)サイズの構造体を受け取ったことにして
それをそのままbarに渡せばよい。
935 :
923 :2006/08/26(土) 22:19:45
> va_argで大きな(例えばint20個)サイズの構造体を受け取ったことにして > それをそのままbarに渡せばよい。 これでいきたいと思います。皆さんアドバイス有り難うございました。
936 :
デフォルトの名無しさん :2006/08/26(土) 22:25:17
>>934 フレームポインタがあることを前提に話しているようだが・・・
俺ならアセンブラで・・・ より、ずっとまともな回答でしょ。
938 :
デフォルトの名無しさん :2006/08/26(土) 22:58:07
>また、「規格には沿わないが、現存する普通の処理系なら問題ない」という 互換性の範囲も想定せずに「普通の処理系」とか言ってる頓珍漢の何が「まし」なのか知らんが 痛いコード書いてそうだな
と、 「アセンブラで」「納期が」 という痛いことを言うだけで、何の解決策も示せなかったくせに 「フレームポインタがどうの」といちゃもんをつけることだけに腐心している 最底辺のコーダーが申しております。
「納期が迫ってるんだからアセンブラで書けよ」と言ってる事からすると 「必要が無いのにアセンブラで書く」のは「痛いコードではない」というわけですね。
942 :
939 :2006/08/26(土) 23:12:35
悔し紛れの書き込みをしているのがどちらなのかなんて、一目瞭然でしょ。
>>936 >>938 可変引数の受け渡しに、スタックを使っていない処理系を挙げていただけますか?
俺は今まで見たことがありませんので。
この痛さは、他スレでもよく見かけるよな。
946 :
デフォルトの名無しさん :2006/08/26(土) 23:25:04
>>944 あー、フレームポインタを知らなかったのか
あのー、「フレームポインタ」と「スタックフレーム」は違いますが。
フレームポインタを最適化で省略しても、
>>934 のやり方は正常に動きますよ?
ところで、あなたのお勧めの「アセンブラ」とやらでは、どうやって解決するんですか?
>>934 と同様の方法以外に無いと思いますが。
もし、引数を追加しないで済むのであれば、ジャンプ一発で済むでしょうけどね。
でも、
>>923 は追加してますよ。
948 :
デフォルトの名無しさん :2006/08/26(土) 23:36:31
>va_argで大きな(例えばint20個)サイズの構造体を受け取ったことにして ^^^^^^ ↑ こういう変な仮定をせずに済むように用意されているものだが・・・
それもこれも可変個引数しか用意していない 糞ライブラリが全部悪いんじゃ〜ヽ(`Д´)ノ はい、次の方どうぞ〜
すみません、具体的なコードを教えてもらえますか?
>>948 アセンブラだと、その仮定をせずに解決できるのか?
えっと、 >スタックフレームを、丸ごとそのままコピーすればよい。 を具体的にどう書くのか知りたいのですが・・・
>>952 その具体的なやり方が、続きに書いてある内容だろ。
>>953 >va_listで受けて、必要充分な数のint変数に代入し
>それを全て引数としてbar()に渡すという手がある。
これですか?intにおさまらない型の場合もあると思うのですが。
いや、別に収まらなくても大丈夫だろ。 変数の中身を書き換えるわけじゃないんだから、複数個のintに分割されるだけ。 もちろん、intの受け渡しにパディングが入るようなら問題だが 普通はそうならない型がintになるように、処理系は作られている。
以前どこかで、 myprintf(const char* format, ...) の中で、formatと...をprintfに渡すテクニックを見たことがあるような気がするけど、 思い出せないし、見つからない・・・。
>>955 なるほど、そうなんですか。
ありがとうございました。
958 :
デフォルトの名無しさん :2006/08/27(日) 00:09:43
>普通はそうならない型がintになるように、処理系は作られている。
>>923 の処理系が何かを確認せずに言ってるんだよな、この人・・・
>>958 いちいちうざいな、こいつ
問題になる処理系を知ってるなら書け
960 :
デフォルトの名無しさん :2006/08/27(日) 00:20:03
忠言耳に逆らう
962 :
デフォルトの名無しさん :2006/08/27(日) 00:22:20
そのような機能はサポートしていません
>>958 ・アセンブラでの解決法(
>>948 の制限をなくす方法)
・可変引数の受け渡しにスタックを使わない処理系
さっさと書いてくださいよ。
口だけで何言っても、説得力ゼロですよ。
965 :
デフォルトの名無しさん :2006/08/27(日) 00:25:21
>・アセンブラでの解決法(
>>948 の制限をなくす方法)
おいくらで?
>・可変引数の受け渡しにスタックを使わない処理系
これはあなたが何の脈絡もなく突然言い出したことで
こちらにはいかなる責任関係も存在しないものと判断しています
必死さだけは伝わってくるんだけどね、説得力がね。
逃げたw
いや、もうそろそろ「完全勝利宣言」が出るよ。
969 :
923 :2006/08/27(日) 00:27:18
なんか私の質問がきっかけでもめてしまってすみません・・・
気にするな
971 :
デフォルトの名無しさん :2006/08/27(日) 00:29:45
挑発してもだめです ちゃんとお代を頂いているお客様とあなたたちは違います コードを書いて欲しければ正式に商談をして下さい
もう
>>923 は納得したんだろ?
はい次の質問ドゾー。
>>971 どこの会社ですか?
プライドだけは高くても、それに能力が追いついていない
そんな無能が偉そうな顔をしている会社とは、取引をしないよう啓蒙していく必要があるので
是非会社名を教えてください。
まさか個人じゃないですよね?
あーあ、こいつもうざいな。
975 :
デフォルトの名無しさん :2006/08/27(日) 00:52:44
営業妨害を予告する人に協力する必要がどこにあるのかもわからない人は 別な意味で苦労が多そうですね
976 :
デフォルトの名無しさん :2006/08/27(日) 00:55:00
もっとも、コードの規模と用途からして仮に真面目に商談させて頂いても ご用命いただけるような金額にはならなさそうですが・・・・
最後に書かないと気が済まないんだね。 中身の無い書き込みだけで、勝ったつもりになりたいから。
自分でもわかってるけど プライドが邪魔してるんだよね。かわいそうに。
979 :
デフォルトの名無しさん :2006/08/27(日) 01:01:04
ごめ、ちょっと酒はいっててアフォやっちまった
日本人のメンタリティじゃないな。多分朝鮮人だろう。
981 :
デフォルトの名無しさん :2006/08/27(日) 01:28:35
うげー、差別意識まで持ち出したぞ、こいつ・・・・ 技術的なやりあいで主張がとおらなかったからってそこまでするかよ 恐れ入った
主張が通らなかったって何のことだろう? 技術的なやりあいって、何一つ実証できない妄言を垂れ流して 実例を挙げろといえば逃げること?
983 :
デフォルトの名無しさん :2006/08/27(日) 01:50:19
少なくともコードを示して貰えないという入力に対する出力が朝鮮人になるような ぶっ壊れたロジックが有用と評価された流れは見あたらないようだが・・・
984 :
デフォルトの名無しさん :2006/08/27(日) 01:59:03
商談がまとまらないたびごとに相手方を中傷するようなことを繰り返していると 別な意味で苦労が多そうだね
なんか全部同一人物が書いてると思ってるみたいだし。
986 :
デフォルトの名無しさん :2006/08/27(日) 02:06:04
自演と分身を使い分けながら差別用語を織り交ぜた恫喝を繰り返すパターンは この前、公の席でジャップ発言してたバカたれとやり口が似てるんだよな
悔しくて眠れないんだね。 恥の上塗りを繰り返すからいけないんだよ。
988 :
デフォルトの名無しさん :2006/08/27(日) 02:17:55
>va_argで大きな(例えばint20個)サイズの構造体を受け取ったことにして ^^^^^^ ↑ 上塗りする必要もないほどの赤っ恥もあったがなw わずか数行のアセンブラを他人に依頼するようなら仕方ないが
989 :
デフォルトの名無しさん :2006/08/27(日) 02:22:24
ここはCスレだが、それを差し引いてもひどい無知・・・までは構わんが、痛い態度が格好のおもちゃなんだよ
誰のことだろう?
>>956 vprintf()というオチではないだろうか?
この程度の大きさならmallocで確保するより、ある程度の大きさをもった配列を宣言したほうがいい などのように書かれた文献をいくつか見かけたのですが、この「この程度」というのはだいたいどのくらいなのでしょうか? int型で10,000くらいまでは「この程度」のうちに含まれることを確認しているので、1,000,000くらいかな、と思っているのですが
>>992 なんで自分が確認してる数値よりも100倍も大きいと思うの?
なんとも奇々怪々な話だな
次スレ頼む
あんたら埋めなさいよ
埋め
(*´Д`)y−~~~ウマー!
1000ならANSI撲滅
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。