C言語なら俺に聞け(入門篇) Part 10
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/03/19(月) 16:45:25・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 9
http://pc11.2ch.net/test/read.cgi/tech/1173284217/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 http://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 http://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 http://pc11.2ch.net/test/read.cgi/tech/1171946674/
関連スレ
C/C++の宿題を片付けます 84代目
http://pc11.2ch.net/test/read.cgi/tech/1172981618/
くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc11.2ch.net/test/read.cgi/tech/1170338926/
【初心者歓迎】C/C++室 Ver.35【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1171888583/
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
0153152
2007/03/28(水) 20:49:36array全体が一塊で割り当てられているときは152の計算でいける。
まあ、そうでなくて、
array = (int***)malloc(2*sizeof(int**))
array[.] = (int**)malloc(4*sizeof(int*))
array[.][.] = (int*)malloc(6*sizeof(int))
みたいになっていたとしても、やはり最初の添え字サイズは必要ない。
0155デフォルトの名無しさん
2007/03/28(水) 20:54:15たいていのコンパイラはint array[2][4][6];って宣言してたらまとまった領域を割り当てると思うがな
0156デフォルトの名無しさん
2007/03/28(水) 20:57:33147は
int array[2][4][6];
と宣言した場合の質問をしているんだよな。
0157デフォルトの名無しさん
2007/03/28(水) 20:59:30「添え字の計算」というのは例えばarray[0][1][2]みたいにindexが与えられた時に
それはメモリ上のどこにあるのかを計算するって意味だ
その計算には配列の最初の次元の大きさは必要ないよってK&Rは言っている
0159147
2007/03/28(水) 21:06:46あ、array[1][3][5]の添え字計算だと(1)*4*6+(3)*6+(5)みたいに
当然(式の中の)最初の添え字の1も含めて1,3,5は当然使うし
元の宣言にある4と6も使うけれど、同じく元の宣言の中にある2は使わないってことですね
ようやく分かりました、皆さんどうもありがとうございます
0160デフォルトの名無しさん
2007/03/28(水) 21:10:185という情報は要らない(要るのはintという型情報)、ってだけ。
0161デフォルトの名無しさん
2007/03/30(金) 01:20:50何分↓スレに専門知識を持った人間がおらず、真偽が分からなかったので
ここで質問させていただきました
558 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:06:29 ID:ENSP49sq
そうだ
一応書いておくわ
CとかJavaとか言語でわけてる現状がそもそもおかしいから
ソースコード翻訳機作ってやってるよ
おまえも参加しろwww
役に立たない下っ端を使えるようにする秘策だぞwwww
561 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:12:11 ID:ENSP49sq
意味分からないのか??
コンパイラじゃなく
ソースコードをそれぞれに変換するってことだぞ
意味分からないかな??
564 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:14:33 ID:ENSP49sq
たとえば
Cで書いたコード100万行を
自動変換で
Javaコードに変換するって奴だwwwwww
分かるかな???
ttp://human6.2ch.net/test/read.cgi/dame/1174933496/l50
0162デフォルトの名無しさん
2007/03/30(金) 01:26:14多少手作業部分やなんらかの制限等は生まれるだろうが、
いったいどこに本質的に不可能だとされる可能性があるんだ?
0163デフォルトの名無しさん
2007/03/30(金) 01:26:470164デフォルトの名無しさん
2007/03/30(金) 01:31:45まずCへ翻訳してからコンパイルしていた。
0165デフォルトの名無しさん
2007/03/30(金) 01:47:21でも、たとえば、Win32とか、BarkleySocketに依存していたら、
ライブラリの流儀をJavaに直すのは難しすぎる。
ましてやハードを叩いてたりすると。
0166デフォルトの名無しさん
2007/03/30(金) 01:49:53お前らなにマルチにマジレスしてんだ?
0167デフォルトの名無しさん
2007/03/30(金) 17:38:14全く関係ない所でアプリケーションエラーで終了するようになったのですが、
メモリ不足でしょうか。mallocとか面倒だけどしないとだめでしょうか。
><わかんないんです。おしえてください。
0168デフォルトの名無しさん
2007/03/30(金) 17:41:38エラー貼ってみて
0169デフォルトの名無しさん
2007/03/30(金) 17:44:12ソースplz
0170デフォルトの名無しさん
2007/03/30(金) 18:07:21アプリケーション エラー
エラーが発生したため、(ファイル名).exeを終了します。プログラムをもう一度開始する必要があります。
エラーログを作成しています。
>>169
3000行超えちゃうので無理です><
とりあえずグローバル変数宣言だけで50行で、
int型の要素が100個ぐらいの配列と、
char型で256文字入る配列を4個ほど宣言してあります。
0171デフォルトの名無しさん
2007/03/30(金) 18:09:220172デフォルトの名無しさん
2007/03/30(金) 18:09:570173デフォルトの名無しさん
2007/03/30(金) 18:15:31グローバル変数にしないと各関数の引数に変数や配列のポインタを
10個ぐらい渡さないといけなくなっちゃうんで…
大小まとめて数えて関数を30個ほど作ってあるので大変です…。
0174デフォルトの名無しさん
2007/03/30(金) 18:17:2810分の1くらいにおさえたら、どうか?
0175デフォルトの名無しさん
2007/03/30(金) 18:17:42釣りうぜえ
さっさとソース&エラーうpしろやクズが
0176デフォルトの名無しさん
2007/03/30(金) 18:19:130177デフォルトの名無しさん
2007/03/30(金) 18:20:56お騒がせいたしました
0178デフォルトの名無しさん
2007/03/30(金) 18:25:53皆さん、本当にありがとうございました
0179デフォルトの名無しさん
2007/03/30(金) 18:32:16キレすぎだろw
0180デフォルトの名無しさん
2007/03/30(金) 18:43:32結果的に「釣りだった」という見解が・・・
0181デフォルトの名無しさん
2007/03/30(金) 18:45:46気づきにくいという典型例だな。
0182デフォルトの名無しさん
2007/03/30(金) 19:06:360183デフォルトの名無しさん
2007/03/30(金) 19:13:300184デフォルトの名無しさん
2007/03/30(金) 19:21:42次からはよくつかう変数を
構造体に詰め込むことにします><
苦手意識のせいで気付かなかったです
アドバイスありがとうございました
0185デフォルトの名無しさん
2007/03/30(金) 19:28:48もしマジレスだったなら、謝る必要はないよ
0186デフォルトの名無しさん
2007/03/30(金) 19:29:58続けることが大事だから頑張って!^_^;マジレスならね・・・
0187デフォルトの名無しさん
2007/03/30(金) 19:33:40>>173でいうように関数が30個って少なすぎね?
もうすこし論理的意味単位で分割した方がいいと思うよ。
0188デフォルトの名無しさん
2007/03/30(金) 19:38:02呼ぶ側と呼ばれる側の関数だけからなるファイルを作って、
呼ばれる方はstaticにする。
0189デフォルトの名無しさん
2007/03/30(金) 19:38:30lccで行数の多い関数が入ったファイルをコンパイルすると
out of memory
とエラーが出るのですが
関数を短くしないといけないのでしょうか?><
0190デフォルトの名無しさん
2007/03/30(金) 19:41:500191デフォルトの名無しさん
2007/03/30(金) 19:43:11LSICを使っているのなら、窓から投げ捨てろ。
あれは、関数を評価する為のコンパイラが使用するメモリ空間をたった32KBだか64KBだかに抑えている。
0193デフォルトの名無しさん
2007/03/30(金) 19:54:310194183
2007/03/30(金) 20:02:130195デフォルトの名無しさん
2007/03/30(金) 20:03:360196デフォルトの名無しさん
2007/03/30(金) 20:04:24いえす。
関数はファイルの外部から見える(extern)か見えない(static)かの2通りで
省略時はextern扱いされる。
外部に見せる必要がない関数は積極的にstaticを付けておくのはよい習慣。
0197デフォルトの名無しさん
2007/03/30(金) 20:05:10staticをつけない限り、そうなる。
従って、ソースファイル外から使いたい関数以外は無条件にstaticをつけた方がいい。
#最近のコンパイラはstaticな関数は積極的にインライン展開しようとすることだし。
0199デフォルトの名無しさん
2007/03/30(金) 20:11:460200デフォルトの名無しさん
2007/03/30(金) 21:16:58if( a[7] != 0 )
{
cnt = 16 ;
while( (a[0] & 0x0f) == 0 && cnt != 0 )
{
for( ct = 0 ; ct != 8 ; ct++ )
{
((struct ST4bit *)&a[0+ct]->4bit_0
= ((struct ST4bit *)&a[0+ct])->4bit_1 ;
((struct ST4bit *)&a[0+ct]->4bit_1
= ((struct ST4bit *)&a[1+ct])->4bit_0 ;
}
((struct ST4bit *)&a[7])->4bit_1 = 0 ;
cont-- ;
}
}
struct ST4bitはunsigned型で{4bit_0 ; 4bit_1}がメンバ(各4bit)
この時、このプログラムの意味することは、
a[0]〜a[7]で後ろ詰めに格納されているものを
前詰めにしている、というのでいいでしょうか?
またこうすればもっと簡単にできるというのがありましたら、ご教授お願いします。
0201デフォルトの名無しさん
2007/03/30(金) 21:29:410202デフォルトの名無しさん
2007/03/30(金) 21:42:200203デフォルトの名無しさん
2007/03/30(金) 22:36:15forループの中でa[8]にアクセスしてるみたいだけど、いいの?
0204デフォルトの名無しさん
2007/03/30(金) 22:43:08THX
0205デフォルトの名無しさん
2007/03/30(金) 22:48:21C言語じゃないよね?
0206デフォルトの名無しさん
2007/03/30(金) 22:48:250207デフォルトの名無しさん
2007/03/30(金) 22:56:320208デフォルトの名無しさん
2007/03/30(金) 22:57:10鼻からなんか出る前に消してしまえ
0209デフォルトの名無しさん
2007/03/30(金) 22:58:29常識的に考えて・・・
0210デフォルトの名無しさん
2007/03/30(金) 23:18:47頼んだぞ。
0211デフォルトの名無しさん
2007/03/30(金) 23:38:470212デフォルトの名無しさん
2007/03/30(金) 23:41:37データサイズが膨大 or 組み込み用途 or 学習目的
のいずれでも無いならビットフィールド使うのをやめるのが吉
long long に対応しているコンパイラならシフト演算一回で終わる
※但し、データの並び順が変わるのに注意
0213212
2007/03/30(金) 23:47:05↓
コンピュータのバイトオーダによってはデータの並び順が変わる
0214デフォルトの名無しさん
2007/03/30(金) 23:49:18これをサポートしてない環境の例ってあります?
たとえば組み込み用の一部ではサポートしてないとかそういうのでしょうか?
0215デフォルトの名無しさん
2007/03/30(金) 23:52:04バッファリングしない環境では実装されてないってことは普通にあるかもね。
0216デフォルトの名無しさん
2007/03/31(土) 00:00:200218デフォルトの名無しさん
2007/03/31(土) 13:00:19fflush(stdin)のことを言ってるならWINXPでできなかった記憶がある
0219デフォルトの名無しさん
2007/03/31(土) 16:29:09LSI-C の用途があなたの想定する用途と違うだけ
0220デフォルトの名無しさん
2007/03/31(土) 16:39:06MS-DOS用コンパイラをWindowsで動かす積極的な理由は何かある?
まさか、製品版のLSI-C80の話をしているわけじゃないよね?
0221デフォルトの名無しさん
2007/03/31(土) 16:56:08そんな理由はあるかどうか分からない
ただ DOS で動くプログラムがごく稀に必要になることはある
元になったレスは lcc って書いてあるから lsic86 とは関係ないっぽい
0222デフォルトの名無しさん
2007/03/31(土) 16:59:36リアルタイムOS として DOS を使う場合もある
再起動も早いし
0223デフォルトの名無しさん
2007/03/31(土) 18:50:53int i;
int integer;
for (i = 0; *(ascii+i) >= '0' && *(ascii+i) <= '9'; ++i)
integer = 10 * integer + (*(ascii+i) - '0');
return integer;
}
これってasciiをポインタと配列のどっちで書いたほうがいい? それともどっちでもいい?
0224デフォルトの名無しさん
2007/03/31(土) 18:51:40atoi 使うのがイイ
0225デフォルトの名無しさん
2007/03/31(土) 18:53:53ついでに変数 integer の初期化が必要
0226デフォルトの名無しさん
2007/03/31(土) 19:00:45そのasciiは、「『関数の仮引数』だから」
char *asciiと書いてもchar ascii[]と書いても、同じ。
char *asciiと書いたかのようにcharへのポインタ型として扱われる。
http://kmaebashi.com/programmer/pointer.html
http://www.kouno.jp/home/c_faq/c6.html
あと、'0'から'9'までの文字かどうかの判定にはisdigitが使える、というより使え。
そして勉強ならいいが、実用なら>>224。
0227デフォルトの名無しさん
2007/03/31(土) 19:04:34で、元質が制御系だとかDOSプログラムを作ってるだとか言う根拠は?
ちなみに、LSI-C86ならコンパイラの実行モジュール名がlccだな。
他にもlccはあるが、ちょっとした関数で音を上げることから察すればLSI-Cだろう。
0228デフォルトの名無しさん
2007/03/31(土) 19:20:05根拠も何も無い
DOS が好きなだけなんだ
だから DOS で使えるコンパイラが貶められるのが嫌だった
それだけ
好きなものは好きなんだ、理屈じゃないんだ!
そういうもんだろ?
0229デフォルトの名無しさん
2007/03/31(土) 19:21:000230デフォルトの名無しさん
2007/03/31(土) 19:43:330231デフォルトの名無しさん
2007/03/31(土) 19:56:230232デフォルトの名無しさん
2007/03/31(土) 20:11:57#include<stdio.h>
/* こんな時 func_t はどんな型で typedef すればいいのしょうか? */
typedef void *(*func_t)(void);
func_t a(void);
func_t b(void);
func_t a(void){putchar('a');return b;}
func_t b(void){putchar('b');return a;}
int main(void){
func_t func=a;
int i;
for(i=0;i<10;i++) func=func();
return 0;
}
0233デフォルトの名無しさん
2007/03/31(土) 20:20:150234デフォルトの名無しさん
2007/03/31(土) 20:24:41>>232
typedef func_tA;
typedef func_tA (*func_t)(void);
func_tA a(void);
func_tA b(void);
func_tA a(void){putchar('a');return (func_tA)b;}
func_tA b(void){putchar('b');return (func_tA)a;}
int main(void){
func_t func=a;
int i;
for(i=0;i<10;i++) func=(func_t)func();
return 0;
}
これでうまくいったけど
たぶん改善の余地ありだろうな
0235デフォルトの名無しさん
2007/03/31(土) 20:29:440236デフォルトの名無しさん
2007/03/31(土) 20:31:36自分が相手を呼び出してるわけじゃないし
0237デフォルトの名無しさん
2007/03/31(土) 20:34:55p[2]が使えたんだけど
これは文法的にok?
0238デフォルトの名無しさん
2007/03/31(土) 20:38:42文法的にはok
論理的(規格の用件に合致する、正常に実行できるなど)な観点からは
okかどうかそれだけではわからない。
0239デフォルトの名無しさん
2007/03/31(土) 20:40:55void b(void);
func_t a(void) { putchar('a'); return b; }
これで、ここまで、ならば通る。
func_t b(void);
に変えると
typedef func_t (*func2_t)(void);
func2_t a(void);
にしなければならなくなる。
すると今度は・・・
難しいね。
0240デフォルトの名無しさん
2007/03/31(土) 20:41:08p[2] の領域が確保されていればおk
例.
int a[10]={0}, *p;
p=&a[3];
p[2]=0x1234; // p[2] == a[5] なので O.K.
p=&a[9];
p[2]=0x5678; // p[2] == a[11] なので N.G.
0241デフォルトの名無しさん
2007/03/31(土) 20:43:24効率の悪いプログラムの書き方とかあれば教えて下さい(-_-;)
0242デフォルトの名無しさん
2007/03/31(土) 20:45:58typedef void *(*func_t)(void);
void *a(void){putchar('a');return b;}
void *b(void){putchar('b');return a;}
0243デフォルトの名無しさん
2007/03/31(土) 20:50:530244デフォルトの名無しさん
2007/03/31(土) 20:50:57よくある失敗はバッファオーバーラン
効率の悪いプログラムの書き方は標準関数を自作してしまう
0245デフォルトの名無しさん
2007/03/31(土) 20:51:130246デフォルトの名無しさん
2007/03/31(土) 20:52:55無いよ。
0247デフォルトの名無しさん
2007/03/31(土) 20:55:22よく自作しようとしてしまう関数って
どんなものがあるんでしょうか(-_-;)
0248デフォルトの名無しさん
2007/03/31(土) 20:59:44局所変数のポインタを返すとか。
値を受け取るための引数に未初期化ポインタを渡すとか。
てか、大学関係ない単なるC言語初心者か。
0249デフォルトの名無しさん
2007/03/31(土) 20:59:50sprintfはstrcpy並に問題ある。
バッファオーバーラン防止のため、snprintf使え。
0250デフォルトの名無しさん
2007/03/31(土) 21:00:51>>234
すみません。
キャストしなくても警告の出ない方法があればと思い質問しました。
>>239
そうなんです。ループしてしまうので宣言の仕方がわからないんです。
>>242
void * にすると代入する時の型チェックが無くなってしまうので
できれば関数の型を残したいです
0251デフォルトの名無しさん
2007/03/31(土) 21:05:28int i;
のとき
sscanf(a,"%d,%s",&i,a);
とか
sscanf(a,"%s,%d",a,&i);
って大丈夫?
0252デフォルトの名無しさん
2007/03/31(土) 21:11:24エラーチェックをしてないのも多い気がする
fopen が失敗したかどうかチェックしてないとか
■ このスレッドは過去ログ倉庫に格納されています