トップページ⇒tech
1001コメント273KB

C言語なら俺に聞け! Part 112

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/08/08(月) 01:32:01
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

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/
0705デフォルトの名無しさん2005/08/24(水) 00:31:56
>>704
線形リストでググれ
0706デフォルトの名無しさん2005/08/24(水) 03:25:26
単方向リスト?
双方向リスト?
0707デフォルトの名無しさん2005/08/24(水) 03:35:59
>>698の態度が気に入らない
0708デフォルトの名無しさん2005/08/24(水) 03:37:56
すいません、質問です

char * 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
char * GetStr (char *_szTemp)
{
 strcpy(_szTemp, "abc");
 return _szTemp;
}
07107082005/08/24(水) 03:45:23
>>709
にゃるほど。それで行けますね。
どうもありがとうございます。 m(__)m

GetStr()で宣言した文字列を返したほうがスマートになるような
気がするんですが、それは無理ですか?
0711デフォルトの名無しさん2005/08/24(水) 03:45:52
>>710
std::string GetStr() 
{
  std::string str("abc");
  return str; 
}
0712デフォルトの名無しさん2005/08/24(水) 03:49:27
/* 俺も暇だなぁ */
typedef 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:32
>>710
char *GetStr()
{
return "abc";
}

0714デフォルトの名無しさん2005/08/24(水) 03:53:55
>>710
動的に確保していいんなら

char *GetStr() {
 return strdup("abc");
}

きちんと後で free すること。


あと、静的なデータならそのまま return できる。

char *GetStr() {
 return "abc";
}

char *GetStr() {
 static char _szTemp[128];
 strcpy(_szTemp, "abc");
 return _szTemp;
}

ただ、静的なので当然データは同時に1つしか存在できない。
呼び出すたびに違うのを返したい場合には使えない。


ただまあ、普通は >>709 の形にするんじゃない?
07157082005/08/24(水) 04:00:55
全然スマートじゃないんですが、

char * GetStr ()
{
 char *_szTemp = "wertyuytrewruyreertyurertyuiitrertyuytre";
 strcpy(_szTemp, "abc");
 return _szTemp;
}

↑がいけるかと思ったら無理でしたww

