C言語なら俺に聞け! Part 112
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/08/08(月) 01:32:01質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
C言語なら俺に聞け! Part 111
http://pc8.2ch.net/test/read.cgi/tech/1121657911/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0685デフォルトの名無しさん
2005/08/22(月) 23:21:17プログラムの練習に超おすすめ。
0686デフォルトの名無しさん
2005/08/22(月) 23:24:470687デフォルトの名無しさん
2005/08/23(火) 06:18:47お手数です。続けるべきじゃないですがチト引っかかるので…
「代入処理の型変換」って「代入文での型変換」ということですよね。
そもそも、
>>643 >>共用体を使ってshort型で入れた整数をlong型に変換
にある例を、いわゆる"型変換"と呼ぶ(考える)のは誤解のもと
でしょうから注意。(強いて言えば byte(or bit)列の操作かなあ?)
その本も見たこと無いんで十分な説明があるのか良否はわかりませんが、
入門者に誤解を与えかねないのは危険かも。
どちらにせよ学習者が1冊だけを参考にするのは不備でしょう。
0688デフォルトの名無しさん
2005/08/23(火) 09:43:340689デフォルトの名無しさん
2005/08/23(火) 09:44:510690デフォルトの名無しさん
2005/08/23(火) 09:45:07コメントアウト
0691デフォルトの名無しさん
2005/08/23(火) 09:46:09ありがとう
では、コメントアウトした部分をもとに戻すことはなんと言いますか?
0692デフォルトの名無しさん
2005/08/23(火) 09:56:50encomment/decomment
0693デフォルトの名無しさん
2005/08/23(火) 13:05:450694デフォルトの名無しさん
2005/08/23(火) 17:19:150695デフォルトの名無しさん
2005/08/23(火) 17:34:200696デフォルトの名無しさん
2005/08/23(火) 23:18:29# なんだ、この流れは。
0697デフォルトの名無しさん
2005/08/23(火) 23:21:52uncomment out
オプションを設定するヘッダーファイルのなかでこんなの良く見るよ。
/* uncomment out the following line to enable XXX */
/* #define OPTION_XXX_ENABLED 1 */
0698デフォルトの名無しさん
2005/08/23(火) 23:43:39だれか分かり易く教えてくれない?
0699デフォルトの名無しさん
2005/08/23(火) 23:55:10リストって線形リストか?
とりあえず新たに挿入するノードようの領域をmallocなりcallocなりで確保して
こいつへのポインタをnewにでも放り込んでおく
んで、挿入位置の直前にあるノード(A)の次のノードへのポインタをnewの次へのポインタに複写
その後、Aの次へのポインタをnewへのポインタに書き換えて終了
0700デフォルトの名無しさん
2005/08/23(火) 23:55:25A→Cの間にBを挿入するなら、BにCをつないで(B→C)、AにBを
つなげば(A→B)いい。
具体的にstruct list {struct list *next;};みたいな単純な線形リストなら、
CへのポインタをBのnextに入れて、BへのポインタをAのnextに代入する。
0701デフォルトの名無しさん
2005/08/24(水) 00:06:57◆を挿入
口→◆♂■⇒
0702698
2005/08/24(水) 00:25:47よんでもいまいちワカランのよ
0703デフォルトの名無しさん
2005/08/24(水) 00:26:590704デフォルトの名無しさん
2005/08/24(水) 00:31:150705デフォルトの名無しさん
2005/08/24(水) 00:31:56線形リストでググれ
0706デフォルトの名無しさん
2005/08/24(水) 03:25:26双方向リスト?
0707デフォルトの名無しさん
2005/08/24(水) 03:35:590708デフォルトの名無しさん
2005/08/24(水) 03:37:56char * GetStr ()
{
char _szTemp[128];
strcpy(_szTemp, "abc");
return _szTemp;
}
int main ()
{
cout << GetStr() << endl;
return 0;
}
GetStr()関数で char 型に入ってる文字列を返したいのですが、
どうすればいいんでしょうか。
void GetStr(char *_szTemp)
みたいに引数に入れて返すのではなく、
戻り値で返したいんです。
どなたかお願いします m(__)m
0709デフォルトの名無しさん
2005/08/24(水) 03:40:50{
strcpy(_szTemp, "abc");
return _szTemp;
}
0710708
2005/08/24(水) 03:45:23にゃるほど。それで行けますね。
どうもありがとうございます。 m(__)m
GetStr()で宣言した文字列を返したほうがスマートになるような
気がするんですが、それは無理ですか?
0711デフォルトの名無しさん
2005/08/24(水) 03:45:52std::string GetStr()
{
std::string str("abc");
return str;
}
0712デフォルトの名無しさん
2005/08/24(水) 03:49:27typedef struct ulist ulist;
struct ulist {
int value;
ulist *next;
};
ulist *ulist_create() {
ulist *res = malloc(sizeof (ulist));
res->value = 0;
res->next = NULL;
}
void ulist_insert_next(ulist *prev, ulist *node) {
node->next = prev->next;
prev->next = node;
}
void ulist_remove_next(ulist *node) {
ulist *next = node->next;
if(next == NULL) { return; }
node->next = next->next;
free(next);
}
void ulist_free(ulist *node) {
ulist *next;
if(node == NULL) { return; }
next = node->next;
free(node);
ulist_free(next);
}
0713デフォルトの名無しさん
2005/08/24(水) 03:51:32char *GetStr()
{
return "abc";
}
0714デフォルトの名無しさん
2005/08/24(水) 03:53:55動的に確保していいんなら
char *GetStr() {
return strdup("abc");
}
きちんと後で free すること。
あと、静的なデータならそのまま return できる。
char *GetStr() {
return "abc";
}
char *GetStr() {
static char _szTemp[128];
strcpy(_szTemp, "abc");
return _szTemp;
}
ただ、静的なので当然データは同時に1つしか存在できない。
呼び出すたびに違うのを返したい場合には使えない。
ただまあ、普通は >>709 の形にするんじゃない?
0715708
2005/08/24(水) 04:00:55char * GetStr ()
{
char *_szTemp = "wertyuytrewruyreertyurertyuiitrertyuytre";
strcpy(_szTemp, "abc");
return _szTemp;
}
↑がいけるかと思ったら無理でしたww
>>711 >>713 >>714
std::stringはまだわからないので、
>>709か、できたら>>713で行って見ます。
皆様、どうもありがとうございます。
0716デフォルトの名無しさん
2005/08/24(水) 04:04:03Cの初歩の初歩で学ぶ禁じ手をやっている。
一冊Cのテキストを読むことをお勧めする。
そんな調子じゃ、まともなものは作れない。
0717デフォルトの名無しさん
2005/08/24(水) 04:05:37そもそも文字定数って書き換え不可じゃなかったっけ?
0718デフォルトの名無しさん
2005/08/24(水) 04:06:13うはwwごめんなさい。
つい必死で。
0719デフォルトの名無しさん
2005/08/24(水) 05:34:460720デフォルトの名無しさん
2005/08/24(水) 06:22:18なんとなく不安になるんですが、考えられるまずい要素とかありますか?
0721デフォルトの名無しさん
2005/08/24(水) 07:43:46>考えられるまずい要素とかありますか
あんたの頭。
0722デフォルトの名無しさん
2005/08/24(水) 07:50:130723デフォルトの名無しさん
2005/08/24(水) 09:55:08演算子の優先順位をあたまにたたきこんでくだちい
0724デフォルトの名無しさん
2005/08/24(水) 10:00:01最適化効くかもしれんけど。
0725デフォルトの名無しさん
2005/08/24(水) 10:00:55優先順位じゃなくて結合規則だ。
0726デフォルトの名無しさん
2005/08/24(水) 10:20:47そうだ、それをいいたかったんだよ
0727デフォルトの名無しさん
2005/08/24(水) 12:46:28tmp = a->pnext;
tmp->pnext
でいいだろ。
まずいというか、ポインタ参照は出来るだけ深くしないように習慣づけた方が良い。
****pとか論外。
簡単な事を複雑に見せてるだけでハッタリと変わらん。
0728デフォルトの名無しさん
2005/08/24(水) 13:04:23流石に五つも先ならa->pnext->pnext->pnext->pnext->pnextはやりすぎだと思うけど。
0729デフォルトの名無しさん
2005/08/24(水) 13:25:53途中のポインタが NULL になっていた時に落ちる。
0730デフォルトの名無しさん
2005/08/24(水) 14:19:25int in;
printf( "kyoumoiitennki\n" );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void def( void ) {
int in;
printf( "kyoumoiitennki\n" );
printf( "sentakumonowohosou\n" );// point!
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
例えが少し悪いかもしれませんが、このように、ほとんど同じ関数なのに、
中途半端な位置で、一部だけ違うという場合にたまに遭遇します。
マクロ化して省略すると見づらくなりますし、どう回避すべきでしょうか
気にせず違う関数として2つ定義しておくのが、やはり一番の正解ですか?
0731デフォルトの名無しさん
2005/08/24(水) 14:27:27int in;
printf( "kyoumoiitennki\n" );
if(mode==1)printf( "sentakumonowohosou\n" );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc()
{
f(0);
}
void def()
{
f(1);
}
0732デフォルトの名無しさん
2005/08/24(水) 14:28:32コピペしてちょっと変えるだけの手抜きは決して許してはならない。
俺がそういう関数が数百ある他人の書いたプログラムのデバッグで
どれだけ苦労していると思ってるんだ。ふざけるな。
0733デフォルトの名無しさん
2005/08/24(水) 14:38:190734デフォルトの名無しさん
2005/08/24(水) 14:40:42enum action {
NO_ACTION;
SOUJI;
HOSU;
NERU;
};
void f( action mode ) {
int in;
printf( "kyoumoiitennki\n" );
if(mode==HOSU)printf( "sentakumonowohosou\n" );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc()
{
f(NO_ACTION);
}
void def()
{
f(HOSU);
}
0735デフォルトの名無しさん
2005/08/24(水) 14:42:00void f( char *prompt ) {
int in;
printf( "kyoumoiitennki\n" );
if ( prompt[0] ) printf( prompt );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc()
{
f( "sentakumonowohosou\n" );
}
void def()
{
f( "" );
}
0736デフォルトの名無しさん
2005/08/24(水) 14:48:29void f( void(*callback)() )
{
int in;
printf( "kyoumoiitennki\n" );
if( callback ) callback();
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc( void ) {
f(NULL);
}
void def( void ) {
struct SFunc {
static void Callback() {
printf( "sentakumonowohosou\n" );
}
};
f(SFunc::Callback);
}
0737デフォルトの名無しさん
2005/08/24(水) 15:53:08自分が阿呆であると知ったいい機会でした
皆様レスありがとう!
0738デフォルトの名無しさん
2005/08/24(水) 16:10:54>if ( prompt[0] ) printf( prompt );
こういうコードはやめて欲しい。
せめて
if ( prompt != NULL )
とかにしてくれ。
ぬるぽが来たらどうすんだ。
0739デフォルトの名無しさん
NGNGprintf( prompt ); だけでいいような気が。
0740デフォルトの名無しさん
2005/08/24(水) 16:36:36厳密にやるなら、
if (prompt) {printf("%s", prompt);}
でないと%を含む文字列を表示できない。。
0741デフォルトの名無しさん
2005/08/24(水) 16:37:590742デフォルトの名無しさん
2005/08/24(水) 17:07:48個人的には文字列は1つにまとめた方が好き。
#define HARE "kyoumoiitennki\n"
#define HOSU "sentakumonowohosou\n"
void f(char* msg)
{
int in;
if(msg)
printf( "%s", msg );
scanf( "%d" ,&in );
printf( "rakki-number %d" ,in );
}
void abc( void ) {
f(HARE);
}
void def( void ) {
f(HARE HOSU);
}
0743デフォルトの名無しさん
2005/08/24(水) 17:26:59printf( RAKKI "%d" ,in );
とはしないの?w
0744デフォルトの名無しさん
NGNGプロンプトがなしの場合、NULLを渡すか、長さが0の文字列を
渡すかって仕様の問題じゃん。
NULLを渡さないって仕様ならifはいらないって話。
0745デフォルトの名無しさん
2005/08/24(水) 22:27:48Cで自作アプリを書き始めたのですが、(1)「できるだけ小さく」
(2)「他のライブラリに依存しない」を目指したら、標準Cがあまりにも
プリミティブ過ぎて、再発明した(しかも出来の良くない)「車輪」が量産
されつつあります。(メモリ管理とか文字列とかリストとかマップとか)
さすがにやってられないので、(2)はあきらめて、できあいの「車輪」を
使おうとしてるのですが、皆さんこういうとき何を使ってますか?
とりあえずライセンスのぬるいaprを使おうかと思ってるのですが……。
ちなみに、C++には宗教上の理由で近付きたくないです(ぉ
# いや、単に挫折しただけなんですが(^^;
0746デフォルトの名無しさん
2005/08/24(水) 22:30:040747デフォルトの名無しさん
2005/08/24(水) 22:40:490748デフォルトの名無しさん
2005/08/24(水) 22:51:46大丈夫、STLはオブジェクト指向じゃないから。
0749デフォルトの名無しさん
2005/08/24(水) 22:58:45初めてC++をさわったとき、Hello worldのバイナリが数MBになったのが未だにトラウマだったりしまつ。
>>747 >>748
オブジェクト指向に挫折したんじゃなくて、C++に挫折しました。JavaやRubyには挫折しなかったんですが……。
0750デフォルトの名無しさん
2005/08/24(水) 23:04:16今、VC7.1で試してみたけど、Hello, worldに目いっぱいの最適化をかけて48KiBになったよ。
しかしSTLを使わないのは惜しいな。
お前が例に挙げた文字列とかリストとかマップとかはみな含まれている。
0751デフォルトの名無しさん
2005/08/24(水) 23:05:260752デフォルトの名無しさん
2005/08/24(水) 23:06:57そっとしておこうか。
0753デフォルトの名無しさん
2005/08/24(水) 23:27:13↑このように、ビットマップファイルを輝度値の行列にしたいのですが、
方針としては、
ヘッダー情報読み取り
↓
ピクセルデータを24bitずつ読み出しては先頭の8bitを10進数で出力
↓
出力した輝度値が1行分の数になったら改行を出力
↓
以下繰り返し
こんなかんじでできるでしょうか?
0754ESP
2005/08/24(水) 23:30:000755デフォルトの名無しさん
2005/08/24(水) 23:56:53そこだけ注意な。
0756753
2005/08/24(水) 23:59:08>>755
ありがとうございます。
C言語プログラムは初めてなのですごく緊張してます・・・
またお世話になるかもしれませんので、そのときはよろしくお願いしますm(_ _)m
0757デフォルトの名無しさん
2005/08/25(木) 00:05:520758デフォルトの名無しさん
2005/08/25(木) 00:10:24画像編集ツールでxpmとかpgmを出力できるのを探してこい。
例えばIrfanView(プラグインも必要かな)でもいい。
bmpファイルをそのツールで開き、pgmの場合はOptionでAsciiに設定の上、
保存すればほぼ目的に到達できるぞ。
#自分でプログラミングする場合でも一度見ておくといいと思う。
0759753
2005/08/25(木) 00:22:32いちおうカラー画像として保存してるんですが、
確認するようにします。
>>758
あ・・・ できちゃいましたw
まぁ、練習ということで組めそうならがんばってみます。
ありがとうございました。
0760デフォルトの名無しさん
2005/08/25(木) 01:37:48過去に作ったプログラムから使えそうなものを拾って繋ぐ。
0761デフォルトの名無しさん
2005/08/25(木) 01:55:35printf();でバイナリをそのまま出力させたいんですがどう指定すればいいんですか?
あえてASCIIに変換したくないんですが・・・
print("%c",0xff);とすると、Dosプロンプトに出力された時のメモリ上にffと格納されるんでしょうか?
おねがいします。
0762デフォルトの名無しさん
2005/08/25(木) 01:57:44バイナリをそのままってどういうことだ?
バイナリエディタで表示されるような感じのを出したいのか?
0763デフォルトの名無しさん
2005/08/25(木) 01:57:530764デフォルトの名無しさん
2005/08/25(木) 01:58:05%02X みたいなことを意味しているんだろうか。
0765デフォルトの名無しさん
2005/08/25(木) 02:04:54一つの方法としては
char ch=0xff;
int i;
for(i=128; i>0; i/=2)
if(i & ch) printf("1 ");
else printf("0 ");
他にはビットフィールドと共用体を利用する等
でいいのかな
0766デフォルトの名無しさん
2005/08/25(木) 02:07:41なんというか、バイナリをprintfで出力する必要があって・・・
0xffなら0x66,0x66ではなく0xffのまま出力させたいんです。
どうすればいいんでしょう?
ひょっとして
char a[2];
a[0]=0xff;
a[1]=0;
printf("%s",a);
とかでいいんでしょうか・・・
0767デフォルトの名無しさん
2005/08/25(木) 02:11:01printf がどういう関数なのか、
全く分かってないように思われる。
0768デフォルトの名無しさん
2005/08/25(木) 02:13:05それだと文字列が表示されると思いますが。
しかも妙な。
0769デフォルトの名無しさん
2005/08/25(木) 02:17:130770デフォルトの名無しさん
2005/08/25(木) 02:18:00fwriteでいいのではないか。
0771デフォルトの名無しさん
2005/08/25(木) 02:20:15これで普通にできるが・・・
こいつは何を言ってるんだ?
0772デフォルトの名無しさん
2005/08/25(木) 02:20:59言いたいことは
printf("0x%x", 0xff);
ですか?
0773デフォルトの名無しさん
2005/08/25(木) 02:21:040xff(文字ではなく数値)で埋められたバイナリファイルができてほしいってことか?
0774デフォルトの名無しさん
2005/08/25(木) 02:22:040775デフォルトの名無しさん
2005/08/25(木) 02:22:58%#xでいいじゃん
0776デフォルトの名無しさん
2005/08/25(木) 02:26:470777デフォルトの名無しさん
2005/08/25(木) 02:26:57それは、%sとかのパターンが入ったときに嫌な予感。
0778766
2005/08/25(木) 02:27:19対象がファイルじゃないんです・・
>771
perlですか?参考にします!
>772
ASCIIじゃだめなんです
>773
そうです。
何故かprintfを介さないと相手は受け取ってくれなくて・・
ASCII文字では無く数値そのままを渡したいんですが・・
うう・・入門書から出直してきます・・orz
0779デフォルトの名無しさん
2005/08/25(木) 02:28:250780デフォルトの名無しさん
2005/08/25(木) 02:29:20> 対象がファイルじゃないんです・・
stdoutファイルへ出力すれば?
0781デフォルトの名無しさん
2005/08/25(木) 02:32:27fprintf()もprintf()も最終的にテキストになるから無理ですよ。
0782デフォルトの名無しさん
2005/08/25(木) 02:37:26例えば、0x41を出力したときどんな風に表示させたいのかね?
"A"?それとも"0x41"?
0783デフォルトの名無しさん
2005/08/25(木) 02:39:090784デフォルトの名無しさん
2005/08/25(木) 02:42:15putchar でもいいと思うが。
0785デフォルトの名無しさん
2005/08/25(木) 02:59:07それだと文字に変換されたのが出るんじゃなかったっけ?
まぁどっちにしろ766の言ってることはいろいろとおかしいが
■ このスレッドは過去ログ倉庫に格納されています