トップページ⇒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/
0666デフォルトの名無しさん2005/08/22(月) 22:26:24
某所より


#include <stdio.h>

int sum(int,int);/* プロトタイプ宣言 */

int main(void)
{
int value;
value = sum(50,100);
printf("%d\n",value);
return 0;
}

int sum(int min,int max)
{
int num;
num = (min + max) * (max - min + 1) / 2;
return num;
}

return numはどこに返り?
return numでなくreturn 0ではだめなんですか?
0667デフォルトの名無しさん2005/08/22(月) 22:28:18
>>666
いいよ
0668デフォルトの名無しさん2005/08/22(月) 22:29:30
659,662 のあほさ加減は、ネタなんだよな!?
0669デフォルトの名無しさん2005/08/22(月) 22:31:07
>>666
return 0でもいいけど、それじゃ何のためにsum()呼んでるの?
0670デフォルトの名無しさん2005/08/22(月) 22:31:37
>>665
質問者と回答者の双方が学生さん
0671デフォルトの名無しさん2005/08/22(月) 22:32:15
いや、わかりません。。

解説おねがいできますか?
06726592005/08/22(月) 22:33:19
ネタではないです......
独習C の練習問題でどうしても解答のやっていることが理解できなくて質問させていただきました.
スレ違い,失礼いたしました.
0673デフォルトの名無しさん2005/08/22(月) 22:41:33
>>672
ちょっと待って。それこそ初心者系じゃないか、とか、
endianとかは他の書籍も参考にきちんと調べろよ、とか
は置いといて…
その「独習C の練習問題」というのは一般の書籍のことなのか?
スレ違いだがいちおう最後に晒してくれ。
(書籍にきちんと解説があるはずの場合もあるし、例題、書籍自体が
トンデモナイ場合があるので…)
0674デフォルトの名無しさん2005/08/22(月) 22:44:33
そもそも

return numとreturn 0

の違いが分かりません。。
厨質すんません。。
0675デフォルトの名無しさん2005/08/22(月) 22:45:02
そういうのは先生に聞いてくれ
0676デフォルトの名無しさん2005/08/22(月) 22:50:23
>>673
「独習C 第三版・Herbert Schildt著・翔泳社」です.
すでに改訂版が出ているようですが.....
事前に代入処理の型変換についての解説はありました.
0677デフォルトの名無しさん2005/08/22(月) 22:53:39
>>674
厨質にもほどがある。
まずはまともに本で自習してくれないか。
0678デフォルトの名無しさん2005/08/22(月) 22:54:41
今日からC言語を勉強し始めたばかりのものです。
ぶっちゃけ、
int a=1;
・・・・
とかからどうやってドラクエとか作るんでしょうか?めちゃめちゃ不思議です。
0679デフォルトの名無しさん2005/08/22(月) 22:54:47
>>677
いや、ネタだろういくらなんでも・・・
とりあえず676が本気でやる気あるのなら、
トリップつけて(自分でくぐれよ)初心者スレへどうぞ...
0680デフォルトの名無しさん2005/08/22(月) 22:56:45
猫。
ttp://www.kumei.ne.jp/c_lang/index_c.html
0681デフォルトの名無しさん2005/08/22(月) 22:59:05
>>678
戦闘のダメージとかはただの計算式だし
表示は画面を構成する二次元の点々に色付けるだけだし。
まずはマルバツでも作ってみたら。
ユーザーの入力、計算、画面の出力という意味でドラクエと変わらんw
0682デフォルトの名無しさん2005/08/22(月) 23:06:00
俺にはプログラムでドラクエが動くことよりも、ドット絵師の技術の方が不思議に見える。
0683デフォルトの名無しさん2005/08/22(月) 23:06:24
>>682
漏れも。
0684人事部2005/08/22(月) 23:20:22
社員番号:0x0255の方、次の職探しで大変ですね。
受けた会社から聞き合わせの電話が来たら、しっかりとあなたの問題行動を伝えておきますので。
0685デフォルトの名無しさん2005/08/22(月) 23:21:17
ヒットアンドブローはお手軽に作れてそれなりに遊べて、
プログラムの練習に超おすすめ。
0686デフォルトの名無しさん2005/08/22(月) 23:24:47
聞き合わせ?
0687デフォルトの名無しさん2005/08/23(火) 06:18:47
>>676
お手数です。続けるべきじゃないですがチト引っかかるので…
「代入処理の型変換」って「代入文での型変換」ということですよね。
そもそも、
>>643 >>共用体を使ってshort型で入れた整数をlong型に変換
にある例を、いわゆる"型変換"と呼ぶ(考える)のは誤解のもと
でしょうから注意。(強いて言えば byte(or bit)列の操作かなあ?)
その本も見たこと無いんで十分な説明があるのか良否はわかりませんが、
入門者に誤解を与えかねないのは危険かも。
どちらにせよ学習者が1冊だけを参考にするのは不備でしょう。

0688デフォルトの名無しさん2005/08/23(火) 09:43:34
プログラムの一部を//や/**/等でコメントにすることをなんと言いますか?
0689デフォルトの名無しさん2005/08/23(火) 09:44:51
コメントアウト
0690デフォルトの名無しさん2005/08/23(火) 09:45:07
>>688
コメントアウト
0691デフォルトの名無しさん2005/08/23(火) 09:46:09
>>689-690
ありがとう

では、コメントアウトした部分をもとに戻すことはなんと言いますか?
0692デフォルトの名無しさん2005/08/23(火) 09:56:50
あまり使わないような気もするけど
encomment/decomment
0693デフォルトの名無しさん2005/08/23(火) 13:05:45
コメントアウトを戻す
0694デフォルトの名無しさん2005/08/23(火) 17:19:15
コメントイン
0695デフォルトの名無しさん2005/08/23(火) 17:34:20
お前マジ頭いいな
0696デフォルトの名無しさん2005/08/23(火) 23:18:29
普通だって。
# なんだ、この流れは。
0697デフォルトの名無しさん2005/08/23(火) 23:21:52
>>691
uncomment 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
>>698
リストって線形リストか?
とりあえず新たに挿入するノードようの領域をmallocなりcallocなりで確保して
こいつへのポインタをnewにでも放り込んでおく
んで、挿入位置の直前にあるノード(A)の次のノードへのポインタをnewの次へのポインタに複写
その後、Aの次へのポインタをnewへのポインタに書き換えて終了
0700デフォルトの名無しさん2005/08/23(火) 23:55:25
>>698
A→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
口−−→■⇒

 ◆を挿入

口→◆♂■⇒
07026982005/08/24(水) 00:25:47
簡単な挿入をおこなってるプログラム書いてほしいって言ったら…駄目?

よんでもいまいちワカランのよ
0703デフォルトの名無しさん2005/08/24(水) 00:26:59
今読んでるの葬ってソースの載ってる本探せよ。
0704デフォルトの名無しさん2005/08/24(水) 00:31:15
持ってる本はリスト関連がのってなくて…
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 ");
他にはビットフィールドと共用体を利用する等
でいいのかな
■ このスレッドは過去ログ倉庫に格納されています