>>711 >>713 >>714
std::stringはまだわからないので、
>>709か、できたら>>713で行って見ます。
皆様、どうもありがとうございます。
0716デフォルトの名無しさん2005/08/24(水) 04:04:03
>>715
Cの初歩の初歩で学ぶ禁じ手をやっている。
一冊Cのテキストを読むことをお勧めする。
そんな調子じゃ、まともなものは作れない。
0717デフォルトの名無しさん2005/08/24(水) 04:05:37
>>715
そもそも文字定数って書き換え不可じゃなかったっけ?
0718デフォルトの名無しさん2005/08/24(水) 04:06:13
>>716 >>717
うはwwごめんなさい。
つい必死で。
0719デフォルトの名無しさん2005/08/24(水) 05:34:46
つ >>1 だから、無能厨が初心者と雑談するスレじゃないちゅうに。
0720デフォルトの名無しさん2005/08/24(水) 06:22:18
アロー演算子が a->pnext->pnext とか2つ以上続いちゃうと
なんとなく不安になるんですが、考えられるまずい要素とかありますか?
0721デフォルトの名無しさん2005/08/24(水) 07:43:46
>>720
>考えられるまずい要素とかありますか
あんたの頭。
0722デフォルトの名無しさん2005/08/24(水) 07:50:13
あんたのあたま
0723デフォルトの名無しさん2005/08/24(水) 09:55:08
>>720
演算子の優先順位をあたまにたたきこんでくだちい
0724デフォルトの名無しさん2005/08/24(水) 10:00:01
a->pnext が何度も出てくる場合は効率悪いってくらいか。
最適化効くかもしれんけど。
0725デフォルトの名無しさん2005/08/24(水) 10:00:55
>>723
優先順位じゃなくて結合規則だ。
0726デフォルトの名無しさん2005/08/24(水) 10:20:47
>>725
そうだ、それをいいたかったんだよ
0727デフォルトの名無しさん2005/08/24(水) 12:46:28
>>720
tmp = a->pnext;
tmp->pnext
でいいだろ。
まずいというか、ポインタ参照は出来るだけ深くしないように習慣づけた方が良い。
****pとか論外。
簡単な事を複雑に見せてるだけでハッタリと変わらん。
0728デフォルトの名無しさん2005/08/24(水) 13:04:23
リストの二つ先を拾うだけなら別にa->pnext->pnextでいいじゃん。
流石に五つも先ならa->pnext->pnext->pnext->pnext->pnextはやりすぎだと思うけど。
0729デフォルトの名無しさん2005/08/24(水) 13:25:53
>>720
途中のポインタが NULL になっていた時に落ちる。
0730デフォルトの名無しさん2005/08/24(水) 14:19:25
void abc( void ) {
int 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:27
void f( int mode ) {
 int 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
>>730
コピペしてちょっと変えるだけの手抜きは決して許してはならない。
俺がそういう関数が数百ある他人の書いたプログラムのデバッグで
どれだけ苦労していると思ってるんだ。ふざけるな。
0733デフォルトの名無しさん2005/08/24(水) 14:38:19
は?
0734デフォルトの名無しさん2005/08/24(水) 14:40:42
>>731のを横から勝手に改造。

enum 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:00
文字列を直接渡す方がマシ
void 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:29
トリッキーな解としては関数ポインタを渡すとか。
void 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
こう言う場合一行追加される if 文を気にしていた
自分が阿呆であると知ったいい機会でした
皆様レスありがとう!
0738デフォルトの名無しさん2005/08/24(水) 16:10:54
>>735
>if ( prompt[0] ) printf( prompt );
こういうコードはやめて欲しい。
せめて
if ( prompt != NULL )
とかにしてくれ。
ぬるぽが来たらどうすんだ。
0739デフォルトの名無しさんNGNG
>>735 の場合は、ifを省略して、

printf( prompt ); だけでいいような気が。

0740デフォルトの名無しさん2005/08/24(水) 16:36:36
ダメすぎ。NULLはprintf()に使えない。
厳密にやるなら、
if (prompt) {printf("%s", prompt);}
でないと%を含む文字列を表示できない。。
0741デフォルトの名無しさん2005/08/24(水) 16:37:59
話が完全に反れてるな
0742デフォルトの名無しさん2005/08/24(水) 17:07:48
>>735と同じスタンスだが
個人的には文字列は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:59
>>742
printf( RAKKI "%d" ,in );
とはしないの?w
0744デフォルトの名無しさんNGNG
>>740
プロンプトがなしの場合、NULLを渡すか、長さが0の文字列を
渡すかって仕様の問題じゃん。
NULLを渡さないって仕様ならifはいらないって話。
0745デフォルトの名無しさん2005/08/24(水) 22:27:48
うーん、こういう質問てここでいいのかな。より適切なスレがあれば誘導よろしこ。

Cで自作アプリを書き始めたのですが、(1)「できるだけ小さく」
(2)「他のライブラリに依存しない」を目指したら、標準Cがあまりにも
プリミティブ過ぎて、再発明した(しかも出来の良くない)「車輪」が量産
されつつあります。(メモリ管理とか文字列とかリストとかマップとか)

さすがにやってられないので、(2)はあきらめて、できあいの「車輪」を
使おうとしてるのですが、皆さんこういうとき何を使ってますか?

とりあえずライセンスのぬるいaprを使おうかと思ってるのですが……。

ちなみに、C++には宗教上の理由で近付きたくないです(ぉ
# いや、単に挫折しただけなんですが(^^;
0746デフォルトの名無しさん2005/08/24(水) 22:30:04
ちいさくする意味がわからん
0747デフォルトの名無しさん2005/08/24(水) 22:40:49
C++ を better C として使えばいい。
0748デフォルトの名無しさん2005/08/24(水) 22:51:46
あとSTLも必要だな。

大丈夫、STLはオブジェクト指向じゃないから。
0749デフォルトの名無しさん2005/08/24(水) 22:58:45
>>746
初めてC++をさわったとき、Hello worldのバイナリが数MBになったのが未だにトラウマだったりしまつ。
>>747 >>748
オブジェクト指向に挫折したんじゃなくて、C++に挫折しました。JavaやRubyには挫折しなかったんですが……。
0750デフォルトの名無しさん2005/08/24(水) 23:04:16
>>749
今、VC7.1で試してみたけど、Hello, worldに目いっぱいの最適化をかけて48KiBになったよ。

しかしSTLを使わないのは惜しいな。
お前が例に挙げた文字列とかリストとかマップとかはみな含まれている。
0751デフォルトの名無しさん2005/08/24(水) 23:05:26
ここはアンチ野郎がC++を使ってくれるように説得してあげるスレじゃありませんから。
0752デフォルトの名無しさん2005/08/24(水) 23:06:57
それもそうだな。
そっとしておこうか。
0753デフォルトの名無しさん2005/08/24(水) 23:27:13
ttp://axts10.web.infoseek.co.jp/bitmap_text.gif
↑このように、ビットマップファイルを輝度値の行列にしたいのですが、
方針としては、

ヘッダー情報読み取り
 ↓
ピクセルデータを24bitずつ読み出しては先頭の8bitを10進数で出力
 ↓
出力した輝度値が1行分の数になったら改行を出力
 ↓
以下繰り返し

こんなかんじでできるでしょうか?
0754ESP2005/08/24(水) 23:30:00
それでいいだろ。何を求めてるんだよ。
0755デフォルトの名無しさん2005/08/24(水) 23:56:53
ビットマップは絵の一番下のデータが一番最初にくるという逆転構造になってるから、
そこだけ注意な。
07567532005/08/24(水) 23:59:08
>>754
>>755
ありがとうございます。
C言語プログラムは初めてなのですごく緊張してます・・・
またお世話になるかもしれませんので、そのときはよろしくお願いしますm(_ _)m
0757デフォルトの名無しさん2005/08/25(木) 00:05:52
あと、グレースケールならパレットになってるかもな。
0758デフォルトの名無しさん2005/08/25(木) 00:10:24
>>753
画像編集ツールでxpmとかpgmを出力できるのを探してこい。
例えばIrfanView(プラグインも必要かな)でもいい。
bmpファイルをそのツールで開き、pgmの場合はOptionでAsciiに設定の上、
保存すればほぼ目的に到達できるぞ。
#自分でプログラミングする場合でも一度見ておくといいと思う。
07597532005/08/25(木) 00:22:32
>>757
いちおうカラー画像として保存してるんですが、
確認するようにします。
>>758
あ・・・ できちゃいましたw
まぁ、練習ということで組めそうならがんばってみます。
ありがとうございました。
0760デフォルトの名無しさん2005/08/25(木) 01:37:48
>>745
過去に作ったプログラムから使えそうなものを拾って繋ぐ。
0761デフォルトの名無しさん2005/08/25(木) 01:55:35
質問です!
printf();でバイナリをそのまま出力させたいんですがどう指定すればいいんですか?

あえてASCIIに変換したくないんですが・・・
print("%c",0xff);とすると、Dosプロンプトに出力された時のメモリ上にffと格納されるんでしょうか?
おねがいします。
0762デフォルトの名無しさん2005/08/25(木) 01:57:44
>>761
バイナリをそのままってどういうことだ?
バイナリエディタで表示されるような感じのを出したいのか?
0763デフォルトの名無しさん2005/08/25(木) 01:57:53
まずは、入門書から読み直せ
0764デフォルトの名無しさん2005/08/25(木) 01:58:05
「そのまま」の定義がよー分からんが、
%02X みたいなことを意味しているんだろうか。
0765デフォルトの名無しさん2005/08/25(木) 02:04:54
>>761
一つの方法としては
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:01
「バイナリ」が何なのか、
printf がどういう関数なのか、
全く分かってないように思われる。
0768デフォルトの名無しさん2005/08/25(木) 02:13:05
>>766
それだと文字列が表示されると思いますが。
しかも妙な。
0769デフォルトの名無しさん2005/08/25(木) 02:17:13
こいつには>>763のレスで十分だろ
0770デフォルトの名無しさん2005/08/25(木) 02:18:00
printfに拘る必要がわからない。
fwriteでいいのではないか。
0771デフォルトの名無しさん2005/08/25(木) 02:20:15
print "\xff\xff"
これで普通にできるが・・・
こいつは何を言ってるんだ?
0772デフォルトの名無しさん2005/08/25(木) 02:20:59
>>766
言いたいことは
printf("0x%x", 0xff);
ですか?
0773デフォルトの名無しさん2005/08/25(木) 02:21:04
リダイレクトしてファイルにしたときに、
0xff(文字ではなく数値)で埋められたバイナリファイルができてほしいってことか?
0774デフォルトの名無しさん2005/08/25(木) 02:22:04
深まる謎
0775デフォルトの名無しさん2005/08/25(木) 02:22:58
>>772
%#xでいいじゃん
0776デフォルトの名無しさん2005/08/25(木) 02:26:47
で、肝心の>>766さん、いかがですか?
0777デフォルトの名無しさん2005/08/25(木) 02:26:57
>>771
それは、%sとかのパターンが入ったときに嫌な予感。
07787662005/08/25(木) 02:27:19
>770
対象がファイルじゃないんです・・
>771
perlですか?参考にします!
>772
ASCIIじゃだめなんです
>773
そうです。
何故かprintfを介さないと相手は受け取ってくれなくて・・
ASCII文字では無く数値そのままを渡したいんですが・・


うう・・入門書から出直してきます・・orz
0779デフォルトの名無しさん2005/08/25(木) 02:28:25
ここまで阿呆だとカポーンだな
0780デフォルトの名無しさん2005/08/25(木) 02:29:20
>>778
> 対象がファイルじゃないんです・・
stdoutファイルへ出力すれば?
0781デフォルトの名無しさん2005/08/25(木) 02:32:27
リダイレクトなんかしないでFILEポインタ宣言して素直にfputc()かfwrite()を使ったらどうですか?
fprintf()もprintf()も最終的にテキストになるから無理ですよ。
0782デフォルトの名無しさん2005/08/25(木) 02:37:26
>>766
例えば、0x41を出力したときどんな風に表示させたいのかね?
"A"?それとも"0x41"?
0783デフォルトの名無しさん2005/08/25(木) 02:39:09
用語の統一が大切だって良く分かった。
0784デフォルトの名無しさん2005/08/25(木) 02:42:15
つまり、最初の %c でいいんじゃないのか?
putchar でもいいと思うが。
0785デフォルトの名無しさん2005/08/25(木) 02:59:07
>>784
それだと文字に変換されたのが出るんじゃなかったっけ?

まぁどっちにしろ766の言ってることはいろいろとおかしいが
0786デフォルトの名無しさん2005/08/25(木) 03:08:37
>>785
単に1バイトそのまま出力するだけなんだが?
ディスプレイに出力すれば文字として表示されるだけであって。
0787デフォルトの名無しさん2005/08/25(木) 03:10:40
それは分かってても言わない約束よ
0788デフォルトの名無しさん2005/08/25(木) 03:12:03
言わなきゃいけないことだよ馬鹿
0789デフォルトの名無しさん2005/08/25(木) 03:18:28
ど、どーぶる。
0790デフォルトの名無しさん2005/08/25(木) 05:54:33
質問はともかくスレ違いなアホなレスする奴はどっか逝け。
>Dosプロンプトに出力された時「のメモリ上に」ffと格納されるんでしょうか?
>何故かprintfを介さないと相手は受け取ってくれなくて・・
あたりで、意思の疎通が無理なのは自明。
0791デフォルトの名無しさん2005/08/25(木) 10:59:11
かなりスレ違いな気もするがどこで聞いたらいいか分からないので
dx/dt = -10*x + 10*y
dy/dt = 28*x - y - x*z
dz/dt = -8/3*z + xy
をオイラー法で解く場合の式って以下でいいのでしょうか?

for(i=0; i<last; i++){
x[i+1] = x[i] + h * dxdt(x[i], y[i]);
y[i+1] = y[i] + h * dydt(x[i], y[i], z[i]);
z[i+1] = z[i] + h * dzdt(x[i], y[i], z[i]);
}
//x、y、zは解を入れる配列(0番目は初期値)、hは刻み幅、dxdt、dydt、dzdtは上述の式
0792デフォルトの名無しさん2005/08/25(木) 11:06:20
すみません、自己解決しました
刻み幅が十分で無かったため、発散してました
0793デフォルトの名無しさん2005/08/25(木) 14:53:38
猫でも分かるプログラミングってほとんど初心者の自分でも分かりますか?
いくつか種類があるみたいなので初心者でも分かる本のタイトルを教えてください。
前見たような記憶では付属のCDがあったんですがそれにはコンパイラが入ってるんでしょうか?
0794デフォルトの名無しさんNGNG
>>793
本は見たことないけど、サイトのほうを見るとあまりよくないと思う。
(本はゴーストライターが書いていて、悪くはないって話もあるけど)
0795デフォルトの名無しさん2005/08/25(木) 15:28:02
>>793
過去ログサイトから 2ch books を見ていろんな本の書評を見てみたら?
0796デフォルトの名無しさん2005/08/25(木) 15:29:40
>>793
猫だとは基本的な概念とか文法についての説明が不足しているので
他にちゃんとしたC言語の入門書 (サイトでもいいけど) がほしいところ。

あと、付属のCDにはコンパイラとサンプルソースが入ってた気がする。
0797デフォルトの名無しさん2005/08/25(木) 15:33:45
お答えどうもありがとうございました。
では、他の本で分かりやすいおすすめのはないでしょうか?
0798デフォルトの名無しさん2005/08/25(木) 15:37:49
void
0799デフォルトの名無しさん2005/08/25(木) 15:45:15
>>795
そういうページがあるのを初めて知ったw
過去ログにまとまってるリンクも便利だね。
>>793ではないが、ありがトン
0800デフォルトの名無しさん2005/08/25(木) 16:03:04
>>797
>>795読んでますか?
0801デフォルトの名無しさん2005/08/25(木) 17:13:51
>>793
>>795+推薦図書スレ行ってこい
そこのお勧め本使ってそれなりに勉強してる最中の俺ガイル
0802デフォルトの名無しさん2005/08/25(木) 20:13:14
個人的には日下部先生の本がお薦め
08037932005/08/25(木) 21:19:12
すいません、なぜか795飛ばしてましたorz
柴田望洋氏の本を図書館で借りてみました
過去ログも見てみます
0804デフォルトの名無しさん2005/08/25(木) 22:05:18
>>802はネタ
■ このスレッドは過去ログ倉庫に格納されています