【ANSI-C】 C言語なら俺に聞け!  Part 127

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 126
http://pc8.2ch.net/test/read.cgi/tech/1145799128/l50


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/l50
C/C++の宿題を片付けます 64代目
http://pc8.2ch.net/test/read.cgi/tech/1146323457/l50
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/l50

2デフォルトの名無しさん:2006/05/12(金) 04:31:27
>>1
代わりにスレ立てありがとう!
3デフォルトの名無しさん:2006/05/12(金) 06:12:43
プログラミング経験なしなんですがCを学ぼうと思います
まずなにをすればいいんですか?
サイト見ても本屋行ってもなにすればいいかちんぷんかんぷんです
4デフォルトの名無しさん:2006/05/12(金) 06:31:33
先ずは参考書とコンパイラと呼ばれるものをそろえる。

参考書はテンプレにあるスレを回ればいろいろ書いてある。
一冊で全て覚えようとするよりも、自分のレベルに有った物を段階的に探そう。

次にコンパイラ、簡単に言えば書いたプログラムを実行するためのもの。
無料・有料の物がある。
お金があれば使い勝手の良い物や、手間をいろいろ省いてくれるようなものが手に入る
「無料では作れない」ではなく、有料の物に比べて手間暇が掛かることがあるということ。

学習するだけなら最初は無料の物ですまし
慣れてきてから、他に良い物が無いか探した方が金銭的には優しいかと。
5デフォルトの名無しさん:2006/05/12(金) 06:51:08
ありがとうございます!
わかりました
やってみます
6デフォルトの名無しさん:2006/05/12(金) 12:54:03
#define ABS(x) (((x) < 0) ? -(x) : (x)) とあるのですが、

(((x) < 0) ? -(x) : (x)) を '?'や':'を使わずに表すとどういう意味になるんでしょうか?
7デフォルトの名無しさん:2006/05/12(金) 13:02:25
>>6
(((x) < 0) * -(x) + (!((x) < 0)) * (x))
8デフォルトの名無しさん:2006/05/12(金) 13:03:22
>>6
日本語で説明しちゃダメか?
9デフォルトの名無しさん:2006/05/12(金) 13:18:34
>>8
日本語で教えてくださいませ
10デフォルトの名無しさん:2006/05/12(金) 13:20:02
(x)が0より小さかったら-(x)、そうでなかったら(x)
11デフォルトの名無しさん:2006/05/12(金) 13:25:41
>>10
お〜。そんな意味だったんですか!
if文に似てるということは知ってたんですが、詳しくは知らなかったのでどうもありがとうございます。
126:2006/05/12(金) 13:34:52
もう一つお聞きしたいのですが、'?'や':'を用いたものは何と呼ばれているのでしょうか?
?文などで検索してもヒットしないので・・・
13デフォルトの名無しさん:2006/05/12(金) 13:39:51
三項演算子
147:2006/05/12(金) 13:45:18
三項演算子を使わずに(ほぼ)等価のコードを書いたのに無視された…_/ ̄|○
他の言語だとif()とかiif()とかって関数だったりするね。
15デフォルトの名無しさん:2006/05/12(金) 13:46:20
※覚えたての時はやたら使いたくなるので注意
16デフォルトの名無しさん:2006/05/12(金) 13:50:33
※さっきの例でABS(x)のxに関数を代入したら、その関数は3回呼ばれるので注意
17まなみ:2006/05/12(金) 13:58:39
はじめまして

C言語の二次方程式のプログラムが
わからなぃですぅ(><)

だれかぉしぇてくださぃ
18デフォルトの名無しさん:2006/05/12(金) 14:01:43
>>17
>1
まぁ、宿題スレ辺りかね。
19まなみ:2006/05/12(金) 14:02:39
ぁりがとぅござぃます
20デフォルトの名無しさん:2006/05/12(金) 14:32:00
なんで、ポインタが高速と言われていたのか教えてくれないか?
できれば、コンピュータがどのようにして処理をしているかも書いてくれたら凄く嬉しい。

低レベルでスマソ
21デフォルトの名無しさん:2006/05/12(金) 14:39:07
>>20
あんたに「ポインタが高速」と言う知識を与えた資料に当たれ。
このスレ的には、「ポインタが高速」なんて概念はない。
22デフォルトの名無しさん:2006/05/12(金) 14:59:58
strcpy
23デフォルトの名無しさん:2006/05/12(金) 15:42:03
>>20
> なんで、ポインタが高速と言われていたのか教えてくれないか?

誰かがそう言っていたから。

> コンピュータがどのようにして処理をしているか

板違い
24デフォルトの名無しさん:2006/05/12(金) 16:21:37
>>20
例えば strcpy を実装するのに

char* strcpy(char *p1, char *p2) {
 char *ret = p1;
 while((*p1++ = *p2++)) { }
 return ret;
}



char* strcpy(char *p1, char *p2) {
 int i;
 for(i = 0; (p1[i] = p2[i]); ++i) { }
 return p1;
}

の二通りの実装が考えられるが、
i とポインタの両方を使って参照するよりは、
ポインタを進めてポインタのみで参照した方が速い・・・
と言われてた時期があった。

今では下のコードも上のやつに最適化されるので
こういうことに気を回す必要はない。
細かいことはコンパイラに任せて、
直感的に分かりやすい下の方を使え。
25デフォルトの名無しさん:2006/05/12(金) 18:56:31
質問です。
javaでは配列aの長さをa.lengthで得ることができますが、
cでは.lengthにあたるものはないんでしょうか。

コマンドラインから
./a.out 2 4 5
としたときにargv(mainの引数の配列)の長さ3を得たいのですが。
26デフォルトの名無しさん:2006/05/12(金) 19:00:43
>>25
その例なら、単純にargcが4だ。
27デフォルトの名無しさん:2006/05/12(金) 19:04:42
でも一般的に(静的に固定長じゃない)配列の長さを得る手段はCにはないね。
28デフォルトの名無しさん:2006/05/12(金) 19:18:54
>>26 今までargcの意味をわかっていませんでした。ありがとうございます。

>>27 そうなんですか。javaは便利ですね。ありがとうございました。
29デフォルトの名無しさん:2006/05/12(金) 19:24:48
ついでに言うと、argv[]はNULLターミネートもされている。
argv[0]は(どこぞにある)"./a.out"を指し、
argv[1]は(恐らくはargv[0]の近くにある)"2"を指し、
以下同様に
argv[3]が"5"を指して、
argv[4]はNULLということ。
30デフォルトの名無しさん:2006/05/12(金) 19:27:55
31デフォルトの名無しさん:2006/05/12(金) 20:59:29
以下のような関数を作ったのですが
どうしても不可解なことが起こるので
質問させてください。

下のものはある関数を作る途中で
不具合がおきて、それの検証を
するために内容を減らしたものです。
関数としては意味の無いことを
してますが、なにとぞよろしくお願いします。

3231:2006/05/12(金) 21:00:14
void *takeword(char *str){

  char *p,*q;

  p=(char *)malloc(sizeof(str));/*pのメモリー確保*/
  q=(char *)malloc(sizeof(str));/*qのメモリー確保*/

  if(p==NULL||q==NULL){/*メモリ確保できないときのエラー*/
  printf("メモリー確保失敗\n");
  exit(1);
  }

  strcpy(p,str);/*入力strをpにコピー*/
  printf("p=%s",p);/*pを画面出力*/

  strcpy(q,p);/*pをqにコピー    (ここがどうもおかしいです)*/
  printf("q=%s",q);/*qを画面出力*/


}

結果としてqに正しくpの内容がコピーされません。
原因わかる方いましたらよろしくお願いします。

環境:winXP
  lsi C-86
3331:2006/05/12(金) 21:03:21
参考までにソース貼っておきます

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void *takeword(char *str,int num);

main(){
char x[20]="abc efg\n",*y;
  takeword(x);
}

void *takeword(char *str){

char *p,*q;

p=(char *)malloc(sizeof(str));
q=(char *)malloc(sizeof(str));
if(p==NULL||q==NULL){
printf("メモリー確保失敗\n");
exit(1);
}
strcpy(p,str);
printf("p=%s",p);
strcpy(q,p);
printf("q=%s",q);
}
34デフォルトの名無しさん:2006/05/12(金) 21:05:09
sizeof(str)

↑ は str というポインタ変数のサイズ(4 バイト)になる。
3531:2006/05/12(金) 21:06:04
すません
main内1行目*yがけし忘れ。
ソース5行目のtakewordの引数
int numがけし忘れです。
すません><
よろしくおねがいします
36デフォルトの名無しさん:2006/05/12(金) 21:07:08
>>31
sizeof(str)で得られるのはchar型ポインタのサイズである4
3731:2006/05/12(金) 21:17:42
そこでしたかぁ><ありがとうございます!

もし入力されたcha型ポインタが指す文字列が
十分入る文字列を確保したい場合は

while(*str){
  i++;
}
p=(char *)malloc(i*sizeof(char))

て感じですかね(@@)
丸投げですいません。ありがとうございます!
38デフォルトの名無しさん:2006/05/12(金) 21:21:20
何で strlen を使わないんだろうか・・・
3931:2006/05/12(金) 21:33:55
問題解決しました!
ありがとうございました〜☆
40デフォルトの名無しさん:2006/05/12(金) 21:34:44
文字列終端のヌル文字用の 1 を足してない悪寒
41デフォルトの名無しさん:2006/05/12(金) 21:36:56
それ以前に無茶苦茶じゃん
42デフォルトの名無しさん:2006/05/12(金) 21:37:45
>>40
だろうね
43デフォルトの名無しさん:2006/05/12(金) 22:38:19
printfで
floatの出力指定が%f、doubleは%lfだと信じてる人が多いのは
嘆かわしい限り。
scanfと同じだと思ってるんだろう。
特に大学の先生にもdoubleは%lfだと教える人がいる。
間違いの再生産だ。
44デフォルトの名無しさん:2006/05/12(金) 22:43:27
少なくともmanに従えば、%lf@printfは未定義動作なんだよな
だが実際には大して問題が起きないから困る
45デフォルトの名無しさん:2006/05/12(金) 22:52:41
doubleもfloatも%fが正しいの?
Linuxとかだと%lfで定義されてたりするんじゃね?
46デフォルトの名無しさん:2006/05/12(金) 22:54:55
そもそも、可変個引数に小数を渡す際、
float は double に変換される。
こいつらを区別する手段が無い。
47デフォルトの名無しさん:2006/05/12(金) 23:03:33
...に対応する引数にfloatを書いたらdoubleに昇進するからね。
48デフォルトの名無しさん:2006/05/12(金) 23:05:26
大抵 %lf でも %f と同じように動作するんだけどね。
ただ、仕様で保証されてるわけじゃない。
49デフォルトの名無しさん:2006/05/12(金) 23:10:31
C99から規格上でも %lf で double に対応するようになってなかったっけ?
50デフォルトの名無しさん:2006/05/12(金) 23:15:22
C99 では、ね。
5143:2006/05/12(金) 23:46:50
>>49 >>50
C99では%lfもOKというのはホントですか!?
新ANSI C言語辞典の最新版にはそういう記述は無かった。

C99ではlong dobuleに%Lfという記述はよく見ますけど。
本来、「l」(小文字のエル)は整数型に対して使われるもの。

googleで調べましたが、C99ではlong doubleが%Lfというのばかりで、
doubleが%lfでもOkというのは見つけられなかった。

どこかにそういう記述のページはないでしょうか?
52デフォルトの名無しさん:2006/05/12(金) 23:51:33
5343:2006/05/12(金) 23:54:36
>>52
おぉ〜 ありがとぉ〜〜〜〜
54デフォルトの名無しさん:2006/05/12(金) 23:59:05
>>53
基本的にはそのサイトがやったらと詳しいわけだけど、自分で調べる方法も身に付けたほうがいい

ここのページで
http://www.jisc.go.jp/
JIS検索 → JIS規格番号からJISを検索 "X3010" と入力 → プログラム言語C
とすれば、JISのC言語規格が見られる
日本語に訳されてるけど、C99と同内容

ちなみにポップアップを許可しないと見れないからそこんとこのブラウザ設定に注意


>>52のサイトと、このJIS X3010ってテンプレに入れたほうがよくね?
5543:2006/05/13(土) 00:10:54
>>54
これまたどうも。
pdfファイルだけどスキャンしたものですね。文字情報が入ってないから
検索できない・・・
56デフォルトの名無しさん:2006/05/13(土) 00:26:47
>>51
"新"ANSI C言語辞典 といっても1997年発行だからC99は載ってないよ
5743:2006/05/13(土) 00:33:54
X3010、確認しました。
fprintf関数の項目で、p.199に
l(エル)は整数型がlongであることの指定だけれども、
%lfとした場合は、「何の効果もない」と書いてありました。

fについては「double型」というのが正しいのですね。
X3010には一言もfloat型とは書かれていない。
つまりfloatはdoubleに変換されるわけで、結局、fは
double型用、ということなのでしょう。

C99以前は%lfは未定義だけど、大抵は%fとして動作。
C99では、%lfの「l」は何の効果がなく、%fと同じ動作。
だから、正しいのは「doubleは%f」。
doubleに%lfは、誤動作はしないけど%fとしての動作が保証される。
58デフォルトの名無しさん:2006/05/13(土) 01:05:54
C89 では正しいのは %f のみ。
C99 では %f も %lf も両方正しい。
ただ、float と double を区別するわけじゃなく、
両方 double に対する書式になる。
5943:2006/05/13(土) 01:11:08
>>58
C99で%lfが正しいとX3010に書いてあるんですか?
fprintfの「l」のところには、%lfが正しいとは書いてありませんでした。
「l」が「f」の前に使われた場合には、何の効果もない、とは書いてあります。

fprintf (printf)の説明以外の箇所に、%lfが正しい、と書いてあるのかなぁ??
ここだけしか読んでないから確認出来ませんでしたが。
60デフォルトの名無しさん:2006/05/13(土) 01:13:54
>>59
だから、「何も効果がない」と定義されてるっしょ?
61デフォルトの名無しさん:2006/05/13(土) 02:26:12
%lfになんか恨みでもあんのか?親の仇か?
62デフォルトの名無しさん:2006/05/13(土) 02:35:15
>>34>>36
どうでもいいけどポインタのサイズは4と決まっているわけではない。

ex.. >31の使っているLSI-Cでは2バイトだ。
6343:2006/05/13(土) 08:07:38
>>60
つまり、X3010には、printfのdoubleの指定子は%fであり、
%lfとかいても、その「l」は何の効果もないだけであって、
%lfも正しいdoubleの指定子であるとは書かれてないのですね。
それが確認できればOKです。

>>61
scanfと同様にprintfでもfloatが%f、doubleが%lfだと
単純に信じて疑わない人が非常に多く、大学教員までもが
そのように授業で教えている事に問題を感じているわけです。
規格は規格。正しく理解していなければならない。
64デフォルトの名無しさん:2006/05/13(土) 08:11:41
>>63
%lf は %f と等価な動作をすると
C99 の規格では決まってるんでしょ?

正しくないってのは、動作が未定義な場合。
この場合動作が定義されているんだから、
即ち、%lf は double に対する正しい指定子だ。
6543:2006/05/13(土) 08:51:24
>>64
X3010では、doubleの指定子は%fだと明記。%lfもOKだという記述はない。
X3010には、%lfと書いても「l」が無視される(効果なし)と書いてある。

以上が全て。
あとは日本語の表現の仕方の問題。
66デフォルトの名無しさん:2006/05/13(土) 08:53:11
>>65
疲れるな・・・。
効果無しと定義されてるんだから、正しいだろ。
6743:2006/05/13(土) 08:54:11
>>65修正。
X3010では、doubleの指定子は%fだと明記。指定子が%lfであるとの記述はない。
X3010には、%lfと書いても「l」が無視される(効果なし)と書いてある。
6843:2006/05/13(土) 08:55:03
>>66
これはもう日本語の解釈、表現方法の問題。
69デフォルトの名無しさん:2006/05/13(土) 08:57:55
いや、違うだろw

%lf の l が無視されるってことは、
%lf は %f と同じ効果を示す事が
「規格で保証されている」わけだ。

これで %lf が正しくないとしたら何なんだよ。
70デフォルトの名無しさん:2006/05/13(土) 09:46:43
次のような配列の参照渡しでつまづいてます

func(int*);
int main() {
int a[4], b[2][2];

func(a);
func(b);

これではbの参照渡しで警告が出てしまいますが
&b[0][0]を使わずに回避する方法はないのでしょうか
71デフォルトの名無しさん:2006/05/13(土) 09:52:52
>>70
a,bは型がちがうから、素直な方法では、回避できない。
72デフォルトの名無しさん:2006/05/13(土) 11:22:59
funcを別々に作るしかないかな
うまい方法あんのかね?俺は知らない
73デフォルトの名無しさん:2006/05/13(土) 11:32:41
キャストすりゃいいじゃん
7470:2006/05/13(土) 12:02:02
確かに(int*)でキャストすれば警告されなくなりました
aとbの型の違いが理解できていませんでした
とりあえず多次元配列の型は別物なんだと考えておきます
>>71-73 thx
7543:2006/05/13(土) 13:16:54
>>69
X3010には、doubleの指定子は%fだとしか書かれていない。
double の指定子が%lfだとは「一言も」書かれていない。
したがって、doubleの指定子は、「%f」である。

%lfは、あくまでも%fと同じ動作をすると規格が保証しているだけ。
規格で「doubleの指定子が%fだ」と明記されているのとは意味が違う。

この時点で、X3010では%fと%lfが同等の扱いを受けていないことは明白。
ちなみに、C99では%lfが正しくない、とは、私は一度も発言したことはない。

この話はもう終わり。ループするだけ。
76デフォルトの名無しさん:2006/05/13(土) 13:24:30
>>75
ループさせてるのはお前だけ。
77デフォルトの名無しさん:2006/05/13(土) 13:36:58
ひねくれ者の俺はこれからは%lfバンバン使うことにしますた
78デフォルトの名無しさん:2006/05/13(土) 13:43:20
コンパイラが可変個数引数の関数のタイプチェックをする時代だからな。
79デフォルトの名無しさん:2006/05/13(土) 15:11:53
>>75
> %lfは、あくまでも%fと同じ動作をすると規格が保証しているだけ。
これを同等の扱いと言わずして何と言う。
8043:2006/05/13(土) 15:27:06
>>79
%fは、doubleの指定子だと明記されている。
%lfは、doubleの指定子だと明記されていない。
%lfのlは、「効果がない」と書いてあるだけ。

どう考えても同等の「扱い」ではない(「機能」は同等であっても)。
「%lfも%fと同様にdoubleの指定子である」と
規格書に書いてあれば、それは同等と言える。
81デフォルトの名無しさん:2006/05/13(土) 15:31:57
コンパイラのソースレベルで「効果がない」を実現していると思うのか?

誰がどう考えても等しく受理できるように書かれてるに決まってる
82デフォルトの名無しさん:2006/05/13(土) 15:32:39
うぜぇよ、おまえ
83デフォルトの名無しさん:2006/05/13(土) 15:39:12
「規格の解釈の違い」ではなくて
「日本語を理解できているか」の違い
84デフォルトの名無しさん:2006/05/13(土) 15:39:33
すいません、彼らは何をモメているのでしょうか
85デフォルトの名無しさん:2006/05/13(土) 15:41:35
たれてるおっぱい
86デフォルトの名無しさん:2006/05/13(土) 16:04:59
アレだな
%lf原理主義者だな
どうでもいいな うん
87デフォルトの名無しさん:2006/05/13(土) 16:31:00
どっちが推奨か、という点を鑑みれば、議論に意味もなくはないが。
まぁ、どう解釈しても機能は同等ということだな。

それはさておき、printf()系とscanf()系の指定子が同じと書かれた入門書には参るね。
%fだけでなく、%nや%c, %xでさえ同じといっては間違いだというのに。
88デフォルトの名無しさん:2006/05/13(土) 17:11:27
おせっかいかもしれんが
int a[4], b[2][2];
func(a);
func(b[0]);
func(b[1]);
ってするんぢゃねの?

func()の定義って func(int *p) もしくは func(int p[]) だろ?
89デフォルトの名無しさん:2006/05/13(土) 17:22:53
%lfの l は f の指定で動く動作を拡張だろ?

やれといわれて
a)はぁ?あんた指示間違ってるよ、わけわけんねぇw と文句を言ってやらない
b)指示に誤りがあったとしても分かる範囲でやっときます
のどっちかという話であって、

>%fは、doubleの指定子だと明記されている
>%lfのlは、「効果がない」と書いてある

なら b) だってだけw
90デフォルトの名無しさん:2006/05/13(土) 18:47:40
charとintとfloat以外使わなければ万事解決
91デフォルトの名無しさん:2006/05/13(土) 22:16:13
>>89
128bit の浮動小数点とかの long double な環境だったりすると誤解を招かないかい?
92デフォルトの名無しさん:2006/05/13(土) 22:17:06
Cのポインタって、どうしてあんな簡単に、入っちゃ行けない領域にポンポンアクセスしちゃうの?
93デフォルトの名無しさん:2006/05/13(土) 22:21:09
プログラマーが、全てを把握した上でコードを書いてるという想定になってるから
94デフォルトの名無しさん:2006/05/13(土) 22:24:31
やっぱスリル満点の言語だなぁ…Cは。
95デフォルトの名無しさん:2006/05/13(土) 22:26:44
そこにシビれる憧れるぅ
96デフォルトの名無しさん:2006/05/13(土) 22:35:46
>>88
二次元外列を配列の配列と思っているバカがいる
97デフォルトの名無しさん:2006/05/13(土) 22:49:50
日本語でおk
98デフォルトの名無しさん:2006/05/13(土) 22:58:40
皆さん、処理系は何使っている?
99デフォルトの名無しさん:2006/05/13(土) 23:14:19
VC2005Expressで
cpp1つだったのを
cpp2つとh1つに分けたら
色々エラーが出てしまいました・・。
ほかのファイルに書いてある関数が認識されていない?
'CUSTOMVERTEX' : 定義されていない識別子です。
'vertices' : 定義されていない識別子です。
'g_pd3dDevice' : 定義されていない識別子です。
'D3DFVF_CUSTOMVERTEX' : 定義されていない識別子です。
というようなエラーが出ます。SDKのサンプル見ながら書いたので
ほとんど同じソースです。
10099:2006/05/13(土) 23:15:46
C/C++のプログラムの知識があまりないです
(C言語、C++言語の入門のページを途中までしか読んでいない)
101デフォルトの名無しさん:2006/05/13(土) 23:15:57
>>101
上手い!
俺は>>99見たときになにか書きこんでやろうと思ったが、
なにも思い浮かばなかった。俺には文才が無い、他の人ならどんな書きこをするのだろう?
だから、俺はこのスレにいつか書きこむであろう>>101の存在を息を殺して待っていた。
すると、>>101のレスを発見!
おもしろい!
102デフォルトの名無しさん:2006/05/13(土) 23:18:28
>>101
あちゃー・・・
103デフォルトの名無しさん:2006/05/13(土) 23:22:07
.hがインクルードされてないとか、プロジェクトにソースが二つとも追加されていないとか、
スペルミスしているとか、たまにあるけど、サンプルコードが間違ってるとか。

いろいろ原因があるのでなんともアドバイスできん。
10499:2006/05/13(土) 23:28:37
ソースうpします
http://briefcase.yahoo.co.jp/ningenxp/

一時オープンフォルダ2
directx05.zip
10599:2006/05/13(土) 23:31:20
>>103
!!!
sub.hインクルードしました
でもまだエラーが
106デフォルトの名無しさん:2006/05/13(土) 23:31:27
>>99
もともと一つの cpp ファイルに書いてた処理を、別のファイルに追い出したときに
追い出された方では DirectX のヘッダファイルを入れてないんじゃないかな

どっちにしろ、このスレで訊くようなことではない気がする
10799:2006/05/13(土) 23:36:38
ほかのファイルに書いてある関数は実行できない??
108デフォルトの名無しさん:2006/05/13(土) 23:37:53
.h に関数宣言かいとけば、staticじゃなきゃ実行できる。
10999:2006/05/13(土) 23:44:01
tonkusu
宣言しました。・・・
main.obj : error LNK2005: "struct IDirect3D9 * g_pD3D" (?g_pD3D@@3PAUIDirect3D9@@A) は既に logo.obj で定義されています。
main.obj : error LNK2005: "struct IDirect3DDevice9 * g_pd3dDevice" (?g_pd3dDevice@@3PAUIDirect3DDevice9@@A) は既に logo.obj で定義されています。
main.obj : error LNK2005: "struct IDirect3DVertexBuffer9 * g_pVB" (?g_pVB@@3PAUIDirect3DVertexBuffer9@@A) は既に logo.obj で定義されています。
main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl Bepp(void)" (?Bepp@@YAXXZ) が関数 _WinMain@16 で参照されました。
11099:2006/05/13(土) 23:47:04
今日は諦めて寝ます
そのうちDirectXのスレいきます
111デフォルトの名無しさん:2006/05/13(土) 23:48:40
まずはソース
112デフォルトの名無しさん:2006/05/13(土) 23:48:42
main.cpp
logo.cpp
sub.h

と3つあるけど、logo.cpp に記述されている関数が main.cpp に伝わってないじゃないか
#include とか、関数宣言とか、extern とかインクルードガードとか調べてから、
30行くらいの短いプログラムでも書いて分割コンパイルについて勉強しなさい。
DirectX より先に C言語そのものの勉強をする方が先。
113デフォルトの名無しさん:2006/05/13(土) 23:49:12
二重includeかな。
ヘッダファイルの先頭に #pragma once って書いてみたら?
114デフォルトの名無しさん:2006/05/14(日) 02:10:17
>>113
スレタイ100回音読ののち、吊れ。
115デフォルトの名無しさん:2006/05/14(日) 05:06:41
#include <stdio.h>
int main(void){
int i, j, n;
char buf[80];
fgets(buf, 80, stdin), sscanf(buf, "%x %x", &i, &j);
n = i * j;
printf("%x\n", n);
}

このような16進数同士の掛け算を行い、その答えを16進数で表示するプログラムがあるんですが、
「feeddead f00dbeef」を実行するとオーバーフロー?で上手くいきません
どこをどう変えればちゃんとした答えが出るようになるのか教えてくださいませ
116デフォルトの名無しさん:2006/05/14(日) 05:32:59
ヒント:用意した変数の有効範囲
117デフォルトの名無しさん:2006/05/14(日) 05:42:04
う・・・ヒントじゃなくて悪いところを訂正していただきたいのですが・・・
intをどう変えるべきなのかとか、%x自体もこのままでいいのか分からないので
118デフォルトの名無しさん:2006/05/14(日) 05:54:21
char:文字
int :数字
という覚え方したのかな?
それぞれには、ここからここまでという扱える限界がある。
それを越えるとオーバーフロー(コップに水を注ぎすぎて溢れる様な状態)になり。
下手をするとシステムがいかれたりする。
char型 int型の説明を見直しておいて。

みた感じ、>>115のはソースそのまんまじゃなくて
関係有りそうなの切り貼りしたんじゃないか?
質問するときは、なるたけ全部はってくれ。
自分が思っていたところとは違うところが間違ってる事があるから。

本当に>>115の内容のままだとするとだと
fgets と sscanf についての宣言エラー
;構文のエラーが最低出るはず。

エラーかでたら処理を細かく区切って簡単なモノにして
一つずつチェックした方が原因追及が楽。
119デフォルトの名無しさん:2006/05/14(日) 07:28:22
>>116
アホ?


引数の評価順序の問題だろ?

# たぶん、「;」を「,」とタイプミスしただけだろうが…
120デフォルトの名無しさん:2006/05/14(日) 08:05:37
115のコードはオーバーフローを起こすこと以外は全く問題ないと思うのだが。
121デフォルトの名無しさん:2006/05/14(日) 08:27:20
>>120
>119
122デフォルトの名無しさん:2006/05/14(日) 08:29:59
教本通りに下のプログラムを書いてVC++でビルドしたら警告みたいのが出ました。
ビルドは成功したのですが、この警告はどういうことでしょうか?
/* 「A」を入力するプログラム */
#include <stdio.h>

int main(void)
{
char c;
int n;

printf("AキーとEnterキーを押してください。>");
scanf("%c", &c);
printf("入力データを10進表示:%d\n", c);

printf("\nAキーとEnterキーを押してください。>");
scanf("%x", &n);
printf("入力データを10進表示:%d\n", n);

return 0;
}

g:\c\vc++\visual studio 2005\projects\3-7-1-1-1\3-7-1-1-1.c(10) : warning C4996: 'scanf' が古い形式として宣言されました。
g:\c\vc++\vc\include\stdio.h(295) : 'scanf' の宣言を確認してください。
メッセージ: 'This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
123デフォルトの名無しさん:2006/05/14(日) 08:32:23
>>122
その警告は時宜どおりに解釈したらいいと思います。
その教本を使いつづけるのなら、その警告は無視するのが無難ですが。
124デフォルトの名無しさん:2006/05/14(日) 08:36:20
>>123
古い形式ということは「scanf」はもう使われていないということですか?
125デフォルトの名無しさん:2006/05/14(日) 08:37:51
>>124
その下の英文は読めない?
126デフォルトの名無しさん:2006/05/14(日) 08:38:04
すみません。
scanf_sを使えばよかったんですね。
ありがとうございました。
127デフォルトの名無しさん:2006/05/14(日) 09:43:11
>>118
>下手をするとシステムがいかれたりする。
そんな酷い処理系があるんですか?
>fgets と sscanf についての宣言エラー
出ませんね。
>;構文のエラーが最低出るはず。
そんな個所はありませんね。

>>119
>引数の評価順序の問題だろ?
何処が?
128デフォルトの名無しさん:2006/05/14(日) 09:57:36
問題ないと思うならそれでいいんじゃね
困るの俺らじゃないし
129デフォルトの名無しさん:2006/05/14(日) 10:09:24
fgets() にしても sscanf() にしても、評価順序によって副作用のある
引数には見えませんが。
>>128
>困るの俺らじゃないし
間抜けな人がいると迷惑するんで。
130デフォルトの名無しさん:2006/05/14(日) 10:36:56
>>129
ちゃんと分かってるんだったら別に迷惑しないだろ
低脳はほっとけよ
131デフォルトの名無しさん:2006/05/14(日) 11:18:38
で、カンマ演算子は評価順序確定してたっけ?
そもそもfgets()もsscanf()も関数の戻り値はチェックするべきなんだが。
132デフォルトの名無しさん:2006/05/14(日) 11:25:03
>>119>>>>(無能の壁)>>>>>>118>>>>(オバカさんの壁)>>>>>127=ボケ
でFA
以下終了
133デフォルトの名無しさん:2006/05/14(日) 11:28:27
>>131
>で、カンマ演算子は評価順序確定してたっけ?
それくらい知っておいた方がいい。
左オペランドを評価して(副作用完了点)、その結果を捨ててから
右オペランドを評価。
>そもそもfgets()もsscanf()も関数の戻り値はチェックするべきなんだが。
何が「そもそも」か知らないが、マトモなコードを書くつもりならその通り。
134デフォルトの名無しさん:2006/05/14(日) 11:52:29
おおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお
135115:2006/05/14(日) 14:07:14
fgets(), sscanf(); でコンパイルできないのでしょうか?
学校の計算機でも、家のコンパイルでもこの方法でコンパイルはできますし・・・

私が言うのもなんですが、fgets(); sscanf(); にこだわってる方の考え方はおかしくないですか?
「;」の記号は宣言を終わらせる時に付けるものなんですよね?

>>115において「;」を極力用いずに表現すれば、

#include <stdio.h>
int main(void){
int i, j, n;
char buf[80];
fgets(buf, 80, stdin), sscanf(buf, "%x %x", &i, &j), n = i * j, printf("%x\n", n);
}

これでいいんですよ。一体何にこだわってるのか教えていただきたいのですが・・・
一からやり直したほうがいいんじゃないですか?
136115:2006/05/14(日) 14:13:54
あ〜、なんとなく分かりました!
fgets(); sscanf(); にこだわってる方って #include <stdio.h> がどういうものだかを分かってないんだよ
それでよく私の質問に答えようと思いましたねw
しかも、全く関係ないところをwww
137デフォルトの名無しさん:2006/05/14(日) 14:31:50
> 「;」の記号は宣言を終わらせる時に付けるものなんですよね?

え?
138115:2006/05/14(日) 14:44:04
すみません、こんな簡単なプログラムに高等な標準入出力ライブラリ関数のfgets()を用いた私が馬鹿なんですよね^^
では、改めて

#include <stdio.h>
int main(void){
int i, j, n; char buf[80];
scanf("%x %x", &i, &j);
n = i * j;
printf("%x\n", n);
}

「feed beef」であれば、出力結果として正しい値「be21e543」を得ることができるが、
「feeddead f00dbeef」を入力すると、なぜオーバーフローが起きるのか?
そしてどこをどう訂正すれば正しい値を出力するプログラムになるのかを教えてくださいませ
139115:2006/05/14(日) 14:45:20
char buf[80]; は消し忘れですのであしからず
140デフォルトの名無しさん:2006/05/14(日) 14:47:52
なるほど、オーバーフローだと言う認識はあるんだ。
それじゃ、次はその16進値の積に必要なビット数を概算でいいから求めてみよう。
141115:2006/05/14(日) 14:56:22
やはりそうだと言うのか!?この桁の掛け算は計算機では不可能だと言いたいのか!!!
142115:2006/05/14(日) 15:00:49
32ビット×32ビットで繰り上がりがあるため答えは65ビットにはなりそうだねぇ
「double」,「unsigned」,「long」などを使っても無理だというのか!!!
143デフォルトの名無しさん:2006/05/14(日) 15:03:35
一人で盛り上がってすみませんでした。不可能であれば不可能と返答をくださいませ
144デフォルトの名無しさん:2006/05/14(日) 15:06:56
> 32ビット×32ビットで繰り上がりがあるため答えは65ビットにはなりそうだねぇ
違う
145デフォルトの名無しさん:2006/05/14(日) 15:20:55
オ〜マイゴッド!そこにはあんまり突っ込まないで・・・
32ビット×32ビットは最大で64ビットかなぁ?・・・
146デフォルトの名無しさん:2006/05/14(日) 15:23:05
このスレッドはいつからネタスレになったんだ
147デフォルトの名無しさん:2006/05/14(日) 15:35:38
無能がボケの質問に答えたときから
148デフォルトの名無しさん:2006/05/14(日) 17:20:56
>>135
一つの文中に複数の関数呼び出しがある場合、
関数の呼び出し順序は未定義のため、君のソースは鼻から悪魔。
149デフォルトの名無しさん:2006/05/14(日) 17:42:16
>>148
いや、だから、カンマ演算子は。。。
150デフォルトの名無しさん:2006/05/14(日) 18:46:22
>>148
コンマ演算子は左項→右項の順番に実行される事が保証されている。
151デフォルトの名無しさん:2006/05/14(日) 18:54:15
65bitだとしても多倍長演算はやろうと思えば出来る。
152デフォルトの名無しさん:2006/05/14(日) 19:00:01
そ、そこを教えていただきたいのです!
153デフォルトの名無しさん:2006/05/14(日) 19:14:32
32ビットの数×32ビットの数は64ビット以内に収まるだろ?
154デフォルトの名無しさん:2006/05/14(日) 19:31:47
あの〜、どうしてどこをどう変えればいいのか教えていただけないのでしょうか?
ちょっと変えるだけなら、そのプログラムを貼っていただくだけで十分理解できますから・・・
155デフォルトの名無しさん:2006/05/14(日) 19:57:42
どうしてこちらが質問してるのに延々と質問で返してくるんですか?
そんなことすら学校で習わなかったんですか?
お前ら本当に理系かよ。左脳が腐ってんぞ
156デフォルトの名無しさん:2006/05/14(日) 20:11:29
オマエモナーw
157デフォルトの名無しさん:2006/05/14(日) 20:11:50
左脳かよw
158デフォルトの名無しさん:2006/05/14(日) 20:19:53
M ビットの数と N ビットの数の積は
(M+N-1) ビットか (M+N) ビットになる。
すなわち、32 ビットの数同士をかけても
65 ビットになんぞならん。

0x80000000 × 0x80000000 = 0x4000000000000000(63ビット)

0xFFFFFFFF × 0xFFFFFFFF = 0xFFFFFFFE00000001(64ビット)
159デフォルトの名無しさん:2006/05/14(日) 20:22:10
>>154
見れば理解できるレベルなら、検索したほうが早いだろ。
160デフォルトの名無しさん:2006/05/14(日) 20:26:54
>>153
intが64ビットある環境に移行すれば無問題
161デフォルトの名無しさん:2006/05/14(日) 20:29:56
>>158
>>145
見ろや。ちゃうってゆわれて答えをちゃんとした方にすぐ変えてるやろが
1×1=1と9×9=81を考えて訂正しとるわ、とっくに
162デフォルトの名無しさん:2006/05/14(日) 20:30:18
今の VC なら long が、
gcc なら long long が 64 ビットだな。
163デフォルトの名無しさん:2006/05/14(日) 20:30:49
>>161
すまん。
164115:2006/05/14(日) 20:31:56
紙に書いて筆算して、その確かめとしてプログラムを作成したいだけだったのでもう去ります
どうも時間の無駄をありがとうございました
165デフォルトの名無しさん:2006/05/14(日) 20:53:45
64 ビットの変数を使えばいいというのが見えんのか。
166デフォルトの名無しさん:2006/05/14(日) 21:25:05
>>164みたいなヤツは氏ねばいいのに
167デフォルトの名無しさん:2006/05/14(日) 21:34:23
>>148のような低脳も氏ねばいいのい
168デフォルトの名無しさん:2006/05/14(日) 21:41:04
引数の評価順序は決まってないとかいいたかったんだろうか
169デフォルトの名無しさん:2006/05/15(月) 03:11:56
if文などの条件式を使うよりも、シフト演算を使った方が実行時間(処理速度?)が速くなるのはなぜですか?
170デフォルトの名無しさん:2006/05/15(月) 03:17:42
ちょっと待った。
if文とシフト演算がどう繋がるんだ?
171デフォルトの名無しさん:2006/05/15(月) 04:25:46
BCCで各関数や変数の値を見るにはどうしたらいいですか?
172デフォルトの名無しさん:2006/05/15(月) 04:41:19
printf
173デフォルトの名無しさん:2006/05/15(月) 10:38:16
>>170
if(buf[i]<0) count++;
これをシフト演算で表せば、
count -= buf[i] >> 31;
このようにしてif文や三項演算子を使った文より実行速度が速くなるのはなぜですか?
174デフォルトの名無しさん:2006/05/15(月) 10:44:37
>>173
そりゃ1演算で済むからだろ。
175デフォルトの名無しさん:2006/05/15(月) 10:46:35
って、1演算でもないか。
基本的に分岐は遅いってことだけ覚えとけ。

ただこの場合、Pentium Pro 以降用の最適化にすれば
大差ないかもしれないな。
176デフォルトの名無しさん:2006/05/15(月) 10:57:19
考察で原因を書かなければならないのです・・・
177デフォルトの名無しさん:2006/05/15(月) 11:07:00
>>176
ちゃんとした考察したいなら、アセンブリ言語勉強しろ。
とりゃーえず VC++ 使ってるなら、
デバッグ実行して混合モードでアセンブリ表示してみれ。
あとは CPU のマニュアル読んで、
各命令の速度や分岐予測ペナルティに関する記述を探せ。
178デフォルトの名無しさん:2006/05/15(月) 12:15:45
>>176
スレ違い。

そもそも、本当に速くなるかどうかは実測しなければわからない。
179デフォルトの名無しさん:2006/05/15(月) 12:26:57
>>173
条件が成立する確立が低ければ、if文の方を速くできないか?
180デフォルトの名無しさん:2006/05/15(月) 12:56:36
条件が成立することが確立しているなら条件判断する必要ないと思うが。
181デフォルトの名無しさん:2006/05/15(月) 13:22:20
いい加減スレ違いだ失せろ。
182デフォルトの名無しさん:2006/05/15(月) 14:55:15
低水準入出力のread()を使用して文字列を読ませたいのですが
例えばLinuxのように連続した文字列はその通りに読んでくれるのですが
Lin uxのように間にスペースを入れると前半のLinまでしか読んでくれません。
スペースも読ませるにはどうしたらいいでしょうか?
アドバイスお願い致します
183デフォルトの名無しさん:2006/05/15(月) 15:00:32
>>182
すいません、自己解決しました
184デフォルトの名無しさん:2006/05/15(月) 15:44:17
>>182
自己解決したみたいだからいいけど、
標準Cにはいわゆる高水準入出力しかないからな。
185デフォルトの名無しさん:2006/05/15(月) 16:37:23
風紀委員うぜ
186デフォルトの名無しさん:2006/05/15(月) 16:55:10
風紀委員メガネっ子(゚Д≡Д゚)ドコー!?
187デフォルトの名無しさん:2006/05/15(月) 17:16:26
C++でのTemplateのようなものを実現したいと思い、次のようなものを考えたんですが
標準C的にはどうなんでしょうか?自分なりにJIS X3010:2003を読んだ限りでは大丈夫だと思うのですが。

--- hoge.c ---
#define X_STR(a, b) a ## b
#define STR(a, b) X_STR(a, b)

TYPE STR(hoge, ID)(仮引数並び)
{
hoge();
}


・呼び出し側

#define TYPE int
#define ID id1
#include "hoge.c"
#undef TYPE
#undef ID
int na = hogeid1(hoge);
188デフォルトの名無しさん:2006/05/15(月) 17:44:53
>>187
二カ所以上で同じ事したら二重定義エラー。
static を付ければ最も簡単に回避できるが、
回避法としては微妙。

俺ならこうする。

-- hoge.h (二重インクルードガードは省略)
/* プロトタイプ宣言 */
#define PROTO_HOGE(type, func, id) \
 type func##id(仮引数並び)

/* 実装 */
#define IMPL_HOGE(type, func, id) \
 PROTO_HOGE(type, func, id) \
 { \
  func(); \
 }

-- hoge.c
#include "hoge.h"
IMPL_HOGE(int, hoge, id1) /* int hogeid1 を実装 */

-- 呼び出し側
#include "hoge.h"
PROTO_HOGE(int, hoge, id1); /* int hogeid1 のプロトタイプ宣言 */
int na = hogeid1(hoge);
189デフォルトの名無しさん:2006/05/15(月) 18:01:01
>>188
#includeの直後でundefしてますがそれでもダメなのでしょうか?
190デフォルトの名無しさん:2006/05/15(月) 18:08:14
>>189
ダメ。マクロの二重定義の話じゃない。
関数の二重定義。

同じファイルで同じ TYPE, ID でやることはないかもしれないが、
別のファイルで同じ TYPE, ID でやることはあるかもしれない。
そうなると同じ関数が二カ所で定義されるのでリンクエラーになる。
static つければとりあえずそれぞれローカル関数になって
リンクエラーは回避できるけど、
同じ関数が何個もあって良くない。
191デフォルトの名無しさん:2006/05/15(月) 18:48:33
>>190
なるほど、6.9の制約違反ですか?
一応、IDが重複しないように管理しつつ使うつもりなのでそこは問題ないと思います

とりあえず>>188を参考にしつつもうちょっと考えてみたいと思います
ありがとうございました。
192デフォルトの名無しさん:2006/05/15(月) 19:17:48
>>191
そうけ。
まあ、それならそれで

-- hoge.h
(二重インクルードガードは省略)
#define STR(type, func, id) \
 type func##id(仮引数並び) \
 { \
  func(); \
 }

#define HOGE(type, id) STR(type, hoge, id)

としておいて

#include "hoge.h"
HOGE(int, id1)
HOGE(char, id2)

みたいなのでいいと思う。
193デフォルトの名無しさん:2006/05/15(月) 21:25:52
すみませんが、
>if(buf[i]<0) count++;
>これをシフト演算で表せば、
>count -= buf[i] >> 31;
>このようにしてif文や三項演算子を使った文より実行速度が速くなるのはなぜですか?

これってbuf[i]<0が成立すると(つまりbuf[i]の最上位ビットが1)count++するのですよね?
count -= buf[i] >> 31はcount = count - (buf[i] >> 31)ですよね。
つまりbuf[i]<0ならば、countはひとつ減ることになると思うのですが・・・
194デフォルトの名無しさん:2006/05/15(月) 21:50:52
>>193
buf[i] が符号付き 32 ビット値なら、
右シフトした際に符号が保存され、
最終的に -1 になる環境が多い。
C の規格ではちゃんと決まってなかったと思うがな。

だから、count = count - (-1); になる。
195デフォルトの名無しさん:2006/05/15(月) 23:03:28
C言語でについて色々ググって調べていたら混乱してしまいましたorz
超初心者な質問ですが答えてくださると有り難いっす

・参考書は必要か否か
・オヌヌメなサイトはどこか
(猫でも〜がVC++1.5必要みたいで困ってます
196デフォルトの名無しさん:2006/05/15(月) 23:08:00
恥ずかしいので訂正

× C言語でについて
○ C言語について
197デフォルトの名無しさん:2006/05/15(月) 23:09:41
C言語を勉強してどこへ到達したいのかによる。

Windowsプログラミングが作りたいなら、ポトペタな開発環境で
Windowsの仕組みと C の文法を並行して勉強した方がいいと思うし
コンソールアプリでいいなら K & R でガツンと勉強した方がいいと俺は思うね。
198デフォルトの名無しさん:2006/05/15(月) 23:35:51
>>197
レスどうも
C言語を覚えておけば得な気がすると思ったのがキッカケです
色んな情報が氾濫しまくってて何ができるのかイマイチ把握できてないので
一通りやってから徐々に詳しく学んでいこうと考えています
(ゲーム作れるとか作れないとか、サイトによってそれぞれ違うことが書かれていてorz)

そこで参考になるサイトや資料があれば教えてもらおうと書き込んだ次第であります
199デフォルトの名無しさん:2006/05/15(月) 23:41:44
>>198
ゲームも作れない事もないが、ゲーム作るつもりならお勧め出来ない。


参考書は数冊買っておけ。
出来る限り多く読んだ方がいい。
200デフォルトの名無しさん:2006/05/15(月) 23:41:58
最近C始めたんですが 学校のはLinuxでやりやすいんですけど
Windowsでのやり方がどうにも・・・ とりあえずなんかよさそうな
コンパイラありませんかね?フリーのやつで・・・
201デフォルトの名無しさん:2006/05/15(月) 23:43:37
>>200
Linux使ってるならCygwinでいいんジャマイカ?
202デフォルトの名無しさん:2006/05/15(月) 23:44:26
>>201
学校でやるだけじゃ不足なんでマンション帰ってからWindowsのPCで
やりたいんですよ
203デフォルトの名無しさん:2006/05/15(月) 23:53:35
Cygwin は Windows ですよ。

Windowsに慣れてるなら、Linux臭くていやになるかもしれないが、
学校でLinuxがやりやすいと思ってるならなじめると思うよ。
204デフォルトの名無しさん:2006/05/16(火) 00:02:29
>>203
あ、そうなんですか では早速使ってみます と思いきや
環境変数とかで手間取ってます(A´・ω・)フキフキ
205デフォルトの名無しさん:2006/05/16(火) 00:14:45
>>199
まずは幅広く浅い知識を蓄えようと考えてます
現状ではゲーム作成がどのくらい難しいことなのか全く把握できていませんし

そこで最初の質問に戻るのですが
オヌヌメなサイトと参考書を教えてくださいorz
206デフォルトの名無しさん:2006/05/16(火) 00:20:10
C言語でゲームというと言語的にもスレ的にもオヌヌメはできないがここかな

http://pc8.2ch.net/test/read.cgi/tech/1133286541/
207デフォルトの名無しさん:2006/05/16(火) 00:31:49
>>205
書籍は書籍スレで
208デフォルトの名無しさん:2006/05/16(火) 00:31:57
>>206
C言語を勉強して最終的にはゲームとか何でもプログラムできるようになればいいな
という願望でありまして、最初は基礎的なことを学びたいのであります
せっかくスレ探してくださったのに申し訳ありません
どうやら私はC言語の前に日本語を勉強したほうが良いのかもしれませんorz
209デフォルトの名無しさん:2006/05/16(火) 00:42:37
>>207
レスどうも
リンク辿っていって推薦書籍集みつけました
とりあえず倉薫のC言語1&2を明日購入します(なければアマゾンでw

参考書はokっす
オヌヌメのサイトだけお願いします
210デフォルトの名無しさん:2006/05/16(火) 01:24:31
ちょwww誰からのレスもないと不安になってくる(´・ω・`)
もしかして倉薫のC言語1&2って古すぎる?
211デフォルトの名無しさん:2006/05/16(火) 01:26:37
とりあえず早朝時間に余裕があったらスレ覗きますね
みなさんレスありがとうございました
お疲れ様っす
212デフォルトの名無しさん:2006/05/16(火) 01:39:46
「C言語で何でもプログラムする」という無謀な目標に愕然
213デフォルトの名無しさん:2006/05/16(火) 01:50:59
挫折するタイプの典型だな
214デフォルトの名無しさん:2006/05/16(火) 04:56:18
寧ろ挫折していることに気づかないで悪足掻きするタイプと見た。
215デフォルトの名無しさん:2006/05/16(火) 05:08:44
MSDOSでのコンパイラについてのスレがみつからないのですが。
216デフォルトの名無しさん:2006/05/16(火) 07:14:00
>>212
それは、あれか?
プログラミングは全部アセンブラで書けってことか?
217デフォルトの名無しさん:2006/05/16(火) 08:24:44
>>215
【製品版】LSI C【試食版】
http://pc8.2ch.net/test/read.cgi/tech/1141294369/l50
OpenWatcom C++
http://pc8.2ch.net/test/read.cgi/tech/1033433728/l50

DOS用にコンパイルできればコンパイラはWin用でもよい、と言うのであれば↓これも
"Code of the Nerds" Digital Mars C/C++
http://pc8.2ch.net/test/read.cgi/tech/1044210976/l50
218デフォルトの名無しさん:2006/05/16(火) 10:08:13
DOSのスレもあったべ
219デフォルトの名無しさん:2006/05/16(火) 10:19:24
汎整数拡張って何のためにあるんですか?
220デフォルトの名無しさん:2006/05/16(火) 10:52:17
>>214
いちいち人に訊かないと何も出来ない奴って何なんだろうと
以前から不思議に思ってたんですが、成る程、悪足掻きだったんですね。
221デフォルトの名無しさん:2006/05/16(火) 12:11:09
>>219
コンパイラが楽をするため
222デフォルトの名無しさん:2006/05/16(火) 14:40:56
p = bsearch(&ky,/* 探索値へのポインタ */
          x, /* 配列 */
nx,/* 要素数 */
sizeof(int),/* 要素の大きさ */
(int (*)(const void *, const void *))int_cmp/* 比較関数 */
};
223デフォルトの名無しさん:2006/05/16(火) 14:43:08
p = bsearch(&ky,/* 探索値へのポインタ */
x, /* 配列 */
nx,/* 要素数 */
sizeof(int),/* 要素の大きさ */
(int (*)(const void *, const void *))int_cmp/* 比較関数 */
};

bserchというソート済み配列から値を検索する関数に
int_cmpという値を比較して結果を返す関数へのポインタを渡す時に
(int (*)(const void *, const void *))int_cmpとして渡すそうなんですが、
どうして、単にint_cmpとして渡せないのでしょうか?
224デフォルトの名無しさん:2006/05/16(火) 14:44:57
>>223
関数の型が適切ならば、キャストの必要はありません。
225デフォルトの名無しさん:2006/05/16(火) 14:49:33
最後のカッコが}ではなく)です。すいません
226デフォルトの名無しさん:2006/05/16(火) 14:55:04
だからキャストの必要はないって言ってんだろ、なんか言えよw
227デフォルトの名無しさん:2006/05/16(火) 14:55:39
(int (*)(const void *, const void *))型の値を受け取るように
bserchが設計されているという事までは理解できました。
でも、(int (*)(const void *, const void *))って何でしょう・・・
bserchのコードは見られるのですか?
228デフォルトの名無しさん:2006/05/16(火) 14:57:04
すいません、bsearchはstdlibの中の関数です。
229デフォルトの名無しさん:2006/05/16(火) 14:58:16
だからキャストだって言ってるじゃんよう(TT
230デフォルトの名無しさん:2006/05/16(火) 15:03:29
すいません、
こんなに複雑なキャストは見たことないので
いったい、何を何にキャストしてるのか、さっぱり分らなくて
231デフォルトの名無しさん:2006/05/16(火) 15:07:50
(const void* と const void* を取って int の値を戻す関数) の ポインタ

おおよそこの手引数を取る関数の中から
上記の const void* と const void* を取って int の値を戻す関数 が呼び出される。
232デフォルトの名無しさん:2006/05/16(火) 15:11:06
>>231
なるほど、関数のポインタでキャストする時は
戻り値の型(*)(引数の型)という形でキャストするという
ふうに覚えればいいんですかね?
233デフォルトの名無しさん:2006/05/16(火) 15:28:40
いや、キャストしないように関数を作るのがいい。
234デフォルトの名無しさん:2006/05/16(火) 15:30:41
ちなみに、qsort()で使う関数と同じでいい。
つーか、この手の関数の仕様に疑問が生じたら先ずここを調べよう。
ttp://www.linux.or.jp/JM/index.html
235デフォルトの名無しさん:2006/05/16(火) 15:33:47
int int_cmp(const void* c1, const void* c2) { retrun (*(int *)c1) - (*(int *)c2); }
とでも書けってこったな。

# return で ()多い? いつも迷って ((int *)c1)[0] とか書いちゃうけど…
236デフォルトの名無しさん:2006/05/16(火) 15:50:46
キャストせずに利用できる関数をbsearchに渡したほうが
関数を書くのは面倒でも後々で楽って事ですかね。なるほど
237デフォルトの名無しさん:2006/05/16(火) 15:58:09
>>236
いいえ。キャストは最後の手段とするべきです。
238デフォルトの名無しさん:2006/05/16(火) 16:25:24
>>235
その比較関数はオーバーフローしない事が保証されてる場合のみの書き方だね。
分かって使う分には問題ないけど。
239デフォルトの名無しさん:2006/05/16(火) 17:09:04
C++なら必要だが、Cならキャストは必要なくないか?
240デフォルトの名無しさん:2006/05/16(火) 17:42:39
>>212
目標ちゃいますてwwwwww
>>208に基礎的なことを学びたいって書いてありますやん(´・ω・`)
現実的に不可能な目標たてるわけありませんよ。小さなことからコツコツと逝くタイプっすから
>>213-214>>220
ちょwwwww


漏れに関係ある書き込みには全レスしておきました
参考書(>>210)は書店に売ってなかったので尼損にて注文しました
サイトは書籍等を見ながら自分に合ったものを探します
てことで本が届いて挫折するまでこのスレには来ませんwwwww
お世話になりました。挫折したらよろしくお願いします<m(_ _)m>

追伸
タイトルが「C言語なら俺に聞け!」というわりには質問に答えてくれる人が少なくて(´;ω;`)テラカナシスでしたorz
241デフォルトの名無しさん:2006/05/16(火) 17:48:27
int *d;
*d = malloc(sizeof(int) * p);

int *d;
d = (int *)malloc(sizeof(int) * p);

どう違うのでしょうか?
242デフォルトの名無しさん:2006/05/16(火) 17:51:43
>>241
前者は大間違いです。
243デフォルトの名無しさん:2006/05/16(火) 18:11:05
>>242
上は指しているアドレスに確保しようとしているという意味になるのでしょうか?
244デフォルトの名無しさん:2006/05/16(火) 18:15:00
数値型のintに数値型のポインタを代入してはいけない
# ま、大概の実装はsizeof(int)== sizeof(int *)なんで、
# キャストを乱発すれば一応動いてしまうが厄介なんだが...
245デフォルトの名無しさん:2006/05/16(火) 18:16:26
>>240
そもそもこのスレは、あくまでこんなことしたいor分からないんだが
標準C的にはどうなのよ?って時のためのスレであって
Cに絡むことならなんでもいいって訳じゃねーしな
>>1ぐらい読んでから書けよ
246デフォルトの名無しさん:2006/05/16(火) 18:28:11
>>241
・釣りなら満足しただろうから帰っていいよ。
・初心者なら初心者スレに行った方がまともに答えてくれるよ。
・そうでなくても、「やりたいこと」を明示した方が問題解決の近道だよ。
247デフォルトの名無しさん:2006/05/16(火) 18:41:06
>>243
d は int* 変数
*d は int 変数

と思っとけ。
int 変数に void* 値を入れてどうするよという話。
248デフォルトの名無しさん:2006/05/16(火) 19:15:53
>>239
いや、Cでもキャストは要る。
むしろテンプレートを使ったstd::sortがあるのでC++ではキャストを使わずにできる。
249デフォルトの名無しさん:2006/05/16(火) 19:51:30
>>242,>>244,>>247
ありがとうございました

>>246
釣ではなかったのですが今度からはスレ見て聞くことにします
250デフォルトの名無しさん:2006/05/16(火) 20:47:34
日本語(SJIS)と対応する2バイトの16進コードを出力したいのですが
できますか?
[1] レポート
[2] 日本語(SJIS)と対応する2バイトの16進コードを出力せよ
  例:81AO □
  こんな感じです
[3] 環境
 [3.1] OS: Windows XP SP2
 [3.2] Visual Studio 2005
 [3.3] 言語: C/C++
[4] 期限: できれば早く
251デフォルトの名無しさん:2006/05/16(火) 20:49:15
>>250
C/C++の宿題を片付けます 64代目
http://pc8.2ch.net/test/read.cgi/tech/1146323457/l50
252250:2006/05/16(火) 20:49:41
スマソ
C/C++の宿題を片付けます
に書く予定でした
253デフォルトの名無しさん:2006/05/16(火) 20:49:51
>>250
宿題スレにどうぞ。
254デフォルトの名無しさん:2006/05/16(火) 22:21:23
printf関数でdouble値を表示させたいのですが、
有効数字のみを表示させることは出来ますか?

例えば、"0.000000"とか"12.123400"とかではなく
"0", "12.1234"と表示するように。お願いします。
255デフォルトの名無しさん:2006/05/16(火) 22:23:29
>>254
%g
256254:2006/05/16(火) 22:39:35
できた。ありがとう
257デフォルトの名無しさん:2006/05/17(水) 09:39:31
構造体の中身を指す
.(ドット)
->(アロー)
同じ機能なのでしょうか?
コードの中で好きに選んでいいのですか?
258デフォルトの名無しさん:2006/05/17(水) 09:47:52
構造体に対して使うか、構造体のポインタに対して使うか。
259デフォルトの名無しさん:2006/05/17(水) 10:05:34
構造体のポインタの要素に別の要素が含まれている場合は
pointer->構造体.要素
という書きかたになるのでしょうか?
260デフォルトの名無しさん:2006/05/17(水) 13:35:40
struct st_a{
int data;
};

struct st_b{
struct st_a ms;
struct st_a* ps;
};

struct st_a A;
struct st_a* B;
struct st_b C;
struct st_b* D;

B = &A;
C.ps = &A;
D = &C;

A.data = 1;
B->data = 2;
C.ms.data = 3;
C.ps->data = 4;
D->ms.data = 5;
D->ps->data = 6;
261デフォルトの名無しさん:2006/05/17(水) 15:27:03
a->b は (*a).b と全く同じ。

こういう事よくするから、書きやすくしただけ。
262デフォルトの名無しさん:2006/05/17(水) 16:28:04
ループの中にいてもどこかの関数の中ににいてもプログラムを抜ける方法はありませんか?
263デフォルトの名無しさん:2006/05/17(水) 16:41:56
exit
264デフォルトの名無しさん:2006/05/17(水) 19:47:16
Cで構造体の中にあらかじめ関数の先頭アドレスを登録して使用することは可能ですか?
265デフォルトの名無しさん:2006/05/17(水) 20:13:40
>>264
可能だよ。
266デフォルトの名無しさん:2006/05/18(木) 01:05:38
statを使わずにc99の標準ライブラリだけで
ファイルの有無と、そのれがディレクトリでないかチェックしたいのですが
どうかけばいいでしょうか?
267デフォルトの名無しさん:2006/05/18(木) 01:11:34
すいません、上の人と似たような質問になるのですが

FILE file_pointer;
struct stat file_status;
//ごにょごにょ
if(stat(file_pointer, &file_status) != 0){
ココ
}

ココと指した所に行く時は、ファイルがなかったときになるのでしょうか?
268デフォルトの名無しさん:2006/05/18(木) 01:20:23
>>267
アクセス権がないとかもありそうな気がする。
269デフォルトの名無しさん:2006/05/18(木) 01:40:41
標準Cにはディレクトリの概念が無かった気がする
270デフォルトの名無しさん:2006/05/18(木) 01:43:32
え? >>267の時ってディレクトリもはじかれるんじゃなかったっけ?
271デフォルトの名無しさん:2006/05/18(木) 01:59:48
fprintf(stderr,);
perror
とか色々とエラー出力があるのですが
具体的にどういう場合はこれとかそういうのはないんですかね?
272デフォルトの名無しさん:2006/05/18(木) 02:01:38
繰り返すけど、statは標準Cじゃない。

で、POSIXな環境なら、ディレクトリの場合も含めて
概ね同じ動作をすると思うが
それ以外の環境も考慮する場合は
ライブラリによって動作が違うから気をつけるべき。
例えば、stat("dirname/")の時とか、stat("filenam?")の時など。
また、S_ISDIRが定義されていない環境もある。
273デフォルトの名無しさん:2006/05/18(木) 02:11:44
>>271
errnoが設定されるエラーならperrorでOK
それ以外のアプリ独自のエラーなら fprint(stderr

どうせそのうち自作のログ出力用ライブラリ使うことになる。
274デフォルトの名無しさん:2006/05/18(木) 04:02:03
font_name = malloc( sizeof( "-gothic-medium-r-normal*16*"));
font_name = "-gothic-medium-r-normal*16*";
これを一行で簡潔させることはできませんかね?
単に一行につなげるだけ以外で・・
275デフォルトの名無しさん:2006/05/18(木) 04:09:53
>>274
そもそもそのコードは思いっきり間違っている。
276デフォルトの名無しさん:2006/05/18(木) 04:13:06
const char *font_name = "-gothic-medium-r-normal*16*";
277デフォルトの名無しさん:2006/05/18(木) 04:22:13
結婚式場ですっぽかされた新郎のようだ
278274:2006/05/18(木) 04:34:26
font_nameと言うのは本当は構造体の中にあります
opt.file_name です。
なので const char *font_name = "-gothic-medium-r-normal*16*"; は
できません。

すいませんが、正しいコードを教えていただけないでしょうか?
279274:2006/05/18(木) 04:35:01
いいわすれました。
ちなみに構造体の中では
char *file_name;
として宣言されています。
280デフォルトの名無しさん:2006/05/18(木) 04:49:08
残念ながら無理です。
素直に2行でやりましょう。
文字列の代入は=ではなくstrcpyで。
281デフォルトの名無しさん:2006/05/18(木) 05:04:44
sizeofで直接文字列見れるんだ、初めて知った。
てか+1しとかないとまずくないか?
282デフォルトの名無しさん:2006/05/18(木) 05:35:49
まずくないよ
283デフォルトの名無しさん:2006/05/18(木) 05:59:05
なんで?
284デフォルトの名無しさん:2006/05/18(木) 06:01:26
strlenと違って末尾のNULLも入れたサイズを返すからだろ
285デフォルトの名無しさん:2006/05/18(木) 06:42:05
NULLと'\0'の区別はつけような
286デフォルトの名無しさん:2006/05/18(木) 07:19:36
どう違うの?
287デフォルトの名無しさん:2006/05/18(木) 07:29:46
(char)NULLでようやく同じになるんじゃね?
288デフォルトの名無しさん:2006/05/18(木) 07:44:12
>>286
>>1のリンク先程度は、一度くらいは目を通しておけ。
289デフォルトの名無しさん:2006/05/18(木) 07:55:03
>>274
正しいコードはこうなるだろう。
font_name = malloc( sizeof( "-gothic-medium-r-normal*16*"));
strcpy(font_name, "-gothic-medium-r-normal*16*");
どうしても1ステップで書きないならstrlen()のコストを問題にしないのであれば、関数でも書けばいい。
そうでないなら関数型マクロでやるしかないだろう。
#C++なら別の手段もあるが……
290デフォルトの名無しさん:2006/05/18(木) 08:28:07
strdup() って ISO 標準じゃないんだよな、何故か。x
291デフォルトの名無しさん:2006/05/18(木) 08:35:48
>>290
とあるプロジェクトで、共通関数としてstrdup()同様の関数を入れてみたのだが、
利用者が解放忘れを多発するので標準じゃなくて良かったと思わなくもない。
292デフォルトの名無しさん:2006/05/18(木) 09:43:59
>>287
アホかおのれは
293デフォルトの名無しさん:2006/05/18(木) 09:55:55
/*--- スタックにデータをプッシュ ---*/
int StackPush(Stack *s, void *x)
{
if (s->ptr >= s->max)
return (-1);
memcpy((char *)s->stk + s->ptr * s->sz, x, s->sz);
s->ptr++;
return (0);
}
スタック構造のプログラムで
void 型のポインタである値stkに、任意の型の値xに入れるために、
stkをchar型にキャストしてますが、これは何のためですか?
294デフォルトの名無しさん:2006/05/18(木) 09:56:36
すいませんstkに、xを入れるためにです
295デフォルトの名無しさん:2006/05/18(木) 10:53:34
整数なのに「ptr」…
296デフォルトの名無しさん:2006/05/18(木) 12:22:18
>>293
ポインタ演算するには、そのポインタが指すオブジェクトのサイズが
解っていなければならないが、void * はそのままだと演算できない。
そのコードの場合、バイト単位で計算するために char * にキャストしているんだろう。
297デフォルトの名無しさん:2006/05/18(木) 12:23:17
>>295
定義がないのに整数と決めつける藻前もどうかと思うよ?
298デフォルトの名無しさん:2006/05/18(木) 12:36:23
>>297
じゃ「ポインタ同士を足してる」
299デフォルトの名無しさん:2006/05/18(木) 12:58:39
C言語のソースをhtmlに変換して
関数やら変数やらがリンクになって、そこをクリックすると
その宣言やヘッダファイルに飛べるようなソフト(ソースブラウザ?)が
オープンソースであったと思ったのですが、ソフト名を忘れてしまい
検索してもそれらしいソフトが見つからないので、知っているかたいたら
教えて下さい。
300デフォルトの名無しさん:2006/05/18(木) 13:06:46
doxygen
301デフォルトの名無しさん:2006/05/18(木) 13:25:58
>>300
レスありがとうございます。doxygenもおもしろそうですが
探していたのはgonzuiのことでした。やっと見つかりました。
302デフォルトの名無しさん:2006/05/18(木) 14:44:18
>>296
あ〜なるほど。
そういう決まりがあるのですね。
この場合、memcpyでコピーするサイズを与えているので、
Void型からどんな型にキャストしても機能するのでしょうか?
303デフォルトの名無しさん:2006/05/18(木) 15:27:07
>>302
例えば int が 4 バイトの環境で
  (int *)s->stk + s->ptr * s->sz
としてしまうと、コピー先のアドレスが
  「s->stk の値」+「int のサイズ」×「s->ptr * s->sz」
になるので拙い。
304デフォルトの名無しさん:2006/05/18(木) 18:03:52
マルチスレッドなアプリケーションを作りたくて調べています。
「process.hをインクルードして_beginthread関数を使え」みたいなことがよく書いてあるんですが、
この「process.h」というのはC言語の標準ライブラリに含まれているのでしょうか?
私の持っている「プログラミング言語C」の標準ライブラリには載っていないのですが・・・。
305デフォルトの名無しさん:2006/05/18(木) 18:06:24
含まれてない。
306デフォルトの名無しさん:2006/05/18(木) 19:30:28
マルチスレッドという概念そのものが標準Cにない。
307デフォルトの名無しさん:2006/05/18(木) 19:40:32
fstatシステムコールを用いて
ファイルのサイズとか種類とか調べるにはどうしたらいいんですか?
調べてもでてこないのですが・・・
308デフォルトの名無しさん:2006/05/18(木) 20:10:47
c言語でconstを用いた定数宣言がおススメできない理由って何ですか?
配列の境界値として利用できないからといわれたんですが,どういう
意味ですか?
309デフォルトの名無しさん:2006/05/18(木) 20:21:55
>>307
プラットフォーム依存の話なので、他のスレへ。

>>308
const int array_size = 10;
char buffer[array_size];
とはできない、ということかと。そういう部分を我慢できるなら、
const定数でいいと思うけどね。
310デフォルトの名無しさん:2006/05/18(木) 20:29:29
マクロは嫌、でもconstは使い物にならない。
そんなときには列挙がある。
311デフォルトの名無しさん:2006/05/18(木) 20:30:58
>>305-306
そうですか・・・ありがとうございました

調べたところMicrosoftのランタイムライブラリというのにprocess.hが含まれる、
ということらしいのですが、UNIXのコンパイラなどでもprocess.hが使えるようです
何かの規格にそって作られたライブラリなのでしょうか?
312デフォルトの名無しさん:2006/05/18(木) 20:34:23
>>311
空気よめない人間って最低だと思う
313デフォルトの名無しさん:2006/05/18(木) 20:35:29
>>308
ありがとうございます.ここでの境界値=配列の大きさということですね.
314313:2006/05/18(木) 20:36:34
間違い
>>308 → >>309
315デフォルトの名無しさん:2006/05/18(木) 20:43:52
>>311
pthread使っとけ。
316デフォルトの名無しさん:2006/05/18(木) 21:02:23
無償コンパイラと市販コンパイラってやっぱり大きな差があったりするんですか?
317デフォルトの名無しさん:2006/05/18(木) 21:03:34
あったりなかったり様々です。
318デフォルトの名無しさん:2006/05/18(木) 21:06:19
コンパイラ自体よりも開発環境の差がでかいね。

コンパイラ自体にも最適化の性能の差があったりもするわけだけど。
319デフォルトの名無しさん:2006/05/18(木) 23:16:20
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html
↑のページを見ると、strtok(),strtok_r()は使用しないことと書いてありますが、
この関数を用いずトークン分割するには、何の関数を使用することになるんですかね?
320デフォルトの名無しさん:2006/05/18(木) 23:25:05 BE:19969722-#
自前でとか。
321デフォルトの名無しさん:2006/05/18(木) 23:38:06
インライン関数よりもマクロのの法がいい!!!!!!!
なぜかといえば淫乱関数は最適化されるかどうか不明だからだ!!!!!!!!!!
322デフォルトの名無しさん:2006/05/18(木) 23:39:33
316
マイクロソフトのc++2005かインテルc++がいいよ。
どちらも無料。
323デフォルトの名無しさん:2006/05/19(金) 00:29:51
Borland C++ 5.5.1で下記をコンパイルすると「問題のあるポインタ変換」という警告が出てしまいます。
atoiの部分が悪いようですが、改善方法が分かりませぬ。
教えていただけますでしょうか。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char* hairetu[1][100];//文字列格納用配列
int suuti;//数値格納用

printf("数字を入力:");
scanf("%s",&hairetu[0]);//数字を配列に格納
printf("\n入れた数字は%s\n",hairetu[0]);//文字列として出力
suuti=atoi(hairetu[0]);//数字を数値に変換
printf("10を足すと%d\n",suuti+10);//数値として計算出力

return 0;
}
324デフォルトの名無しさん:2006/05/19(金) 00:37:00
>>323
× char* hairetu[1][100];
○ char hairetu[1][100];
325デフォルトの名無しさん:2006/05/19(金) 00:40:32
#include <stdio.h>
#include <stdlib.h>

main() {
char hairetu[100];
int suuti;

printf("数字を入力:");
scanf("%s",hairetu);
printf("\n入れた数字は%s\n",hairetu);
suuti=atoi(hairetu);
printf("10を足すと%d\n",suuti+10);
}
326デフォルトの名無しさん:2006/05/19(金) 00:40:37
横槍初心者の素朴な質問。scanf は一文字しか処理できないから hairetu[1][100] とか %s っておかしくないですか?
327デフォルトの名無しさん:2006/05/19(金) 00:41:42
>>326
> scanf は一文字しか処理できないから
どこでそんな誤解を仕入れてきたんだ
1文字しか処理できなかったら数値の読み取りすら出来ないじゃまいか
328これでもいけるぞ:2006/05/19(金) 00:44:52

#include <stdio.h>
#include <stdlib.h>

main() {
char hairetu[100][100];
int suuti;

printf("数字を入力:");
scanf("%s",&hairetu[50]);
printf("\n入れた数字は%s\n",&hairetu[50]);
suuti=atoi(&hairetu[50][0]);
printf("10を足すと%d\n",suuti+10);
}
329325:2006/05/19(金) 00:46:02
あら、scanfのhairetuの頭に付くアンパサンドが消えちゃった。

>326
上ので文字列も取得できますぞ?
330デフォルトの名無しさん:2006/05/19(金) 00:46:47
>>327出直してきます
331325:2006/05/19(金) 00:50:35
>328
ほんとだ、いけますね。
警告もでないし、違いを考えてみます。
ありがとう。
332これでもいけるぞ:2006/05/19(金) 00:51:55
printf("数字を入力:"); scanf("%s",hairetu);
suuti=atoi(&hairetu[0][0]);
333デフォルトの名無しさん:2006/05/19(金) 00:52:54
MMO製作プロジェクトCreateGame〜陸海空オンライン〜
ただ今、開発メンバー募集中!!できる奴だけこぃ!
http://www112.sakura.ne.jp/~kaientai-project/creategame.htm
334デフォルトの名無しさん:2006/05/19(金) 00:55:03
初心者向けのスレで募集とはチャレンジャーだな
335デフォルトの名無しさん:2006/05/19(金) 01:05:31
つまり、標準Cの範囲内だけで開発しろと
336325:2006/05/19(金) 01:10:10
atoiの引数配列が1次元だったから警告でたんですかね?
配列の宣言から間違えてましたか、、間違えたのでも希望通りの結果が出てしまってわけわかめ。
精進します。
337319:2006/05/19(金) 06:07:24
>>320
やっぱ自前で作るしかないんすね・・・
サンクスです。
338デフォルトの名無しさん:2006/05/19(金) 07:55:51
>>337
>使用する場合は、以下の点に注意すること。
日本語読めますか?
339デフォルトの名無しさん:2006/05/19(金) 08:13:47 BE:269585069-#
>>333
まだやってたのかよ。
去年か一昨年くらいに2chでヲチされて盛り上がってたやつじゃないか。
340デフォルトの名無しさん:2006/05/19(金) 08:16:06
>>338
その前の
>これらの関数は絶対に使用しないこと。
これが程よく狂ってるからなあ。
それに、「連続する区切り記号はまとめられる」のも
注意事項の一つに含めるべきだと思うんだが。
341デフォルトの名無しさん:2006/05/19(金) 08:35:04
>>303
レス遅れましたけど
ありがとうございます
342デフォルトの名無しさん:2006/05/19(金) 09:13:58
>>308
そもそも、constは定数じゃない。
343デフォルトの名無しさん:2006/05/19(金) 10:31:32
LinuxでソケットプログラムをCで書いてるのですが、
コネクトにタイムアウトの設定をするにはどうしたらいいでしょうか?
cnt=3;
while(1)
{
if((connect(fd,&addr,sizeof(addr))==0)break;
else if(--cnt)
{
sleep(1);
}
else
{
エラー処理
}
}
こんな感じのタイムアウトも考えてみたのですが、もっとスマートな方法は無いでしょうか?
アドバイスお願いします。
344デフォルトの名無しさん:2006/05/19(金) 10:35:30
タイトルと>>1を読め
345デフォルトの名無しさん:2006/05/19(金) 10:44:35
あるプログラムが毎回Segmentation faultで死んでいます。
gdbで調べると、どうもmain()関数起動時? に死んでる様子

main()にブレークポイント設定すると、ブレーク到達前に死にます。
main()実行前に以下の関数を呼び出しているらしく、
_alloca()
probe()
Program Received SIGSEGV, Segmentation fault.
0x00405493 in probe()
と、probe()で死にます。
何か原因はあるのでしょうか?

同じオブジェクトをリンクした、宣言などは同じで内容は別の実行
ファイルを作ると、こちらは死なないのですが。
346デフォルトの名無しさん:2006/05/19(金) 10:46:19
>>345
知るかバカ
347デフォルトの名無しさん:2006/05/19(金) 10:58:35
ですよね(´・ω・`)
348デフォルトの名無しさん:2006/05/19(金) 11:03:34
>>345
http://www.kouno.jp/home/c_faq/c16.html#0
C FAQに同じようなのが載ってるけどこれじゃないよね?
349デフォルトの名無しさん:2006/05/19(金) 11:16:18
それでした。
FAQに乗ってることなのに質問して申し訳ないです。

前にも同じことやって、同じFAQ読んだ記憶があるorz
350デフォルトの名無しさん:2006/05/19(金) 15:10:28
ソース長くてすみません。
待ち行列シミュレーションのプログラムです。
エラーが出るのですが、わけがわからないのでお願いします。

【エラー】
エラー E2356 simulator.c 28: 'time' の再宣言で型が一致していない
エラー E2344 c:\Borland\Bcc55\include\stdlib.h 348: 一つ前の 'time' の定義位置
エラー E2060 simulator.c 42: 浮動小数点の不正な使用(関数 main )
エラー E2060 simulator.c 51: 浮動小数点の不正な使用(関数 main )
エラー E2060 simulator.c 56: 浮動小数点の不正な使用(関数 main )
エラー E2060 simulator.c 58: 浮動小数点の不正な使用(関数 main )
エラー E2060 simulator.c 60: 浮動小数点の不正な使用(関数 main )
エラー E2060 simulator.c 104: 浮動小数点の不正な使用(関数 schedule )
警告 W8004 simulator.c 122: 'interval' に代入した値は使われていない(関数 schedu
e )
*** 8 errors in Compile ***

351デフォルトの名無しさん:2006/05/19(金) 15:11:57
【ソース】1行目から
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define Rand() ((double)rand()/RAND_MAX)
#define ExRand(m) (-log(1.0-Rand())/m)

#define END_TIME 1000.0
#define AR 0.1
#define SR 0.2

typedef enum{
ARRIVAL = 99,
DEPARTURE
}EVENT_TYPE;

typedef struct event{
EVENT_TYPE type;
double time;
struct event *next;
}EVENT;

352デフォルトの名無しさん:2006/05/19(金) 15:13:30
【ソース】23行目から
voidarrival(void);
voiddeparture(void);
voidschedule(EVENT_TYPE, double);

/* グローバル変数 */
double time;
double l_time;
double total_time;
int queue_length;
int customer;
EVENT top;



int main(void)
{
EVENT *current;

/* 初期化 */
time = 0.0;
l_time = 0.0;
queue_length = 0;
total_time = 0.0;
customer = 0;

/* 最初の到着イベントを作成・登録 */
schedule(ARRIVAL, AR);

353デフォルトの名無しさん:2006/05/19(金) 15:14:52
【ソース】51行目から
while(time < END_TIME){
/* イベントリストの先頭イベントを取り出す */
current = top.next;
top.next = current->next;

l_time = time;
/* 時刻を現在のイベント時刻まで進める */
time = current->time;

total_time = (time - l_time) * queue_length;


if(current->type == ARRIVAL){/* 到着イベント? */
arrival();/* 到着イベント */
}else if(current->type == DEPARTURE){/* サービス終了イベント? */
departure();/* サービス終了イベント */
}

free(current);
}
printf("\t\t|シミュレーション値|\n");
printf("総到着客数\t\t%d\n", customer);
printf("平均待ち時間\t\t%.3f\n", total_time/customer);

return 0;

}

354デフォルトの名無しさん:2006/05/19(金) 15:15:39
【ソース】79行目から
void arrival()
{
queue_length++;
customer++;
schedule(ARRIVAL, AR);
if(queue_length== 1)
schedule(DEPARTURE, SR);
}

void departure()
{
queue_length--;
if(queue_length!= 0)
schedule(DEPARTURE, SR);
}

355デフォルトの名無しさん:2006/05/19(金) 15:26:35
>>350
> エラー E2356 simulator.c 28: 'time' の再宣言で型が一致していない
> エラー E2344 c:\Borland\Bcc55\include\stdlib.h 348: 一つ前の 'time' の定義位置

まずはこれを直せよ。
簡単に言えば、「time」という名前を変数に使ってはダメ。
356デフォルトの名無しさん:2006/05/19(金) 15:31:26
357デフォルトの名無しさん:2006/05/19(金) 15:31:49
【ソース】95行目から
void schedule(EVENT_TYPE type, double rate)
{
EVENT *thisEvent, *tmp;
EVENT *pre_tmp = (EVENT *)NULL;
double interval = 1/rate;


thisEvent = (EVENT *)malloc(sizeof(EVENT));
thisEvent->type = type;
thisEvent->time = time + ExRand(interval);
thisEvent->next = (EVENT *)NULL;

tmp = top.next;
pre_tmp = ⊤

while(1){
if(tmp == (EVENT *)NULL){
pre_tmp->next = thisEvent;
break;
}else if(thisEvent->time < tmp->time){
pre_tmp->next = thisEvent;
thisEvent->next = tmp;
break;
}
pre_tmp = tmp;
tmp = tmp->next;
}
}
358デフォルトの名無しさん:2006/05/19(金) 15:38:54
ほほう、「どこがおかしいですか」タイプの丸投げか。
359デフォルトの名無しさん:2006/05/19(金) 15:54:07
>>355
timeを違う変数名に変更したらエラーが消えました。
もしかしたら、違うかもしれませんが。
すでにtimeは存在してて
それをdouble型で再定義したからいけないということなんですね。

ありがとうございました。
360デフォルトの名無しさん:2006/05/19(金) 16:31:08
>>359
そういうこと。
<time.h>にtimeという関数がある。
361デフォルトの名無しさん:2006/05/19(金) 18:50:12
そういう時はエラーの文でぐぐると解決しやすいかもよ。
「再宣言で型が一致していない」とか。
362デフォルトの名無しさん:2006/05/20(土) 00:15:00
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
363デフォルトの名無しさん:2006/05/20(土) 00:21:26
>>362
おまえ、なぜ、そんなに、ばか、なの?
364デフォルトの名無しさん:2006/05/20(土) 00:57:15
>>362
何回使えば気が済むんだ、その餌。
365デフォルトの名無しさん:2006/05/20(土) 01:31:22
#pragma, packed関連で質問です。
MSVC++で以下のコードでは構造体s_1のビットフィールドと文字cの間がパックされません。どうしてでしょう?誰か教えてください。
#pragma pack(1)
struct s_1 { unsigned a : 7; unsigned b : 1; char c; };
struct s_2 { char a8; charb8; };
union s_u { s_1bit; s_2any; };

s_utest;
int main(int argc, char* argv[])
{
s_u * p = &test; p->bit.a = 0xAA; p->bit.b = 1; p->bit.c = 0x55;
char a8, b8;
a8 = p->any.a8; b8 = p->any.b8;
return 0;
}
366デフォルトの名無しさん:2006/05/20(土) 01:50:08
>>365
ビットフィールドの区域は必ず int のサイズの倍数になるんだったはず。
どうにかして欲しいけど、そういう仕様になっている。
367デフォルトの名無しさん:2006/05/20(土) 01:51:44
>>365-366
>>1 を読み、そして吊れ。
368デフォルトの名無しさん:2006/05/20(土) 02:00:41
>>365-366-367
ありがとうございます田。
369デフォルトの名無しさん:2006/05/20(土) 11:29:01
C言語なら俺に聞けといって聞いたが難しくてわからなかったらしく
明確な答えを導き出してくれなかった。
そして初心者歓迎のほうのスレで聞いたら、ある人が答えを導き出してくれた・・・


・・・C言語の簡単なものなら俺たちに聞けにスレ名変えたほうが
370デフォルトの名無しさん:2006/05/20(土) 11:32:09
>>369
そうやって何でも人のせいにしてたらいつまでも
上達しないだろうねw
371デフォルトの名無しさん:2006/05/20(土) 12:53:14
>>369
スレタイをよく見てみろ。
聞け!とは書いてあるが、答えを教えてやる!とは書いてない。
372デフォルトの名無しさん:2006/05/20(土) 15:40:44
sscanfで入力文字列がフォーマットどおりかどうか調べるにはどうしたらいいのでしょう?
入力文字列1="tokyo23ku";
入力文字列2="tokyo23kudakke?";
format="tokyo%dku";
の場合、入力文字列1はtrue、入力文字列2はfalseになるように・・・

373区別つくけど?:2006/05/20(土) 17:01:35
char *str1="tokyo23ku";
char *str2="tokyo23kudakke?";
char *str3="tabuntokyo23ku";
char *format="tokyo%dku" "%s";
printf("%s = %d\n", str1, sscanf(str1, format, &d, buf));
printf("%s = %d\n", str2, sscanf(str2, format, &d, buf));
printf("%s = %d\n", str3, sscanf(str3, format, &d, buf));
374デフォルトの名無しさん:2006/05/20(土) 17:45:17
#include<stdio.h>
int main(void)
{
char *str1="tokyo23ku";
char *str2="tokyo23kudakke?";
char *str3="tabuntokyo23ku";
char *format="tokyo%dku" "%c";
int d;
char buf;
printf("%s = %d\n", str1, sscanf(str1, format, &d, &buf) == 1);
printf("%s = %d\n", str2, sscanf(str2, format, &d, &buf) == 1);
printf("%s = %d\n", str3, sscanf(str3, format, &d, &buf) == 1);
return 0;
}
つまりこういうかんじに、
sscanfの戻り値が1かどうか判定したらいいのですね?
375デフォルトの名無しさん:2006/05/20(土) 17:53:12
"%c"つけなくてはいけないけどね
376billy:2006/05/20(土) 18:27:24
問題文(含コード&リンク): 第1引数のファイルに含まれる文字列をカンマを区切りとして
単語に分けた上で、第2引数と第3引数のフィールドを入れ替えて出力するプログラムを作成する。
ただし、入れ替えるように指定されたフィールドの一方もしくは両方が存在しなかった場合は
入れ替えを行わないようにする。
実行例:
%cat source
This,is,source.
file,end.
%gcc -o fieldswap kadai.c
%./fieldswap source 2 3
-- Line 1 --
Field 1: This
Field 2: source.
Field 3: is
-- Line 2 --
Field 1: file
Field 2: end.
環境
OS:Linux
コンパイラ名とバージョン:gcc
言語:C
期限: 5/25
377デフォルトの名無しさん:2006/05/20(土) 18:53:43
巨大な"データ"をもつ配列をソートするときに、データではなくそれを指しているポインタを書き換えて
データを直接コピーしないっていう方法って有った?
378デフォルトの名無しさん:2006/05/20(土) 19:24:24
>>377
ポインタの配列にすればいいだけでないの。
ポインタを引数に取る比較関数を作り、比較関数の中ではポインタの参照するデータで比較する。
でその関数をqsortの引数に渡してやれば、実際のデータのコピーはすることなく
ポインタのコピーのみでソートが終わる。
SuffixArrayあたりで使われてる手法だけど。
379デフォルトの名無しさん:2006/05/20(土) 21:15:07
関数型マクロで可変引数のものは作れませんよね?
380デフォルトの名無しさん:2006/05/20(土) 21:26:54
>>379
C99 なら可能
http://seclan.dll.jp/c99d/c99d02.htm#dt19990405

C89 なら、括弧毎引数に渡すようにする事で
誤摩化す手がある。
あるいは関数名をすげかえるとか。
381デフォルトの名無しさん:2006/05/20(土) 21:31:39
変換ミスった。

×括弧毎
○括弧ごと
382デフォルトの名無しさん:2006/05/20(土) 22:08:20
またもやC99・・・。
無償でBorladC++かVisualC++で出ないかな・・・
383デフォルトの名無しさん:2006/05/20(土) 22:09:31
っVC2005ExpressEdition
384デフォルトの名無しさん:2006/05/20(土) 22:11:00
とゆうかC99だけならgccでも普通に使えるが
385デフォルトの名無しさん:2006/05/20(土) 22:20:54
VC2005ExpressEdition?
なぬ?
無償だって?
VCあったの・・・?
386デフォルトの名無しさん:2006/05/20(土) 22:27:38
永久無償だな
ATLやMFCは入ってないが
まあスレ違い
387デフォルトの名無しさん:2006/05/20(土) 22:45:24
DigitalMarsとか最近のOpenWatcomもC99に対応してるようだが。
どの辺まで使えるのかは知らんが。
388デフォルトの名無しさん:2006/05/20(土) 23:21:31
gcc も 100% 準拠というわけではないんだけどね。
389デフォルトの名無しさん:2006/05/21(日) 01:25:07
↓サイズ0や[ ]の配列宣言についてなのだがANSIでは標準?使っちゃやばい?
struct ary_zero {
int len;
char d[0];
};
struct ary_ {
int len;
char d[ ];
};
390デフォルトの名無しさん:2006/05/21(日) 01:39:35
>>389
[0]は知らないが、[]については少なくともC99には規定があった
C89については規格票持ってないので知らん
391デフォルトの名無しさん:2006/05/21(日) 02:06:13
392デフォルトの名無しさん:2006/05/21(日) 02:25:06
>>390,391
レスサンクス、規定あるのね。gcc3.4コンパイルの-Wallで警告でなかったんで大丈夫かなって思ったけど
VC2003でコンパイルしてみるとwarning C4200って出てあせっちゃった。
393デフォルトの名無しさん:2006/05/21(日) 02:28:38
>>392
gcc -ansi -pedantic -Wall でコンパイルしてみそ。
394デフォルトの名無しさん:2006/05/21(日) 03:22:30
>>393
cygwin上だけど[ ]のCでwarning: ISO C90 does not support flexible array members、、、C++でerror: ISO C++ forbids zero-size array `d' っか。。
395デフォルトの名無しさん:2006/05/21(日) 06:24:35
移植性考えるなら -ansi -pedantic -Wall で
警告すら出ないくらいにすべし。
396デフォルトの名無しさん:2006/05/21(日) 07:48:11
>>394
gccなら-std=c99
397デフォルトの名無しさん:2006/05/21(日) 12:25:22
double型の2数a,bを入力してaをbで割った商の
小数点以下だけを表示させるプログラムの作り方を教えてください。
また、while構文を使ってa,bを入力させ続けるものとします。
398デフォルトの名無しさん:2006/05/21(日) 12:40:57
>>397
ここは宿題スレでも初心者歓迎スレでもないのでヒントだけ。
結果の小数部を得るには、結果から結果を整数値に丸めたものを引く。
丸める関数にはC99ならそうでなければfloor()を使えばいい。
#但し、floor()の場合は負数に注意。
399デフォルトの名無しさん:2006/05/21(日) 12:46:20
>>398
う〜ん、ぜんぜん分からないです
400デフォルトの名無しさん:2006/05/21(日) 12:50:43
>>399
だからスレ違いだってば。
判らないんだったら初心者スレで聞けよ。
401デフォルトの名無しさん:2006/05/21(日) 13:40:02
>>399
小学校の算数をやり直した方がいいよ
402デフォルトの名無しさん:2006/05/21(日) 13:45:16
×全然わからない
〇全然考えてない


だろ?
403デフォルトの名無しさん:2006/05/21(日) 16:18:54
メモリ領域についてなんですが、ご教示いただきたくよろしく
お願いします。
BSS領域は、初期値が与えられていないデータを格納
されるといわれていますが、Cのソースコードでは
どのようなコードになるのでしょうか。
ローカル変数のことであっていますでしょうか。

404デフォルトの名無しさん:2006/05/21(日) 16:41:41
>>403
いいえ。一般的にローカル変数はBSS領域に格納されることはありません。
そしてスレ違い。
405デフォルトの名無しさん:2006/05/21(日) 16:58:48
すみません、スレ違いなのですが
家で課題をやるためにLinuxを無料でダウンロードしたいのですが、どういうものがあるのかサイト等を教えていただけませんか?
Vine Linuxは有料みたいなので・・・
                  ○
                  ο
                  o
           ,, --──-- 、._
       ,.-''"´           \
     /                ヽ、   とちょっと恥ずかしい妄想をしてしまったブーンであった。
    /                    ヽ
     l           \/     \/ l
    .|        , , ,            |
     l            (_人__)  """l
    `、/⌒i    /⌒⌒ヽ          /
     /   |   |     \       /
407デフォルトの名無しさん:2006/05/21(日) 17:27:14
>> 404
ありがとうございました。
スレ違いでしたか、すいません。どのスレが適切かなぁ。
408デフォルトの名無しさん:2006/05/21(日) 17:46:24
C/C++コンパイラならあるのですが、Cコンパイラが無償でダウンロードできるサイトを教えてください
409デフォルトの名無しさん:2006/05/21(日) 17:52:52
C/C++コンパイラではCのコンパイルはできないのか
410デフォルトの名無しさん:2006/05/21(日) 17:54:16
411デフォルトの名無しさん:2006/05/21(日) 18:01:33
>>409
コンパイルはできるのですが、enumの定義を変えないとできなかったりしたので・・・

>>410
どうもありがとうございますm(_ _"m)ペコリ
412デフォルトの名無しさん:2006/05/21(日) 18:04:06
>>411
拡張子がcで無い悪寒。
413デフォルトの名無しさん:2006/05/21(日) 18:08:46
そうです!保存するときになぜかcppになっちゃうんです
414デフォルトの名無しさん:2006/05/21(日) 18:21:07
>>413
cに変更すればいい
415デフォルトの名無しさん:2006/05/21(日) 19:08:26
>>408-414
スレ違い。1レスで終わる程度ならいいが、そうでないなら誘導するなりしろって。

>>407-408
現在使っているコンパイラを明示の上、初心者スレか環境依存OKスレ辺りにどうぞ。
416デフォルトの名無しさん:2006/05/21(日) 19:30:25
答えたいやつが答える。答えたくないなら無視しろよ。荒らしを呼ぶだけだぞw
2chやって何秒経つんだ?
417デフォルトの名無しさん:2006/05/21(日) 19:47:55
別に答えたくないわけじゃなく、クソな質問には積極的に
煽りで答えたいわけで
418デフォルトの名無しさん:2006/05/21(日) 19:52:46
性根が腐ってますねpgr
419デフォルトの名無しさん:2006/05/21(日) 20:54:30
宜しくお願いします
printf("foo = %.8x\n",foo);
なんですが、fooの値を16進数・・・・(改行)で表す
までしか分かりません、
"foo = %.8x\n"
の解釈お願いします
420デフォルトの名無しさん:2006/05/21(日) 21:00:54
421デフォルトの名無しさん:2006/05/21(日) 21:41:10
>>420
ありがとう、ドットの後の数字(8)は精度を表すという解釈で
よろしいでしょうか、

fooの値を有効精度8桁の16進数で出力せよ
あってます?
422デフォルトの名無しさん:2006/05/21(日) 21:53:34
幼児かお前は
423デフォルトの名無しさん:2006/05/21(日) 21:59:30
いいえ、乳児です。
424デフォルトの名無しさん:2006/05/21(日) 22:12:24
いいえ、ょぅι゛ょです
425デフォルトの名無しさん:2006/05/21(日) 22:41:36
ここで聞いていいのはあくまでもCの仕様のみなんですか?
明らかにスレ違いのもありますが、そうでなさそうなのも
「スレ違い、氏ね」
なんていわれますが・・・
426デフォルトの名無しさん:2006/05/21(日) 22:44:34 BE:39938742-#
>>425
いちいち気にすんなよ。
427デフォルトの名無しさん:2006/05/21(日) 22:49:41
>>425
たとえばどれがですか?
428デフォルトの名無しさん:2006/05/21(日) 22:54:50
>>425
> ここで聞いていいのはあくまでもCの仕様のみなんですか?
そのとおり。
429デフォルトの名無しさん:2006/05/21(日) 23:41:33
googleツールバーみたいなIEに付けるアプリつくりたいんだけど、
C/C++で作れる?IE APIみたいなのがあってそれをCで操作して
実装する感じになるのかな?
430デフォルトの名無しさん:2006/05/21(日) 23:52:07
そのとおり。
431デフォルトの名無しさん:2006/05/22(月) 00:03:55
>>430
参考書籍や検索キーワードありますか?
432デフォルトの名無しさん:2006/05/22(月) 00:05:38
>>431
「IE ツールバー  作成」なんかでググればそれなりに見つかる。
これ以上はすれ違い。
433デフォルトの名無しさん:2006/05/22(月) 00:17:19
Java質問スレにも同じ質問が

496 デフォルトの名無しさん : 2006/05/21(日) 23:39:52
googleツールバーみたいなIEに付けるアプリつくりたいんだけど、
javaで作れる?IE APIみたいなのがあってそれをjavaで操作して
実装する感じになるのかな?
434デフォルトの名無しさん:2006/05/22(月) 00:19:09
そのとおり。
435デフォルトの名無しさん:2006/05/22(月) 00:41:47
初心者な質問で申し訳ありませんが

ファイルを繰り返し読み込むことは可能なのでしょうか?
一度プログラムを作ってみたのですが
一度目はファイルを読み込みましたが、込二度目からは読み込めませんでした
どなたか教えてもらえませんか?
436デフォルトの名無しさん:2006/05/22(月) 00:59:05
>>435
可能ですよ?
437デフォルトの名無しさん:2006/05/22(月) 01:02:15
どのようにすればいいのでしょうか?
while文でファイル内の数字を読み返した後
再び同じことを実行したいのですが
438デフォルトの名無しさん:2006/05/22(月) 01:07:18
>>437
ヒント:fseek
439437:2006/05/22(月) 01:09:40
>>438
ありがとうございます
なるほどこんな便利なのがあるんですね
440デフォルトの名無しさん:2006/05/22(月) 01:31:54
ふつーrewind
441デフォルトの名無しさん:2006/05/22(月) 06:21:42
>430>434
おまいはアタッ〇25の司会でもやりたいのか
442デフォルトの名無しさん:2006/05/22(月) 07:23:40 BE:89861292-#
っていうか、自治厨うぜ。
443デフォルトの名無しさん:2006/05/22(月) 07:25:12
果敢にアタックしていただきましたが、>411の人、残念。
444デフォルトの名無しさん:2006/05/22(月) 09:15:28
質問っていうか、下らないグチだけど、聞いて下さい
大学の研究室で、C言語使ってます

以下に類似した処理を行う、二つソース例を出します

int aaa(int x, int y) {
int z;
z = x + y;
return z;
}

void bbb(int * x, int * y, int * z) {
*z = *x + *y;
}

勿論こんなつまんない関数じゃないけど、自分はaaa()じゃなくてbbb()みたいな書き方をすることが多い。
ただ、こういう書き方をすると、他の学生から分かりにくいソースだって言われる
人によっては、何だこれ?って反応する人がいる
先生は流石に理解できるけど、なんか変なことしてるなー...って目つきで俺のソースを見る

俺のソースのどこら辺が、良くないっていうか、変?
一応ちゃんと動く
445デフォルトの名無しさん:2006/05/22(月) 09:19:47
>>444
可読性だの書き方の問題では無い
まったく別のコードだろ?それ
使い分けできていれば問題ないがね
446デフォルトの名無しさん:2006/05/22(月) 09:23:37
>>444
動作は間違っちゃいないが、素直じゃないソースだなぁとは感じる

なぜ関数に戻り値というものがあるのか
ポインタ渡しはどういう場合に使うべきなのか

を考え直してみるよろし
447デフォルトの名無しさん:2006/05/22(月) 09:32:17
>>444
必要がなければ後者のようには書かないよ。
実行時パフォーマンスが落ちるから。
448デフォルトの名無しさん:2006/05/22(月) 09:32:55
>>444
こんなソース読まされたらお前だってぶちきれるだろ?

void add(int *a, int *b, int *c)
{
 *b = *c + *a;
}

値をひとつ返す時は関数の戻り値で返すという習慣を無視しているからだよ。
それから値を関数に渡したい時は値渡し、変数自体を書き換えるときはポインタを渡すという習慣も無視している。
そういう習慣・常識を覆すようなソースは読んでいてものすごい疲れる。
お前が生まれる前からCは使われ続けているんだからそこらへん無視して好き勝手やっちゃ遺憾。
# さらに言えばそう書いちゃいけないという技術的な理由もちゃんとあるがここでは省略。ともかくお手本をまねろと。
449デフォルトの名無しさん:2006/05/22(月) 09:40:23
void bbb(int x, int y, int* z) {
*z = x + y;
}

なら、俺は許す
450デフォルトの名無しさん:2006/05/22(月) 09:40:47
>>445-448
愚痴聞いて頂いてサンクスです
まあ、一つの戻り値を必要とする時は流石に自分もbbbで書くことはあんまりないけど、
自分が関数を作ると不思議と、戻したい値が二つ以上になってくれることが多いのですw
すると必然的に、bbbの形になり、いつの間にか戻り値は、大して役に立たないことに使われたり、
もう使う気がなくなってたり、なんてことがある訳です
451デフォルトの名無しさん:2006/05/22(月) 09:43:00
可能な限り構造体にまとめる
452デフォルトの名無しさん:2006/05/22(月) 09:47:51
>>450
>自分が関数を作ると不思議と、戻したい値が二つ以上になってくれることが多いのですw
それは単に設計が悪いだけなんじゃないか?

>>451も書いてるが、そもそもある関数が返す値というものは
基本的には関連してる物なはずだから(そうじゃないなら設計が悪い)
それを構造体にまとめれば一つになるだろ
関連する値をバラバラに扱ってるのは読みづらいし、要らぬバグの温床になる
453デフォルトの名無しさん:2006/05/22(月) 09:50:20
一つの関数に大量の処理が詰め込まれてるんじゃね?
で結果も大量に出る、と
454デフォルトの名無しさん:2006/05/22(月) 09:54:04
>>450
返したい値が複数あるときはポインタ使ってもいいと思うよ。
そういう時でも、入力するだけのintをポインタにするのは異常。
455デフォルトの名無しさん:2006/05/22(月) 10:15:38
まぁなんだ、>450みたいな香具師はC++だと非const参照使い捲くりのコード書くんだろうな、と。
或いはVBでbyRefとか。

標準ライブラリ関数の仕様と自分の仕様を見比べて、どっちが使いやすいか考えてみたら?
456デフォルトの名無しさん:2006/05/22(月) 10:27:35
FORTRAN から使うことのある関数なら
int でも入力をポインタにしてるのも許すが、
そうでなければアウトだな。
457デフォルトの名無しさん:2006/05/22(月) 11:28:25
こんな表現を見かけました。

typedef struct {int data;} *koko;
koko a = 5;

なんで
kokoは構造体なのに、こんな表現が許されるのでしょうか?
458デフォルトの名無しさん:2006/05/22(月) 11:30:57
>>457
それポインタに5を代入してないか?
意図したコードと違う気がするんだが、タイプミス?
459デフォルトの名無しさん:2006/05/22(月) 11:51:43
コンパイラはBorlandのC++Builder2006の無料版を使ってるのだが
他に無料でイイコンパイラ無い??
460デフォルトの名無しさん:2006/05/22(月) 12:19:28
スレ違い
461デフォルトの名無しさん:2006/05/22(月) 14:09:38
main() {} の変数宣言が終わった時点で、684kbyte メモリ使用していたプログラムが
return の時点では 740 kbyte のメモリを使用していることになっていたんだけど、
これってメモリがリークしているって考えていいのかな?

それともよくあること?
ちなみに、MSVC++ でデバッグモードで実行させてます。
462デフォルトの名無しさん:2006/05/22(月) 14:17:24
>>461
malloc()で確保したメモリはfree()しても、システムには帰らないんじゃないの?
463デフォルトの名無しさん:2006/05/22(月) 14:21:30
リーク検出ライブラリ使っとけ
464デフォルトの名無しさん:2006/05/22(月) 15:25:00
>>457
環境がPCじゃないなら不可侵のメモリでもいけると思います。
おそらくマイコンとかじゃないですか?
465デフォルトの名無しさん:2006/05/22(月) 15:43:06
1〜10までの整数を加算して表示するプログラムを、for文で作成せよ。
466デフォルトの名無しさん:2006/05/22(月) 15:44:26
main(){for(;;){puts("55"); break;}}
467デフォルトの名無しさん:2006/05/22(月) 15:48:42 BE:54348847-#
>>465
int main(){ int n=10; s=n*(n+1)/2; for(;;){ printf("%i\n", s); }}
468デフォルトの名無しさん:2006/05/22(月) 15:56:21
1〜10までの整数までの整数のうち、偶数のみを加算して表示する
プログラムを、while文で作成せよ。
469デフォルトの名無しさん:2006/05/22(月) 15:57:39
>>466-467
相手するなってば。
470デフォルトの名無しさん:2006/05/22(月) 16:16:19
>>468
int main(void) {
int i,x;

x=0;
for (i = 2;i <= 10;i = i + 2)
x = x + i;

printf("%d¥", x);

return 0;
}


相当雑に書いてみたw
471デフォルトの名無しさん:2006/05/22(月) 16:17:04
あ、whileか、
whileだったらループを逆にしないといかんな
472デフォルトの名無しさん:2006/05/22(月) 16:21:31
int main(void) {
int i,x;

i=0;x=0;

while(i<=10) {
i=i+2;
x=x+i;
}

printf("%d¥",x);
return 0;
}

これでいいの...かな?
whileを滅多に使わないから自信ナッシング

スレ汚しごめん
473BlackCat:2006/05/22(月) 16:56:30 BE:370083757-
>>472
多分これでいいと思うけど・・・ね
474デフォルトの名無しさん:2006/05/22(月) 17:30:37
>>472
まずいwこれだと最後に12が入ってしまうやんw
orz

475デフォルトの名無しさん:2006/05/22(月) 18:09:53
うむ。苦しゅうない
下がってよいぞ
476デフォルトの名無しさん:2006/05/22(月) 18:20:30
>>465-474
スレ違い
477デフォルトの名無しさん:2006/05/22(月) 23:18:14
#include <stdio.h>
//1..Nまでの整数のうち偶数だけを加算する関数
evenCal(int N){
int rtn=0, i=N;
while(i>0){
rtn += (i%2) ? 0 : i ;
i--;
}
return rtn;
}
C++だと怒られる
478デフォルトの名無しさん:2006/05/22(月) 23:25:28
ふーん。
そうですか。
479デフォルトの名無しさん:2006/05/22(月) 23:28:27
>>477
iの初期値を「N-(N%2)」、「i--」を「i-=2」にすれば、三項演算子も要らないのに、
何故奇数まで処理するのか?と小一時間(ry
480デフォルトの名無しさん:2006/05/23(火) 01:37:39
>>479
3項演算したかったからさ。
N−N%2なんてださくて嫌、それに醜いから俺は死んでもそんなカコワルイコードは書けないなーw

3項演算は掛け算にするけどね、最初頭の中では rtn += rtn*(i%2) だったんだけどさ、?:にしてみた。

奇数まで処理するのはこれなら奇数版も?のとなりの入れ替えで書けるから気持ちよい。
481デフォルトの名無しさん:2006/05/23(火) 01:53:41
初心者スレでやれ
482デフォルトの名無しさん:2006/05/23(火) 02:00:58
共有メモリにデータ確保すると時ってみんなどうしてる?
可変長の構造体含む場合、mmapとかでバインドできないし
困ってる

typdef struct d{
char * name;
int num;
}Data;
typde struct s{
Data *data;
int id;
}
483デフォルトの名無しさん:2006/05/23(火) 09:39:16
フルスクリーン(最大画面)で画像を出す方法が解りません
助けてください
484デフォルトの名無しさん:2006/05/23(火) 09:58:59
>>483
スレ違い
485デフォルトの名無しさん:2006/05/23(火) 10:31:54
なんでですか?
Cでフルスクリーンできないのですか?
486デフォルトの名無しさん:2006/05/23(火) 10:35:53
環境依存なんで使ってるプラットフォーム(Win/linux/unix/...)専用スレ池。

っていうか毎回やってないでテンプレで誘導しろ>>1
487デフォルトの名無しさん:2006/05/23(火) 13:28:38 BE:29115353-#
等差数列の和をループで処理するようなバカなんか入社させるわけねえだろ。
488デフォルトの名無しさん:2006/05/23(火) 14:17:39
複雑な数式書いて短くするよりも長くてもわかりやすいプログラムを書くべきと思うが
489デフォルトの名無しさん:2006/05/23(火) 14:24:10
釣られるなよ
490デフォルトの名無しさん:2006/05/23(火) 14:26:21
>>488
小学生だって理解できるような等差数列の和の数式が複雑だと思うくらいなら人間やめた方がいい。
491デフォルトの名無しさん:2006/05/23(火) 14:38:49
数学できんが何で悪いとや
492デフォルトの名無しさん:2006/05/23(火) 14:39:16
s/数学/算数/
493デフォルトの名無しさん:2006/05/23(火) 15:55:20
数学できてたら今頃プログラマなんかやってねーよ
494デフォルトの名無しさん:2006/05/23(火) 15:57:52
つか、数学だけで食っていけるの?
495デフォルトの名無しさん:2006/05/23(火) 16:10:43
20ケタの整数を16進数に変えるプログラムを書けって言われたんだけど、
どうしたらいいかな。とりあえずそのままじゃ無理だから文字列として扱うって事くらいしかわからん
教えてエロイ人
496デフォルトの名無しさん:2006/05/23(火) 16:14:54
紙の上で手作業で変換しようにもそのやり方がわからないのか
やり方はわかるがCのコードとして表現できないのか
その切り分けすら面倒なのでここに丸投げしているのか。
497デフォルトの名無しさん:2006/05/23(火) 16:18:19
まず16を底とする対数をとる。話はそれからだ。
498デフォルトの名無しさん:2006/05/23(火) 16:19:46
>>495
宿題ならスレ違い、仕事丸投げならお門違い。
499デフォルトの名無しさん:2006/05/23(火) 16:20:35
500デフォルトの名無しさん:2006/05/23(火) 17:17:54
丸投げだった模様。
501デフォルトの名無しさん:2006/05/23(火) 20:34:58
カンマ区切りデータを読み込むことをしています

データには抜けがある事があるのですが、
(入力データの例)
10,30,20
10,20,30
,20,
,30,20
10,,20
・・・

このデータを以下のようにsscanfで一行づつ読み込んでデータを取り込みたいのですが。
int x1, x2, x3;
char line[32];
sscanf(line,"%d,%d,%d%[^\n]",
&x1, &x2, &x3);
if(x1 == NULL) x1 = 0;
if(x2 == NULL) x2 = 0;
if(x3 == NULL) x3 = 0;
などとしたいのですが、
先頭データに抜けがある場合などに、抜けがないデータも含めてx1,x2,x3すべてNULLになってしまいます。(例えば例の3行目)

多分、%d指定で読み出すべきところに値が無いことが原因かなとは思いますが、回避策がわかりません。
何か回避方法ありますか?
502デフォルトの名無しさん:2006/05/23(火) 20:45:21
>>501
自分で区切る
503デフォルトの名無しさん:2006/05/23(火) 21:59:55
とりあえずsscanfはやめて一行づつスキャンしていった方が早い
504501:2006/05/23(火) 22:16:49
とりあえずfgetcあたりを調べています。
505デフォルトの名無しさん:2006/05/23(火) 22:29:00
putsとprintfの違いって何ですか?
506デフォルトの名無しさん:2006/05/23(火) 22:38:41
名前が違う
507デフォルトの名無しさん:2006/05/23(火) 23:02:02
とりあえず覚えてみた単語を使ってみたくて
0はなんでもかんでもNULLにしたがる人って居るよね。
508デフォルトの名無しさん:2006/05/24(水) 00:24:33
>>505
全てが違う
509デフォルトの名無しさん:2006/05/24(水) 00:50:27
>>505
 putsは引数で渡された文字列に改行文字を末端に付加して、
標準出力(通常はディスプレイ)に出力する関数。
 printfは第一引数で書式(printfのfは書式formatのf)を指定し、
文字列を作成して、標準出力(通常はディスプレイ)に出力する関数。

具体例
char s[] = "hoge";
puts(s); とprintf("%s\n", s);は同じく表示される。
printf(s);だと改行文字が出力されない。また、配列s内に変換指定文字%が
混じっていると不定の動作になります。
 文字列リテラルを表示するだけならputsの方が速くていいかもしれません。
例:puts("こんにちは、世界");
printfだと書式指定によっていろんな文字列が
作れるので原則こちらを使うといいのだと思います。
例:printf("今日は%4d年%2d月%2d日です。\n", year, month, day);
スピードは環境によっては遅いかもしれませんが。
printf系ファミリーは、ディスプレイに文字を表示する関数群、じゃなくて
「書式を指定したらいろいろ文字列を作ってくれる関数群」と考える
べきではないかと。
510デフォルトの名無しさん:2006/05/24(水) 01:18:50
>>507
そういうやついるな。
NULLがポインタだってわかってないから困る。
511デフォルトの名無しさん:2006/05/24(水) 01:30:03
個人的には使いたくないんだけど, 可変長配列って推奨もんなのかね?
512デフォルトの名無しさん:2006/05/24(水) 01:37:10
構造体の最後のやつの事なら、
確かにあんまり使いたくないね。
BMP の扱いで要求されたりすることはあるけど。
513デフォルトの名無しさん:2006/05/24(水) 01:38:13
現状を規格が追認したって感じじゃね?

俺はデータ構造をフラットなメモリに展開したい場合に使ってた
たとえばプロセス間通信でバイナリでまんま転送したい時とか
(構造体にポインタを含むと渡せなくなるから)
まんまファイルにシリアライズしたい時とか


WindowsだとBITMAPなんちゃらで使ってたりしてた様な
514困ってます:2006/05/24(水) 07:38:41
1. 指定された個数だけ整数を読み込んで、それらの合計、平均、分散、標準
偏差を表示するプログラムを作成せよ。for文を使うこと。
2. 14の段数をもつピラミッドを表示するプログラムを作成
せよ。
3. 9段の市松模様(以下の例を参考にせよ)を表示するプロ
グラムを作成せよ.
段数は? 3
**** **** **** ****
**** **** **** ****
**** **** **** ****
**** **** **** ****  *ここまで1段
**** **** **** ****
**** **** **** ****
**** **** **** ****
**** **** **** **** *ここまで2段
**** **** **** ****
**** **** **** ****
**** **** **** ****
**** **** **** **** *ここまで3段
515デフォルトの名無しさん:2006/05/24(水) 08:51:25
>>514
マルチのスレ違いはお帰りください。
つーか、釣りか嵐の積もりですか?
516デフォルトの名無しさん:2006/05/24(水) 09:47:11
>>514
> 困ってます

  一 生 困 っ て ろ !
517デフォルトの名無しさん:2006/05/24(水) 13:59:25
はぁぁ・・・ステキなステーキ・・・


これの解読お願いします。
518デフォルトの名無しさん:2006/05/24(水) 17:11:40
>>517
( ´∀`)つ[_gaキーテスなキテスdadぁぁは]
519デフォルトの名無しさん:2006/05/25(木) 20:37:34
リスト構造について質問です
改行が多いので二回に分けて投稿させてください

struct LIST
{
 int data;
 void (*func)();
 struct LIST *next;
};
struct LIST top;


520デフォルトの名無しさん:2006/05/25(木) 20:38:10
void listcnt(void)
{
 struct LIST *p;

 for( p=top.next; p!=NULL; p=p->next )
 {
  func();
 }
}

void addlist(int val)
{
 struct LIST *new;
 (略)
 new->func=hoge;
}

void hoge(void)
{
 ここでdataをいじる
}

こんな感じのプログラムを書きたいのですが
hoge関数内で生成されたリストの変数を操作するにはどうすればいいのですか
521デフォルトの名無しさん:2006/05/25(木) 20:42:12
連投ですみませんが、最後の文章が誤解を招きそうなので一応訂正します。
何がしたいかというと、addlist関数で生成したリストのdataをhoge関数内で操作したいのです。
522デフォルトの名無しさん:2006/05/25(木) 20:43:07
>>520
void hoge(LIST* p)
523519:2006/05/25(木) 20:48:33
できました。ありがとうございました
524デフォルトの名無しさん:2006/05/26(金) 11:55:27
>>482
> 共有メモリにデータ確保すると時ってみんなどうしてる?

自前で共有メモリ用malloc関数書くしかないんじゃない。
前やったときは仕方なくそうした。少し面倒だったけど。

525難問〜:2006/05/26(金) 17:00:30
素因数分解の問題で、再帰を使って、和が一定となる自然数の列をすべて列挙するプログラムが
わかりません〜。
そして再帰を用いずに素因数分解を行うプログラムもわかりません。

これできたらマジ天才ですよ!!
尊敬尊敬〜。
526難問〜:2006/05/26(金) 17:03:26
参考プロです!!
#include<stdio.h>
void abs_sum(int n,int w);
int main(){
int w=2,n=3;
abs_sum(n,w);
return 0;}
void abs_sum(int n,int w){
void in_abs_sum(int total_length,int n,int w);
in_abs_sum(n,0,w);}
void in_abs_sum(int total_length,int pos,int w){
int i,j,called=0;
if(pos>=total_length){
putchar('\n');
return;}
for(i=0;i<=w;++i){
if(called++){
for(j=0;j<pos;++j){
printf(" ");}}
printf(" %2d",i);
in_abs_sum(total_length,pos+1,w-i);}}

527デフォルトの名無しさん:2006/05/26(金) 17:16:15
>>525-526
適切なスレの選択も解ってないようですね。
528デフォルトの名無しさん:2006/05/26(金) 19:35:26
アンジーハァハァ
529デフォルトの名無しさん:2006/05/26(金) 20:06:39
http://www.dotup.org/uploda/www.dotup.org1046.zip

現在、大学で卒研の課題出されてて、それの為のプログラムをANSI Cで書いています。
高域通過フィルタを作るプログラムです。

ところがなぜか、このプログラム、自分が使ってるマックと、学校にあるウインドウズで、異なる動作をするので困っています。
ANSI C以外の怪しい命令は使っていないつもりです。

マックで動作させると、ちゃんとフィルタとして作動するんですが、ウインドウズで動作させると、何が何やら訳が分からない波形が出力されます。
このプログラムを実行させると二つテキストファイルが出力されます
入力波形がx-i、出力波形がy-iです
一列目がX軸、二列目がY軸の値です

エクセルや、Sma4Winなどで開けると思います。

学校で使ってるコンピュータ(Win)のCコンパイラはVisual C++ 6.0
自分のマックのCコンパイラはXcode 2.2です。

コンパイルの時にはエラーも警告も出ていません
見た感じだと、y-iの出力の段階で既に、別物になってしまっています

ソースは使っていない関数(別の課題のを切り貼りした所もある)とかもあってゴチャゴチャで申し訳ありませんが、ちょっと見て頂けると助かります。

両方のコンピュータで正常に動くことを望んでおります。
530デフォルトの名無しさん:2006/05/26(金) 20:11:12
>>528
適切なスレの選択も解ってないようですね。
531デフォルトの名無しさん:2006/05/26(金) 21:24:46
>>529
全然みてないが、宿題スレに行くといいんじゃないかと
532デフォルトの名無しさん:2006/05/26(金) 21:31:14
>>529
関数lpfの戻り値をよく追いかけろ。
俺はお前のデバッガじゃないからそれ以上は知らん。
533デフォルトの名無しさん:2006/05/26(金) 21:51:48
>>529
int*lpf(){int c;return &c;}
534デフォルトの名無しさん:2006/05/26(金) 23:01:57
>>529
それで、よく「ちゃんと動く」って宣えるね。
535デフォルトの名無しさん:2006/05/26(金) 23:11:11
>>532-533
一度確認します
536デフォルトの名無しさん:2006/05/26(金) 23:17:25
自動変数への参照は返しちゃダメよってママがよく言ってた
537デフォルトの名無しさん:2006/05/26(金) 23:26:50
一つ怪しいところが見つかったのでちょっと訂正してみました
取りあえず今度学校に行った時に、窓機で再試験してみます

ありがとうございました
538デフォルトの名無しさん:2006/05/27(土) 02:03:30
ものすごくFAQかもしれないけど,ちょっと前までのC文法って
compound-statement ::= "{" declaration-list statement-list "}"
となってるけど,
なんで宣言部分をブロックの先頭に書くことになってるのか理由が知りたい.
歴史的な理由とかあるんですか?
別に
declarationを特別扱いしないでも良さそうなもんだよね.
好きなところで変数を宣言したいよ.(してるけど...gccばっか使うから)
539デフォルトの名無しさん:2006/05/27(土) 02:09:34
単に歴史的な理由です
540デフォルトの名無しさん:2006/05/27(土) 11:07:49
>>538
すきなところにブロックを作って変数宣言すればいい
541デフォルトの名無しさん:2006/05/27(土) 14:23:54
ANSI-Cの規格内でOOPもどきをするための一般的なやり方みたいなものはないのでしょうか?
542デフォルトの名無しさん:2006/05/27(土) 14:33:16
>>541
FILEとその周りは参考になる。
543デフォルトの名無しさん:2006/05/27(土) 14:53:33
>>541
そこに労力を費やしても後で後悔することになるので
ほどほどにしておくのが一般的です
544デフォルトの名無しさん:2006/05/27(土) 15:07:01
>>542
言われてみれば確かに似てますね。見てみることにします

>>543
それは分かってるのですが、OOPの方が綺麗に纏まりますし
C++は使ってはダメなのでどうにかできないかと思って・・・


とりあえずFILE周りを参考にやってみたいと思います。ありがとうございました。
545デフォルトの名無しさん:2006/05/27(土) 15:34:37
質問です。これらのうちだとどれ選びますか?
(ちゃんと動くか確認してないから間違ってるかも)
int func(void)は最終的には0を必ず返すとして
while(x=func()){...
while((x=func())!=0){...
while(x=func(),x){...
#define While(x) while((x)!=0)
警告は無視
警告を無効に
546デフォルトの名無しさん:2006/05/27(土) 15:35:56
>>545
一番上以外を選ぶ理由があるなら聞いてみたい
547デフォルトの名無しさん:2006/05/27(土) 15:38:35
>>545
下の二つは今までお目にかかったことない
548デフォルトの名無しさん:2006/05/27(土) 15:48:32
全部見たことあるけど、変数1つで引き回すときは1か2を使う
3,4は大体デスマ系でよくみるね(1000時間ぐらいのデスマ)
549デフォルトの名無しさん:2006/05/27(土) 15:54:57
俺は1を使うのが好き。
でも糞コンパイラが=と==間違ってない?とか警告出して来てうざいので。
コンパイラに文句を言いながら2だな。
550デフォルトの名無しさん:2006/05/27(土) 16:13:15
while (int x = func())って言おうと思ったら、C99でもここでは変数宣言できないことに気付いた。
551デフォルトの名無しさん:2006/05/27(土) 17:16:44
for(;;){
 x=func();
 if(!x) break;

}
552デフォルトの名無しさん:2006/05/27(土) 17:26:23
ANSI-Cの標準ライブラリ関数の一覧が書いてあるサイトを教えて下さい。
553デフォルトの名無しさん:2006/05/27(土) 17:27:59
"C 標準関数"くらいは検索してみようと思わないのかね
554デフォルトの名無しさん:2006/05/27(土) 17:39:05
見つかりました。検索の仕方が下手だったようです。ありがとう。
555デフォルトの名無しさん:2006/05/27(土) 18:09:28 BE:29954423-#
「ANSI-C」とかきもい書き方すんなよ。
556デフォルトの名無しさん:2006/05/27(土) 18:45:43
>>555
ANSI-C
557デフォルトの名無しさん:2006/05/27(土) 18:48:58
あんしーしー
558デフォルトの名無しさん:2006/05/27(土) 18:54:39
お願いします。。。。
[1] 授業単元:訓練校のCの基礎
[2] 問題文(含コード&リンク):
char data[3][11]={{"□□□□□"},
{"□□□□□"},
{"□□□□□"}};
この二次元配列のの真ん中(2行目の横から3つ)の
「□」に「人」を代入する方法を教えて欲しいです。お願いします。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン:ボーランド6.0
 [3.3] 言語:たぶんC
559デフォルトの名無しさん:2006/05/27(土) 18:55:55
>>555
批判するなら代案を出せ
批判するだけして代案出さないとか弱小野党と一緒だな
560デフォルトの名無しさん:2006/05/27(土) 19:10:39
ISO-C
561デフォルトの名無しさん:2006/05/27(土) 19:21:13 BE:59908043-#
C-99
562デフォルトの名無しさん:2006/05/27(土) 20:51:27
memcpy(&data[1][0] + 4, "人", 2);
563デフォルトの名無しさん:2006/05/27(土) 21:38:45
>>558
data[1][4] = "囚"
564デフォルトの名無しさん:2006/05/27(土) 21:47:51
オチはあるんだろうな
565デフォルトの名無しさん:2006/05/27(土) 21:50:51
エラトステネスのふるいで、n以下の素数の個数を求めるプログラムを
以下のように書いたのですが、10^5以上だとセグメンテーションエラーです、
とでます。10^7まで求められるようにするにはどうすればいいか教えてください。
javaで同じように書くと求まるんですが、、、
コンパイラーはgccです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1951.txt
566デフォルトの名無しさん:2006/05/27(土) 21:56:23 BE:119815283-#
>>565
intじゃなくてcharの配列にしてみたら?
567デフォルトの名無しさん:2006/05/27(土) 21:58:58
>>565
×      for(j= i; i*j<N; j++) a[i*j]= 0;
○      for(j= 2; i*j<N; j++) a[i*j]= 0;
まぁ出来れば乗算じゃなくて加算で書いてほしいとこだけど。
あとintよりもcharの配列にするかbit単位に埋め込んだほうが良いと思う。
568デフォルトの名無しさん:2006/05/27(土) 22:04:50
>>566,567
お答え、ありがとうございます。
charの配列にするということでやってみます。
569デフォルトの名無しさん:2006/05/27(土) 22:07:00
>>568
あと最後のカウント用のループでi<=Nとなってるけどi<Nの間違い。
570デフォルトの名無しさん:2006/05/27(土) 23:18:01
>>562
>>563
ありがとうございます。
563のほうはエラー吐きました。
memcpyをつかうと埋め込むことが出来ました。
571あぼーん:あぼーん
あぼーん
572デフォルトの名無しさん:2006/05/27(土) 23:28:57
他人の不幸程どうでも良い事は無いwwwwwwwwwましてや掲示板
573デフォルトの名無しさん:2006/05/28(日) 00:01:36
>>565
mallocしたらfreeしようぜ。
574デフォルトの名無しさん:2006/05/28(日) 01:13:47
本買いました。よくわかりません。
2000円はらいました。
よくわかりません。
でもすこしわかります。
ちょっとなら。
575デフォルトの名無しさん:2006/05/28(日) 01:18:55
>>574
お前それ、詐欺チョン言い訳と一緒だろ
576デフォルトの名無しさん:2006/05/28(日) 09:47:33
Download the seqFIO.cpp file.
This file provides an example of how to use iostreams to perform sequential file I/O. Compile and run the code.
It is best to use the Win32 Console template in Visual C++ Express to create the project for running this program--there is no GUI associated with this code; only cin, cout, cerr, and a file are utilized to perform I/O.
After analyzing the code, and understanding how iostream file I/O is done, modify your Hangman game as follows.
Use a file called
577デフォルトの名無しさん:2006/05/28(日) 09:59:26
↑すいません、途中で切れてしまいました。
578デフォルトの名無しさん:2006/05/28(日) 10:49:41
質問です。

#include <stdio.h>
#include <string.h>
#include
579デフォルトの名無しさん:2006/05/28(日) 10:56:45
質問です。

#include <stdio.h>
#include <string.h>
#include "stdafx.h"

int main(void)
{
char string[] = "abc,def,ghi,jkl";
char delimiter[] = ",";
char *token;

token = strtok( string, delimiter );

while( token != NULL ){

printf( "%s\n", token );

token = strtok( NULL, delimiter );
}
return 0;
}

文字列を分離するプログラムなんですが、
ビルドすると「error C3861: 'strtok': 識別子が見つかりませんでした」が出てきます。
何が原因なんでしょうか?
ちなみに、VisualStudio2005を使ってます。
580デフォルトの名無しさん:2006/05/28(日) 11:11:26
>>579
#include <string.h>
はstdafx.hに書く
それが嫌ならプリコンパイルドヘッダは無効にする
581デフォルトの名無しさん:2006/05/28(日) 11:34:14
>>580
動きました。
ありがとうございました。
582デフォルトの名無しさん:2006/05/28(日) 12:36:14
WinMainでstrtok関数を使うと、
「error LNK2019: 未解決の外部シンボル __imp__strtok が関数 _WinMain@16 で参照されました。」
が出てきます。
#include <string.h> はちゃんとつけてあります。
583デフォルトの名無しさん:2006/05/28(日) 13:19:54
>>582
そういうことはVisual C++かなにかお前が使っているコンパイラのスレで聞いたほうが適切な回答が来やすい。
584デフォルトの名無しさん:2006/05/29(月) 16:07:15
60点以上の点数が入力されるまで
再入力を繰り返すプログラムを作成せよ。
(ヒント:無限ループとbreak文を使用する)
  実行例 1回目点数入力:30□
      不合格です。再試を受験してください。
      2回目点数入力:70□
      合格です。
     □はエンターキーを示す
585デフォルトの名無しさん:2006/05/29(月) 16:31:25

│ ≡  ('('('('A` )
│≡ 〜( ( ( ( 〜) 
│ ≡  ノノノノ ノ
586デフォルトの名無しさん:2006/05/29(月) 16:56:26
│↑
└┘
おらっしゃあぁぁ!!!
 ∩∧ ∧
 ヽ( ゚Д゚)
   \⊂\
    O-、 )〜
      ∪
587デフォルトの名無しさん:2006/05/29(月) 17:56:15
>>584
int main(){int input,i=0;while(1){puts("('A`)ノ");scanf("%d",&input);if((0<=input)||(input<=(3*20-1)))puts("不合格");
else if(((6*10)<=input)||(input<=(10*10)))puts("合格");break;else puts("ERROR");}return 0;}
588デフォルトの名無しさん:2006/05/29(月) 18:01:15
>>584
動作例を見ると、入力する数字は全角になっているけど大丈夫?
589デフォルトの名無しさん:2006/05/29(月) 20:56:50
>>587-588
スレ違いには「スレ違い」とだけレスしなさい。
590デフォルトの名無しさん:2006/05/29(月) 21:03:06
すいません、先生(;3;)
591デフォルトの名無しさん:2006/05/29(月) 22:55:38
strstrで 第一、第2引数がchar* xで、 第1が文字列リテラルを
592デフォルトの名無しさん:2006/05/29(月) 23:11:20 BE:69893227-#
リテラルを?
593デフォルトの名無しさん:2006/05/29(月) 23:12:53
scanf系の戻り値をチェックするのは当然のことと思ってますが
printf系(特にfprintf)の戻り値もチェックするべきなのでしょうか?
594デフォルトの名無しさん:2006/05/29(月) 23:23:27 BE:269585069-#
>>593
現場の空気で、チェックしたりしなかったり。
595デフォルトの名無しさん:2006/05/29(月) 23:48:24
>>590
ファイルに出力する場合などはチェックするべきではないかと。
#まぁ、業務でもなければ省略することもあるが。
596デフォルトの名無しさん:2006/05/30(火) 00:05:50
591: (続き) リテラルをプログラム中に書いてて、
第2は文字列を指してるんだがリテラルは書いてない。
これが、strstrがNULL戻すので困ってるんです。
Mysqlのテーブルに検索したい文字列を入れといて
つぎつぎに取得していって(その取得した文字列へのポインタが第2引数)、
つぎつぎに第1引数の文字列を strstrするというのが目的です。
char*じゃだめなんでしょうか?
プログラム中に
597デフォルトの名無しさん:2006/05/30(火) 00:07:32
”文字列リテラル”がないとだめなんでしょか?
そうなら const char*じゃなくて char*で よいような
strstrみたいな関数ありますか?
598デフォルトの名無しさん:2006/05/30(火) 00:07:42
>>596
日本語でおk
お前は自分の書いた文章を自分で読んでみろ
599デフォルトの名無しさん:2006/05/30(火) 00:09:47
はい。とりあえずねます。
600デフォルトの名無しさん:2006/05/30(火) 00:28:43
ソース書け。ソース。
601デフォルトの名無しさん:2006/05/30(火) 02:18:43
#define ORE TENSAI
602デフォルトの名無しさん:2006/05/30(火) 15:10:31
fgetc()等の返値はintになってますが、charで受け取っても問題ないのでしょうか?
603デフォルトの名無しさん:2006/05/30(火) 15:14:58 BE:23292443-#
使い方による。
604デフォルトの名無しさん:2006/05/30(火) 15:17:10
>>602
エラーが起きない(≒ファイル終端に達しない、入力を閉じられない)前提がない限りダメ。
605デフォルトの名無しさん:2006/05/30(火) 15:37:11
>>603-604
レスありがとうございます。それはcharの符号の有無が処理系定義だからでしょうか?

それと質問ばかりですが、全ビットが1のビット列を得るための
確実な方法はあるのでしょうか?
606デフォルトの名無しさん:2006/05/30(火) 15:38:33
>>605
~0
607デフォルトの名無しさん:2006/05/30(火) 15:43:12
>>605
文字 0xff を受け取ったとき、char に突っ込むと
EOF と区別が付かなくなる。
608デフォルトの名無しさん:2006/05/30(火) 15:50:44
>>606
やはりそれでよかったのですか。
符号の表現方法として、1の補数、2の補数、符号と絶対値の3通りがあるので
どれかで破綻がでるのではないかと思っていました。

>>607
なるほど・・・それではなるべくint等で受け取るようにしたいと思います。

わざわざ回答してくださってありがとうございました。
609デフォルトの名無しさん:2006/05/30(火) 23:31:35
自分のプログラムでオプションを取らせたいと思い
下の様にswitchのネストでオプションの処理をするのを考えてみたんですが
こういう場合に決まったやり方のような物はあるのでしょうか?

switch (argv[i][0])
{
case '-':
switch (argv[i][1])
{
case 'h':
略}
break;

default:
(オプションじゃ無いときの処理)
break;
}
610デフォルトの名無しさん:2006/05/30(火) 23:31:52
すみません質問なんですがlibtiffを使った画像のG3→G4への変換をC言語
で作成したいのですがコレでは無理ですかね・・?
無理やり繋ぎ合わせた感じなのですが・・詳しいかたよろしくお願いします
611デフォルトの名無しさん:2006/05/30(火) 23:43:59
標準C
612デフォルトの名無しさん:2006/05/30(火) 23:57:12
よく読んでいませんでした・・
すみません・・
613デフォルトの名無しさん:2006/05/31(水) 00:08:15
>>609
getoptのある処理系ならそれを使う。
無ければ…個人的にはswitchの中にswitchっていやだから、
-見つけたら-以降を解析する関数に飛ばすとか。
614デフォルトの名無しさん:2006/05/31(水) 00:12:13 BE:319507788-#
なんの工夫もなくif でやる。

if (strcmp(argv[i], "-h") == 0) {
...
}
else if (strcmp(argv[i], "-o") == 0) {
...
}
...
else {
..
}
615デフォルトの名無しさん:2006/05/31(水) 00:16:36
>>613
オプション専用の関数作るってことですか?
すっきり纏まりそうでいいですね。その方向でやってみたいと思います。

>>614
それだとオプション追加とかは楽なんですが、見た目が何となく嫌なので・・・
616デフォルトの名無しさん:2006/05/31(水) 01:40:49
#include <stdio.h>
char *p =
617デフォルトの名無しさん:2006/05/31(水) 01:41:46
#include <stdio.h>
char *p = "Hello, World\n";
main(){
char *pp;
pp = p;
while(*p!='\n') {
printf(*p);
p++;
}
}

ポインタを用いて「Hello, World」と印字したいのですが、上手くいきません・・・
どこをどう変えれば正しく動くようになるのでしょうか?
(while文をどうすればいいのかよく分かりません)
618617:2006/05/31(水) 01:50:29
すみません、事故解決しました
619デフォルトの名無しさん:2006/05/31(水) 01:54:10
>>617
printfの引数はポインタなんで、printfの使い方がおかしい、printf("%s\n", p);だろ
という話は置いといて…一文字ずつ出したいのかな。

char *pp;

pp = p;
while (*pp != '\0') { /* '\n'まででもいいけど */
printf("%c", *pp);
pp++;
}

酔っ払って眠いから間違ってたらゴメン。
620デフォルトの名無しさん:2006/05/31(水) 01:59:39
"ポインタを用いて「Hello, World」と印字したい"のなら
printf(p);
でイナフだ。
621617:2006/05/31(水) 02:03:25
>>619
どうもありがとうございます。
1文字ずつ印字するプログラムを考える必要があったのでとても助かりました。
622デフォルトの名無しさん:2006/05/31(水) 04:19:11
だれかこのプログラミングを教えてもらえますでしょうか?

x=x0 , x1 , x2 , ・・・ , x40 , x41
y=y0 , y1 , y2 , ・・・ , y40 , y41
近似式 y=ax^3+bx^2+cx+d
上の関数とデータで非線形最小自乗法を用いて近似した式を求めよ。

すみませんがよろしくお願いします。
623デフォルトの名無しさん:2006/05/31(水) 05:14:23 BE:95109577-#
教えて欲しいなら何がわからないのかくらい書け。
宿題丸投げならよそでやれ。
624デフォルトの名無しさん:2006/05/31(水) 06:44:44
>>622
何が分からないのかわからんのだが、
1/2 Σ[n=0->41] {Yn - (aXn^3 + bXn^2 + cXn + d)}^2を偏微分して正規方程式を作って(ここまでは手作業)
そこにデータをつっこんで行列の計算するだけじゃまいか?
625デフォルトの名無しさん:2006/05/31(水) 11:09:07
画面クリア行いながら,スペースキーの入力により一時停止,文字qの入力により終了するよう
図形を交互に表示するにはどのようなプログラムを組めばよいですか?
626デフォルトの名無しさん:2006/05/31(水) 11:11:40
なにを言ってるんだお前は
627デフォルトの名無しさん:2006/05/31(水) 11:12:41
>>625
「画面クリア」という動作は環境に依存した動作になるため標準的な方法は存在しない。
628デフォルトの名無しさん:2006/05/31(水) 11:22:01
>>625
rewind()でおk
629デフォルトの名無しさん:2006/05/31(水) 11:48:48
>>628
ハァ?

>>625
該当環境スレか環境依存OKスレか初心者スレにでもどうぞ。
630デフォルトの名無しさん:2006/05/31(水) 11:52:54
>>625
rewind(stdin)で100%おk
631デフォルトの名無しさん:2006/05/31(水) 11:55:00
rewind(stdout)で120%おk
632デフォルトの名無しさん:2006/05/31(水) 12:03:14
rewind(stderr)で200%おk
633デフォルトの名無しさん:2006/05/31(水) 12:09:34
>>625
FA>>631でトグロ300%
634デフォルトの名無しさん:2006/05/31(水) 12:59:27
何が面白いんだ
635デフォルトの名無しさん:2006/05/31(水) 13:09:41
そんなことも分からないのか
636デフォルトの名無しさん:2006/05/31(水) 13:14:15
何が面白いんだ
637デフォルトの名無しさん:2006/05/31(水) 13:20:38
よかろ〜もん
638デフォルトの名無しさん:2006/05/31(水) 13:36:50
このスレでネタは兎も角釣りはやめてくれ。
つーか、質問も理解しないで正しくもない知識を振り翳さないでくれ。
639デフォルトの名無しさん:2006/05/31(水) 17:56:57
皆さんが薦める
初心者でもプログラミングがよくわかる参考書あるいはサイトを
教えていただけないでしょうか?
ちなみに↓がうちの大学で使ってる資料です。
http://www.amazon.co.jp/exec/obidos/ASIN/4274064409/qid=1149065622/sr=1-14/ref=sr_1_2_14/250-5075856-7305831
正直めちゃくちゃ分かり難く教授以外、生徒皆認めてません。
640デフォルトの名無しさん:2006/05/31(水) 18:06:14
スレ違いですね・゚・(ノД`;)・゚・
移動します。
641デフォルトの名無しさん:2006/05/31(水) 19:43:33
どこでも変数宣言ってc99じゃできなかったっけ?
642デフォルトの名無しさん:2006/05/31(水) 20:25:02
>>641
C99以前はできない。C99はできる。
643デフォルトの名無しさん:2006/06/01(木) 15:08:28
ちょっと教えてください

ADDRESS 00 01 02 03 04 05 06
00000000 40 00 40 00 07 00 00

上のはヘキサエディタで開いた一部なんですけど
0x04-0x05にある07 00 を 整数として変数に格納するのに

//fopen(rbモード) fcloseは省略
int buf;

fpos_t fpos = 4;
fsetpos(fp, &fpos);

fread(&buf, 2, 1, fp);
printf("変数buf -> %d", buf);

としてもbufに10進数で7と入らずprintf文でなにやら分からない数字が出るんですが
間違っているところを教えてもらえないでしょうか
644デフォルトの名無しさん:2006/06/01(木) 15:14:01
>>643
そういう数値で位置指定をしたいならfseekの方がよい。
また、お前のところのintは2バイトか?最近は4バイトであることの方が多いぞ。
645デフォルトの名無しさん:2006/06/01(木) 15:15:22
あと、エンディアンも関係ないか?
646デフォルトの名無しさん:2006/06/01(木) 15:20:00
インテル形式でsizeof int = 4なら
buf = 0;
fread(&buf, 2, 1, fp);
とすれば良いはず(初期化しとかないと下位2byteにゴミが残る)
647デフォルトの名無しさん:2006/06/01(木) 15:28:52
>>644,645,646
レスどもです

説明不足で申し訳ないです.ファイルの中身が
07 00 BE CC C0 CC C5 DB 36
といった感じで
後続文字byte数 文字列
みたいな形式になってるのでsizeof(int)で4byte1ブロックだと07 00 BE CCがbufに入ってしまいえらいことになるのです OTZ

もちろんsizeof(int)は4でした.
リトルエンディアンでfreadはたしか大丈夫だったと思います

そして.buf = 0;で初期化すると正しく7と表示されました.
ありがとうございます!

あとスレ違いになるかもしれないんですけどそのゴミとはなんでつくんでしょう?
648デフォルトの名無しさん:2006/06/01(木) 15:48:25 BE:69876094-#
初期化してないから。
649デフォルトの名無しさん:2006/06/01(木) 16:03:02
>>643
1バイトづつ読めばいいのに。

buf = getc(fp) & 0xff;
buf <<= 8;
buf |= getc(fp) & 0xff;
650デフォルトの名無しさん:2006/06/01(木) 16:33:06
>>647
fread 前に初期化していないと:
   ┏━┯━┯━┯━┓
buf ┃ワケの解らない値.┃
   ┗━━━━━━━┛

fread 後の状態:
   ┏━┯━┯━┯━┓
buf ┃07│00│ない値.┃
   ┗━┷━┷━━━┛
   <------>
 ここしか書き換えられない
651デフォルトの名無しさん:2006/06/01(木) 16:38:51
charに入れた文字を1ビット毎に切り出したいのですが
ビットフィールドを下位ビットから設定していく方法は無いのでしょうか?
652デフォルトの名無しさん:2006/06/01(木) 16:55:18
>>651
& すればいいじゃないか。
653デフォルトの名無しさん:2006/06/01(木) 17:42:24
>>650
なるほど
箱を用意しても掃除してからじゃないとだめということですか〜
AAまで作って説明してくれてありがとうございます
654デフォルトの名無しさん:2006/06/01(木) 17:48:48
>>651
環境依存。
655デフォルトの名無しさん:2006/06/01(木) 17:58:04
>>652
&でもいいのですが、もうちょっと楽に取り出せないかと思って・・・

>>654
やっぱりそうですか。わざわざありがとうございます
656デフォルトの名無しさん:2006/06/01(木) 18:03:26
>>655
マクロか関数を作れば簡単だぞ。
657デフォルトの名無しさん:2006/06/01(木) 18:33:59
>>655
& 使えよ。

#define bit(x,y) ((x) & (1 << (y)))
658デフォルトの名無しさん:2006/06/01(木) 18:43:00
>>657
#define BIT_TEST(x, y) (((x) >> (y)) & 1)
の方が 0 or 1 になって良さげ。
659デフォルトの名無しさん:2006/06/06(火) 00:32:49
唐age
660デフォルトの名無しさん:2006/06/06(火) 00:51:01
あるアドレスの中身をバイナリで見たいのですがどうすればいいですか?
661デフォルトの名無しさん:2006/06/06(火) 01:04:17
「バイナリで見る」を具体的に定義してください
662デフォルトの名無しさん:2006/06/06(火) 01:09:51
>>660
MMOのツールか何かかい?
663デフォルトの名無しさん:2006/06/06(火) 01:11:33
>661

float a = 2.5

と、されているときのメモリの中でこの値がどのように表現されているかが見たいんです。



664デフォルトの名無しさん:2006/06/06(火) 01:15:27 BE:40761173-#
union {float a; unsigned short b;} fs;
fs.a=2.5;printf("%X",fs.b);
665デフォルトの名無しさん:2006/06/06(火) 02:55:14
浮動小数の形式がIEEE754であることは
intが32bitであることより
nullポインタの全bitが0であることより
期待しても良いのではないかと思う。

もちろん、標準Cで規定されているわけではないが。
666デフォルトの名無しさん:2006/06/06(火) 03:40:27
>>665
どれも期待したところで保証がないことに変わりは無い
667デフォルトの名無しさん:2006/06/06(火) 04:20:42
>>664
何故short?

>>663
float a = 2.5;
unsigned char * p = (unsigned char *) & a;
for (int ic = 0; ic < sizeof(a); ++ic) printf("%02x ", p[ic]);
668ビル・ジョブス:2006/06/06(火) 15:30:38
エンディアンは?
669デフォルトの名無しさん:2006/06/06(火) 15:36:49
インディアン
670デフォルトの名無しさん:2006/06/06(火) 16:15:41
嘘つかない
671デフォルトの名無しさん:2006/06/06(火) 17:28:27
今日は死ぬにはいい日だ
672デフォルトの名無しさん:2006/06/06(火) 17:32:36
今日自殺するので休みます。


・・・あ、板まちがえた?
673デフォルトの名無しさん:2006/06/06(火) 18:11:29 BE:93168386-#
>>672
マ板へ。
【鬱病】 壊れたプログラマー 4人目 【爆発】
http://pc8.2ch.net/test/read.cgi/prog/1148314547/
674デフォルトの名無しさん:2006/06/06(火) 19:43:34
>>668
この場合エンディアンがどうなっていようともとにかくメモリ上にどう
入っているのかをそのまま見たいということではないのか?

まあどうでもいいか。
675デフォルトの名無しさん:2006/06/06(火) 20:52:40
> メモリ上にどう入っているのかをそのまま

でも結局、複数 bytes のデータを見るときはエンディアンを考慮しなきゃ
いけないんじゃないか?
676デフォルトの名無しさん:2006/06/06(火) 21:11:26
floatにエンディアンも糞もねーよ糞
677デフォルトの名無しさん:2006/06/06(火) 21:14:16
そうだよ!floatは1byteに決まってんだろーが!
678デフォルトの名無しさん:2006/06/06(火) 21:29:00
char *p = "hoge";
のとき、
p++; p++; p++; と p += 3; は同じ意味?
679デフォルトの名無しさん:2006/06/06(火) 21:31:26
もちろんオナニー
680デフォルトの名無しさん:2006/06/06(火) 21:32:11
*(p+3)とオナニー
681デフォルトの名無しさん:2006/06/06(火) 21:39:05
>>680
ちょwwwwwおまwwwwwwwwwwww
682デフォルトの名無しさん:2006/06/06(火) 21:42:21
        目
        ↓
尻の穴→ *(p+3)
       ↑↑
 口(よだれ) 耳
683デフォルトの名無しさん:2006/06/06(火) 21:53:20
>>677
sizeof(float) == 1 ?

そういうシステムがあると聞いたことはあるが。
684デフォルトの名無しさん:2006/06/08(木) 02:35:26
じゃ、保守と。
685デフォルトの名無しさん:2006/06/08(木) 14:09:35
テキストファイルの中に特定の文字列が存在するかどうか
検索したいのですが、fopenで検索対象ファイルを開いて、
配列に文字列を読み込んで、strstrで検索するのがよいでしょうか。
それとももっとよい方法があるでしょうか。
686デフォルトの名無しさん:2006/06/08(木) 14:20:18
>>685
Unix系環境ならsystem("grep keyWord file")の戻り値で判断。
検索することに意義があるのでなければ、テストすべきロジックが増えるよりもよい。
687デフォルトの名無しさん:2006/06/08(木) 14:20:58
Cを使わずにgrepでも使え
688デフォルトの名無しさん:2006/06/08(木) 14:31:19
>>686-687
なるほど。systemでgrep呼び出して使う手がありましたね。
それを試してみます。
689デフォルトの名無しさん:2006/06/08(木) 15:34:59
CGIプログラムで system() 使う場合は要注意。
690デフォルトの名無しさん:2006/06/08(木) 19:35:56
質問です。
問題文:
ttp://pc8.2ch.net/test/read.cgi/tech/1147908265/152
の貯金プログラムを拡張して、額の表示の際に3桁ごとにコンマを入れる形式をとるようにせよ.下記例のようにどのような桁数でも桁数に応じてきちんと表示できるようにすること.
12円⇒12円
789012円⇒789,012円
1000001円⇒1,000,001円
1234567890円⇒1,234,567,890円

環境
 OS: (Windows
  コンパイラ名とバージョン: Visual Studio.NET2003
  言語: C

その他の制限: まだ初期で、if,for,whileまで習いました。
どうか、よろしくお願いします。
691デフォルトの名無しさん:2006/06/08(木) 19:41:10
文字列操作がまだだったらまだ早い気がする
せめて柴田本を後ろまで読んだほうがいい
692デフォルトの名無しさん:2006/06/08(木) 19:59:49
>>690
激しくスレ違い
693デフォルトの名無しさん:2006/06/08(木) 20:14:11
>>689
grepでも?
694デフォルトの名無しさん:2006/06/08(木) 20:22:50
うむ
695デフォルトの名無しさん:2006/06/08(木) 23:29:33
>>693
cgiの場合、そもそも/bin/shを開放していないかもしれないという点でsystem()が使えないかもしれない。
しかし、その辺りはWebProg板の領分になりそうなので詳細は割愛。
696デフォルトの名無しさん:2006/06/08(木) 23:57:06
C言語って余計な括弧つけると、実行が遅くなったりする?
例えば
i = a*b +1;

i = (a*b) + 1;
で実行速度違ったりする?
697デフォルトの名無しさん:2006/06/09(金) 00:06:01
そんなこと言ったらコンパイラによって(ry
698デフォルトの名無しさん:2006/06/09(金) 00:06:09
>>696
できたプログラムの実行速度に変わりは生じないだろう。
コンパイル速度の変化は全く無いわけではないが、完全に無視できる。
気にせずに括弧をつけたければつけなさい。
699デフォルトの名無しさん:2006/06/09(金) 00:11:38
>>696
それで実行速度が変わるようなコンパイラがあったらお目に掛かりたいよ。
700デフォルトの名無しさん:2006/06/09(金) 00:38:59
コンパイル時間はかわるかもしれんな
701デフォルトの名無しさん:2006/06/09(金) 00:56:43
int a[1][1][1][1][1][1];
a[0][0][0][0][0][0] = 1;
702デフォルトの名無しさん:2006/06/09(金) 00:59:30
(*****puts)("hello");
703デフォルトの名無しさん:2006/06/09(金) 02:13:22
質問です。
C言語ですが、forkしたあとwaitで待つプログラムをよく作ります。
これはビジーウエイトなのでしょうか??
704デフォルトの名無しさん:2006/06/09(金) 02:15:23
fork シグナル でググると幸せに
705デフォルトの名無しさん:2006/06/09(金) 06:49:44
そのどちらもスレ違い。
706デフォルトの名無しさん:2006/06/09(金) 14:12:27
餅つけ
707デフォルトの名無しさん:2006/06/09(金) 14:15:24
ポインタを理解するには…どうしたらいいでしょう?
708デフォルトの名無しさん:2006/06/09(金) 14:21:56
理解しようとするな。
ただ感じるままに書くべし、読むべし、調べるべし
709デフォルトの名無しさん:2006/06/09(金) 14:55:07
a = b == c

これはどのような意味になるのでしょうか?
710デフォルトの名無しさん:2006/06/09(金) 15:00:58
>>709
bとcが等しければ1が、bとcが等しくなければ0がaに代入される。
711デフォルトの名無しさん:2006/06/09(金) 15:03:43
なるほど〜! どうもありがとうございます。
712デフォルトの名無しさん:2006/06/09(金) 15:46:01
>>707
ポインタ(というかアドレス)でしかメモリや分岐先を指定できない言語を使ってみれば嫌でも覚える。
つまりはマクロなしアセンブラ、機械語。
713デフォルトの名無しさん:2006/06/09(金) 21:04:17
C言語には、10進・16進・8進数表記がありますが、なぜ2進数表記が無いのでしょうか。
ずっと気になって仕方がありません。
714デフォルトの名無しさん:2006/06/09(金) 21:06:05
仕様です
715デフォルトの名無しさん:2006/06/09(金) 21:09:22
じゃあ しようがない
716デフォルトの名無しさん:2006/06/09(金) 21:55:50
char *a;
a = (char*)malloc(sizeof(char));

malloc関数を使うとaには桁数の多いアドレスが入るんですが、
malloc関数を使わなくてもaには1というアドレスが入ってますよね?
どういう利点があるのでしょうか?・・・
717デフォルトの名無しさん:2006/06/09(金) 22:08:56
bやcには何が入っていた?
718デフォルトの名無しさん:2006/06/09(金) 22:17:14
文字列が入ってる感じですかね?・・・
719デフォルトの名無しさん:2006/06/09(金) 22:25:42
>malloc関数を使わなくてもaには1というアドレスが入ってますよね?
???
720デフォルトの名無しさん:2006/06/09(金) 22:26:13
>>707
経験かな
データ構造あたりを勉強するといいかも
お勧めとかないけどamazonあたりで”データ構造とアルゴリズム”か”アルゴリズムとデータ構造”で
721デフォルトの名無しさん:2006/06/09(金) 22:26:27
>>716
そんな初期化はANSIで定義されてないと思うよ。
722 ◆GREAT3AJss :2006/06/09(金) 22:29:24
OS:WindowsXP
VC++7.1

foo.txt  テキストファイル
foo2.exe 標準入力を受け取るプログラム

で以下のようにsystem()関数をコールしましたが、

system("type foo.txt | foo2.exe");

foo2.exeが戻り値で0以外の値を返しているのにsystem()関数が0を返します。
パイプでコールした場合はどうやって戻り値を取ればいいのでしょうか?
723デフォルトの名無しさん:2006/06/09(金) 22:31:20
mallocしない場合には、aは初期化されてないから、わけのわからない値が
入ってることはある。
mallocせずに、*a にアクセスしようとすると、エラーになる。だって確保されてないんだし。

文字列とかあらかじめどれくらいメモリ確保すればいいかわからん場合は
ポインタ型で定義して、mallocして、プログラム内のどこかで必ずfreeする。
これ、基本。
724デフォルトの名無しさん:2006/06/09(金) 23:13:13
>>722
system()関数の中の仕様についてはスレ違い。
OS依存のプログラムを書いているのなら、OS依存の方法で取得するのが無難じゃない?
725デフォルトの名無しさん:2006/06/09(金) 23:25:24
GUIってCで扱えないの?
C++でGUIって扱える?
726デフォルトの名無しさん:2006/06/09(金) 23:27:31
もともとGUIの無い環境では、GUIは扱えない。環境依存。
Windows環境なら、GUIプログラムは作れる。
727デフォルトの名無しさん:2006/06/09(金) 23:32:25
>>725
扱えるも扱えないも、C・C++は言語自体の仕様として入出力を規定して無いだろ。
環境によってはライブラリが提供されてるかも、ってだけ。
728デフォルトの名無しさん:2006/06/09(金) 23:43:36
>>725
お前がゼロからライブラリを書けばお前の好きなように出来る
729722 ◆GREAT3AJss :2006/06/10(土) 00:05:13
>>724
すみません。

system("foo2.exe < foo.txt")

でやりたいことは解決しました。
お騒がせしました。
730デフォルトの名無しさん:2006/06/10(土) 00:45:45
突っ込みいれようとしたけど気づいてくれたか・・・
731デフォルトの名無しさん:2006/06/12(月) 10:38:08
C FAQで見つけた可変個の引数の関数を参考にして使っています。
参考というよりは、そのまま使っています。
VC++.net
gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)
では問題なくコンパイル&実行できたのですが、
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-53)
では、コンパイルできましたが、以下のように呼び出すとSegmentation faultします。
error("%s\n", "エラーしました");
でも、以下のようにすると正常動作しました。
error("エラーしました\n");
いろいと試した結果、% があるとSegmentation faultするようです。
何か対策方法をご存知の方おられましたら、アドバイスよろしく御願いします。

#include <stdio.h>
#include <stdarg.h>

void error(char *fmt, ...)
{
 va_list argp;
 fprintf(stderr, "error: ");
 va_start(argp, fmt);
 vfprintf(stderr, fmt, argp);
 va_end(argp);
 fprintf(stderr, "\n");
}
732デフォルトの名無しさん:2006/06/12(月) 11:03:20
>>731
直接stderrに書き込まずに、vsprintfで一端バッファに書き込んでから
それをまとめてvfprintfで書き込んでみては如何でしょう
733デフォルトの名無しさん:2006/06/12(月) 11:11:12
3.4.4だと問題ないな。3.2は無いから試せない。
734デフォルトの名無しさん:2006/06/12(月) 12:49:23
int main (void);
int main (int argc);
int main (int argc, char **argv);
int main (int argc, char **argv, char **envp);
735デフォルトの名無しさん:2006/06/12(月) 13:55:19
>>734
最後はANSI Cで受け付けねばならないと明示されている形式ではないな。
736デフォルトの名無しさん:2006/06/12(月) 15:04:56
>>735
どれも受け付けねばならないとは書いてないが...
各処理系がどのように定義するべきかとして以下が規定されてるだけ.

freestanding 環境の場合:
処理系定義

host 環境の場合:
int main(void)
または
int main(int argc, char *argv[])
または
int main(int argc, char *argv[]) と等価な物
または
処理系定義の物

int main(int argc) や int main (int argc, char **argv, char **envp)
は処理系定義の物として無問題.
つか, 処理系定義であればなんでもありあり.
737デフォルトの名無しさん:2006/06/12(月) 15:06:38
でもまぁ、でふぁくとすたんだ〜ど、ってのもありますがな。
738デフォルトの名無しさん:2006/06/12(月) 15:11:58
>>737
それをゆうだったら
int main (int argc, char **argv, char **envp)
は, Unix 互換環境ではある意味, でふぁくとすたんだ〜ど.
739デフォルトの名無しさん:2006/06/12(月) 18:06:48
階乗(Factorial)計算を行うプログラムを作成する。一つの入力値に対して階乗計算を行い、結果を出力するプログラムを作成せよ。
ただし、次の仕様に基づいた関数を作成するものとし、main関数とfct関数は一つのファイル上に作成するものとする。

  階乗とは?: 1からnまでの連続する自然数の積。n!で表される。(0の階乗は1)
  計算式  : n! = n*(n-1)* ... *2*1
         例)5! = 5*4*3*2*1
  プロトタイプ宣言: int fct(int n);

すまん、わけわからん
誰かお助け…
740デフォルトの名無しさん:2006/06/12(月) 18:07:54
>>739
激しくスレ違い
741デフォルトの名無しさん:2006/06/13(火) 01:50:27
int fct(int n){ printf("%d!\n",n); return 0; }
742デフォルトの名無しさん:2006/06/13(火) 02:02:11
int fct(int n) { return (n == 1)? 1 : n * fct(n-1); }

とスタックの無駄遣いをしてみる。
743デフォルトの名無しさん:2006/06/13(火) 02:16:43
int fct(int n) {
int tmp=1;
while(n != 0)
{
  tmp*=n;
n--;
}
744デフォルトの名無しさん:2006/06/13(火) 07:46:31
#include<math.h>
int fact(int n){
    return tgamma(n+1);
}
745デフォルトの名無しさん:2006/06/13(火) 08:55:41
>>744
「宿題」としての点数は低いね(w
746デフォルトの名無しさん:2006/06/13(火) 19:06:29
main関数で、char型を宣言し、自作関数に渡して文字列を入力してもらい、
それをmain関数に返すにはどのように書けばいいのでしょうか?
747デフォルトの名無しさん:2006/06/13(火) 19:43:26
>>746
「char」型に「文字列」は入りません。
# って言うか、マルナゲ反対!
748デフォルトの名無しさん:2006/06/13(火) 19:54:30
すいません。char型の配列です。
749デフォルトの名無しさん:2006/06/13(火) 20:32:43
>>746
まず自分の考えたとおりにやってみろ。
うまくいってもうまくいかなくても、とにかくやってみてからここへ来い。
750デフォルトの名無しさん:2006/06/13(火) 20:34:39
何度もやってます。現在進行形で・・・
ポインタの配列を理解してないみたいだ・・・
751デフォルトの名無しさん:2006/06/13(火) 20:47:01
>>750
 「ポインタの配列」と言うと別なものになっちゃうよ。

 配列をmain関数で用意し、その配列のポインタ(先頭アドレス)
を自作関数に渡す。自作関数で、そのポインタにscanf等で入力すれば、
mainで用意した配列に文字列が入力されたような感じになる。
void input(char *);
main(){

char str[256];
input(str);/* この関数内で入力する */

/*以下略*/
return 0;
}
input関数の中身を自分で書けるかどうか検討してみて。
752デフォルトの名無しさん:2006/06/13(火) 21:19:16
>>751さんありがとうございます。
結果から言いますと、配列の[]内の数字が小さくて、それでエラーが出てたんですが、
文法の方が悪いとばかり思ってエラーメッセージを読んでなくて行き詰まってました・・・
ホント、馬鹿ですよね・・・俺の3時間が・・・でも、もう二度とこんなヘマはしないと思います。

それとこのエラー、VS.NET2005ではプログラム動かした時に、エラーが出ましたが、
コマンドラインで動かした時はエラーは出ませんでした・・・
これで、気づいたんですけど・・・
753デフォルトの名無しさん:2006/06/13(火) 22:07:45
すいません。ポインタについて質問なのですが、下記のような関数があるんですが
Swap関数で数値が入れ替わるのはポインタでiDat1とiDat2のアドレスが引数で指し示されているから
戻り値(代入?)みたいになってiDat1・2に入れ替えられたものが代入されて5と8が入れ替わると言う風に理解しました。
それでわからないのがSwap2関数ですが、これはiDat1とiDat2が引数に入れられても
Swap2に代入しただけでポインタで指し示されていないからSwap2関数の中で数字の入れ替えをしても、
iDat1、iDat2へ反映されておらず数字の入れ替えは起こらないと
理解すればいいのでしょうか。自分は戻り値という表現は正しくないと思います。
Swap1とSwap2の関数の違いが先生に聞いてもよくわからないんで
どなたか、この二つの関数で何が起こっているのか、わかりやすいアドバイスお願いします。

int iDat1=5,iDat2=8;

void Swap(int *p1,int *p2)
{
int iTemp;

iTemp=*p1;
*p1=*p2;
*p2=iTemp;
}

void Swap2(int a,int b)
{
int iTemp;

iTemp=a;
a=b;
b=iTemp;
}
754デフォルトの名無しさん:2006/06/13(火) 22:15:29
>>753
前者は「ポインタを渡すから、ポイント先のオブジェクトを入れ替えてね」とお願いしている。
後者は「値だけ渡すから、中で色々計算してね」とお願いしている。


つまり、後者の方は関数内のローカルな変数の値しかいじれない。
前者は、ポインタを元に、関数外部のオブジェクトにアクセス出来る。
755デフォルトの名無しさん:2006/06/13(火) 22:28:38
Swap(int *p1,int *p2) では、int型の変数がメモリ上でどこに格納されているか
っていう情報を引数に与えているので、そこのメモリを直接いじれるんだけど、
Swap2(int a,int b) では、a = xx; b = xx っていう風に値をコピーしてから
a, b を弄っていることになるので、Swap2の呼び出し元では値の変更が得られないわけだ。
756デフォルトの名無しさん:2006/06/13(火) 22:34:14
つーか、お前等初心者は初心者スレに誘導しろよ。
757デフォルトの名無しさん:2006/06/13(火) 22:35:43
char *a;    /* ポインタ */
char a[10];  /* 配列 */
char *a[10]; /* ポインタの配列 */
char (*a)[10]; /* 配列へのポインタ */
758デフォルトの名無しさん:2006/06/13(火) 22:39:51
>>753
肝心のところが抜けてる。
int main(void)
{
int iDat1=5,iDat2=8;
Swap(&iDat1, &iDat2);
Swap2(iDat1, iDat2);
}
これが無いと、答える側が困る。

&iDat1はiDat1が格納されているアドレス。
iDatはiDat1の値そのもの。

んで、これを踏まえた上で、関数を見てみよう。

void Swap(int *p1,int *p2)
この関数では、*p1がiDat1のエイリアスになる。

なんか、飽きたので、途中だが終了。
759デフォルトの名無しさん:2006/06/13(火) 23:59:51
早い回答ありがとうございます。753です。
>>754
>>755
>>758
前者のSwap1の*p1などがショートカットの役割をしてメモリにアクセスして、
後者はSwap2内だけでしか処理できないということですか。
>>756
えと、すいません。今度は初心者スレで聞いてみたいと思います。
>>757
ポインタと配列の関係は自分は習っていないようです。
(学校休んでいたのでやってないだけかもしれませんが。。。)
おいおい勉強していこうと思います。

沢山のアドバイスありがとうございました。
760754:2006/06/14(水) 00:19:53
>>759
> ショートカットの役割をして


…ショートカット……………

だいぶ、初心者向けに書いたつもりだったんだけどなぁ…orz
761デフォルトの名無しさん:2006/06/14(水) 08:44:07
iDat1=5, iDat2=8
a=5, b=8 (Swap1 が呼び出された)

iDat1=5, iDat2=8
a=8, b=5 (a と b の値が交換された)

iDat1=5, iDat2=8 (main に戻った、iDat1, iDat2 の値は変わっていない)


iDat1=5, iDat2=8
p1=↑  p2=↑ (Swap2 が呼び出された)

iDat1=8, iDat2=5
p1=↑  p2=↑ (*p1 と *p2 の値が交換された)

iDat1=8, iDat2=5 (main に戻った、iDat1, iDat2 の値が変わっている)


762デフォルトの名無しさん:2006/06/14(水) 09:17:36
>>761
Swap1 と Swap2 が逆じゃね?
763デフォルトの名無しさん:2006/06/14(水) 09:47:42
ショートカットの説明になっていない
764デフォルトの名無しさん:2006/06/14(水) 10:04:31
だから初心者スレに任せろって。
ここの連中は融通利かないんだからw
765デフォルトの名無しさん:2006/06/14(水) 21:13:10
753です。
>>760
えーと、少々混乱を招きました。なぜショートカットって言葉を使ったかと言いますと
>>758のエイリアスと言う用語がわからなかったので検索したところショートカットと言う解説が用語集にありました。
たしかにアドレスを通してiDatが書き換えられているので
ショートカットは正しくないかも・・・
>>761
>>762
>>763
なんというか、矢印で変数が示されているのでこの説明もわかりやすいと思います。
>>764
検索したら
http://pc8.2ch.net/test/read.cgi/tech/1149815331/l50
というスレを見つけました。ご迷惑かけます。

皆さんのおかげでポインタの特性が結構理解できたっぽいです。
766デフォルトの名無しさん:2006/06/14(水) 22:55:42
構造体を2次元って宣言できますか?
typedef struct st{
    int num
}


ST a[3][3]

みたいな感じで
767デフォルトの名無しさん:2006/06/14(水) 22:59:18
>>766
できないわけがない。
768デフォルトの名無しさん:2006/06/14(水) 23:00:11
むしろなぜ出来ないかもしれないと思ったのか
769デフォルトの名無しさん:2006/06/14(水) 23:05:55
typedef が閉じられてない気がする。
770デフォルトの名無しさん:2006/06/14(水) 23:10:04
2次元にした時の初期化の仕方が分からないんですが・・・
771デフォルトの名無しさん:2006/06/14(水) 23:12:43
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
772デフォルトの名無しさん:2006/06/14(水) 23:16:57
説明不足でした

typedef struct a{
  int b;
  char c;
}A;
773デフォルトの名無しさん:2006/06/14(水) 23:17:34
途中で書き込んでしまった・・・

それで
宣言時にchar型とint型を2次元で初期化したいんですが・・・
774デフォルトの名無しさん:2006/06/14(水) 23:20:38
一次元でどう初期化したのか見てみたいぞ
775デフォルトの名無しさん:2006/06/14(水) 23:22:43
A[3]={
  {数字,"字"},{数字,"字"},{数字,"字"},
 }
776デフォルトの名無しさん:2006/06/14(水) 23:23:37
って感じでやってます
これなら上手くいくんですけど・・・
777デフォルトの名無しさん:2006/06/14(水) 23:24:13
>>776
そのまま二次元に拡張すりゃいいだろ
A[3][3]={
  {数字,"字"},{数字,"字"},{数字,"字"},
  {数字,"字"},{数字,"字"},{数字,"字"},
  {数字,"字"},{数字,"字"},{数字,"字"}
 }
778デフォルトの名無しさん:2006/06/14(水) 23:24:39
 memsetを使って0で初期化してみるとか。

 ところでアラインメントに気をつけて、パディングを入れましょう。
sizeof(struct a)の結果は5になったり8になったりするから。
(まあ普通は8でしょうが)
779デフォルトの名無しさん:2006/06/14(水) 23:24:55
バカばっかりだな
780デフォルトの名無しさん:2006/06/14(水) 23:25:22
const int fun(){
 return 1;
}

のconstってどういう効果があるの?
781デフォルトの名無しさん:2006/06/14(水) 23:26:45
>>777
それでやると
初期化子が多すぎる
ってエラーが出るんですよ・・・

もうちょっと見直してみます
782デフォルトの名無しさん:2006/06/14(水) 23:28:18
>>781
ごめんコピペミスった

A[3][3]={
  { {数字,"字"},{数字,"字"},{数字,"字"} },
  { {数字,"字"},{数字,"字"},{数字,"字"} },
  { {数字,"字"},{数字,"字"},{数字,"字"} }
 }

783デフォルトの名無しさん:2006/06/14(水) 23:29:37
>>772
a A[2][3]={{{'A',1},{'B',2},{'C',3}},{{'X',4},{'Y',5},{'Z',6}}};
784783:2006/06/14(水) 23:30:50
おっと、intじゃなくてcharが先か。
しかも783だとコンパイル通っちゃうからタチが悪いw
785デフォルトの名無しさん:2006/06/14(水) 23:31:12
>>782-783
わざとやってんのか?ってくらい無能だなお前ら
786デフォルトの名無しさん:2006/06/14(水) 23:32:01
>>782
できました!
さっきやったと思ってたけど多分打ち間違えてたんですね・・・


ありがとうございます
787デフォルトの名無しさん:2006/06/14(水) 23:36:52
>>782
""で字を囲むと文字じゃなくてポインタが渡されちゃうと思うんだけど…
788780:2006/06/14(水) 23:38:07
すまないがだれか教えてくれまいか?
789デフォルトの名無しさん:2006/06/14(水) 23:43:29
左辺値にしたくないとか
790デフォルトの名無しさん:2006/06/14(水) 23:46:12
もともと左辺値にならない罠
791デフォルトの名無しさん:2006/06/14(水) 23:48:37
>>780
書いたヤシに聞けば?
792デフォルトの名無しさん:2006/06/14(水) 23:52:34
書いたのはもう卒業した先輩だから無理なんだ(´・ω・`)
793780:2006/06/14(水) 23:58:56
ちょっと確かめてみた。
int a=10;
const int* fun(){
return &a;
}

int main(){
*(fun())=11;
cout<<a<<endl;
}
だとコンパイルできなくて、
int a=10;
int* fun(){
return &a;
}

int main(){
*(fun())=11;
cout<<a<<endl;
}
だとコンパイルできたから、左辺値にならないであってるような気がする。
で、>>780の場合はもともと返す値が左辺値にはなり得ないから意味のないconst。
ということで合ってるかな?
794デフォルトの名無しさん:2006/06/15(木) 00:08:29
組み込み型の引数・返値にconstを書いても、
書かないのと同じように扱われる。
つまり書く意味がない。
795デフォルトの名無しさん:2006/06/15(木) 00:48:23
日ごろから組み込み型でない戻り値を多用していて、
整合性を取るために、左辺値になって欲しくない戻り値は全てconst指定にしてるのかもしれない。
796デフォルトの名無しさん:2006/06/15(木) 06:00:33
処で亀レスだが一応指摘しておく。
>>778
その例でsizeof(struct a)が5や8かどうかは環境依存。
もしかしたら3かも4かもしれない。
で、何のためにアライメントに気をつけるのかの説明がないが、判っているのかな?
普通は、意識する必要がないわけだが。
797デフォルトの名無しさん:2006/06/15(木) 08:24:45
>>796
 ああ、そういえばintが2バイトのケースもあるわな。失念していた。
ただsizeof(struct a)が5や8になる、というのは例示にすぎないから、
別に必ずそうなるとか言いたかったわけじゃないよ。

>何のためにアライメントに気をつけるのか
 アラインメントの設定が違う環境にも対応できるように、だな。
確かに、環境に変化無ければ、
>普通は、意識する必要がないわけだが
という指摘は正しいな。
798デフォルトの名無しさん:2006/06/15(木) 08:46:03
>>797
つーか、どの環境だろうと、sizeof(struct a)に依存したコードを書かなきゃ大丈夫だろ。
バイナリイメージのままファイルに書くとか通信するとかは論外だけど。
799デフォルトの名無しさん:2006/06/15(木) 08:46:24
>>797
いいから初心者スレへ逝け。

>アラインメントの設定が違う環境にも対応できるように、だな。
ワード境界にオブジェクトを配置できない or 効率が落ちる
システムの為だ。だいいち、エンディアンや内部表現が
違うシステム間でどう対応しようってんだ。

>確かに、環境に変化無ければ
普通は処理系が面倒を見るからだ。
そうしない処理系があるというなら例示してくれ。
800デフォルトの名無しさん:2006/06/15(木) 16:52:15
ちと質問させて下さい。

void test(int *);
int main(void)
{
int a[3][3];
test(a);
}
void test(int *x)
{
int i;
for (i = 0; i<9; i++)
*(x+i) = 1;
}

上のコードはmainで宣言した2次元配列を他関数にアドレスを送って代入(?)していますが、
test関数で、
for(i =0;i<3;i++) {
for(j=0;j<3;j++) {
x[i][j]=1;
}
}
のように、ポインタを使わずに2次元配列に代入するにはどのようにすればいいのでしょうか?
801デフォルトの名無しさん:2006/06/15(木) 17:07:46
こういうので良いのか?

void test(int (x)[3][3]) { int i, j; (略) x[i][j] = 1; }
int main(void)
{
 int a[3][3];
 test(a);
}

# 間違いしたくないから struct のメンバに配列置いて、struct の ptr 渡ししちゃうけど…
802800:2006/06/15(木) 17:20:03
>>801
なるほど、test関数の引数も配列にすれば良かったんですか〜
知りませんでした・・・・ありがとうございますm(_ _)m

自分も扱う変数が多い時は良くサブルーチンへはstructでまとめてアドレスを送ってしまっているのですが、
こういうのって別に問題はないんですか?
あまりやらない方が良いとか、処理が遅くなるとか、メモリ余計に使うとか・・・
803デフォルトの名無しさん:2006/06/15(木) 17:22:59
>>800-801
例の規則によって、仮引数ではint x[3][3]とint x[][3]と同じ。
int x[][3]はint (*x)[3]と同じ。

typedefを使うとこうなる。
typedef int int_array3[3];

void test(int_array3 *x); /* 或いはvoid test(int_array3 x[]); */

int main(void)
{
  int_array3 a[3];
  test(a);
}
804800:2006/06/15(木) 17:27:40
>>803
例の規則分をぶっとばしてた orz

>>802
struct 自体に意味を持たせたい場合なら、2次元配列1つであっても
あえて struct 化することはあるね。

3x3 マトリックス (データ的には [3][3]配列) と その操作関数群 とかさ。
805800:2006/06/15(木) 19:06:10
>>803-804
なんとなく分かりました。
いろいろ試してみようと思います。
ありがとうございましたm(_ _)m
806デフォルトの名無しさん:2006/06/16(金) 09:20:54
質問です
for (ic = 0; ic < 100; ic++)
if (ic == b) break;
a = ic + 1;

これを実行すると、forループがa = ic + 1まで含まれてしまいます。
for文は次の1文しか実行しないと習ったのですが、
if文があるので、a = ic + 1;までが1文として扱われるという解釈でよろしいでしょうか?


for (ic = 0; ic < 100; ic++){
if (ic == b) break;
}
a = ic + 1;


こういう動きを期待してたのですが・・・
807デフォルトの名無しさん:2006/06/16(金) 09:28:38
>>806
> これを実行すると、forループがa = ic + 1まで含まれてしまいます。
この結論に至った経緯は?

※ b = 100 のとき a が 101 になるから… とか言うなよ?
808デフォルトの名無しさん:2006/06/16(金) 09:32:37
>>806
for文内で評価する式が一つなら
fo(;;) 式
for(;;)

となるが二つ以上評価したいなら
for(;;){
式1;
式2;
}
というようにしなきゃなんね
809806:2006/06/16(金) 09:38:08
すみません
このような結論に至ってしまったのは、
VC7.1でデバッグ(ステップ実行)すると、
for文実行中カーソルがa = ic + 1; の行にいっていた為でした・・・

実際には実行はされていませんでした。
お騒がせいたしました・・・m(_ _
810デフォルトの名無しさん:2006/06/16(金) 10:10:02
>>809
そんな感じで混乱するのでよっぽど単純な場合以外は括弧つけましょう
811デフォルトの名無しさん:2006/06/16(金) 12:01:41
scanfで数字のみを入力させたい場合はどのようにしたらいいですか
812デフォルトの名無しさん:2006/06/16(金) 12:55:13
>>809
そういうこともあるので、括弧をつけないなら1行で書くことお勧め。
for (ic = 0; ic < 100; ++ic) if (ic == b) break; とか。
#逆に言えば、複数行にしたら必ず括弧をつけるってこと。

>>811
やりたいことを詳しく。
813デフォルトの名無しさん:2006/06/16(金) 13:12:14
>>810
>806 のはよっぽど単純な場合だと思うが
それでも混乱するのは >806 の資質によるものだろう。
814デフォルトの名無しさん:2006/06/16(金) 18:31:24 BE:134793239-#
> for (ic = 0; ic < 100; ++ic) if (ic == b) break; とか。

ええ? こんなんだめだろ。
815812:2006/06/16(金) 18:35:00
>>814
>806と同じコードを書いた積もりなんだけど、なんでダメ?
#まさか改行に特殊な意味があるなんて妄想していないよね。
816デフォルトの名無しさん:2006/06/16(金) 18:55:37 BE:44931233-#
制御の及ぶ範囲を勘違いするから、一行にしてしまいましょうなんて
アドバイスはマに受けないように。
ふつーにインデントしてたら大丈夫だから。
817デフォルトの名無しさん:2006/06/16(金) 19:40:26
>816こういうのや、>814こういうのがいるからカッコつけとくのが無難だな。
818あぼーん:あぼーん
あぼーん
819あぼーん:あぼーん
あぼーん
820デフォルトの名無しさん:2006/06/17(土) 01:16:38
#define ABC 1
#define DEF (1)

カッコの有る無しで違いってありますか。
821800:2006/06/17(土) 01:21:02
やれば分かるだろ
822デフォルトの名無しさん:2006/06/17(土) 01:22:11
違うスレの番号出たし・・
823デフォルトの名無しさん:2006/06/17(土) 01:24:51
>>817
>>816 はおかしい事は言っていないし、>>814 は真意が解らないので判定できない。
にも関わらず 「こういうのがいるから」 とは?
824デフォルトの名無しさん:2006/06/17(土) 01:28:01
>>820
ない。

式を定義するときには () を付けないと拙い事があるが

  #define ABC 1 + 3
  #define DEF (1 + 3)

  int i = ABC * 2 // 1 + 3 * 2 → 7
  int j = DEF * 2 // (1 + 3) * 2 → 8

そうでなければ同じ。
825820:2006/06/17(土) 01:49:23
なるほどdクス
826デフォルトの名無しさん:2006/06/17(土) 16:07:18
不定引数のしくみがどうなっているのか気になってカーネルを調べたら、以下のようにマクロされていた。

#define _AUPBND (sizeof (acpi_native_uint) - 1)
#define _ADNBND (sizeof (acpi_native_uint) - 1)

#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap) (void) 0
#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
827デフォルトの名無しさん:2006/06/17(土) 16:21:43
CからDOSコマンドを実行するにはどうしたらいいですか?
828デフォルトの名無しさん:2006/06/17(土) 16:33:18
>>826
>カーネルを調べたら
…ぉぃ。

>>827
system()
註: Windows 以外のシステムでは要エミュレータ。
   Windows 系でも一部非互換。
829デフォルトの名無しさん:2006/06/17(土) 20:56:56
>>826
一応言っておくが、それは数ある実装の1つに過ぎず、
世の中それが全てではないからな。
830デフォルトの名無しさん:2006/06/17(土) 21:19:24
俺もlinuxの2.6のprintkとかを見てみたら、va_start()のマクロが>>826のようになっていた。
カーネル読んでるのか、えらいな。
831デフォルトの名無しさん:2006/06/17(土) 22:46:00
C言語の中級者以上を対象とした本を探しています。
入門書はたくさんあるのに 。・゚・(ノД`)・゚・。ウエエェェン
832デフォルトの名無しさん:2006/06/17(土) 23:02:41
あっそ
833デフォルトの名無しさん:2006/06/17(土) 23:44:14
K&RとエキスパートCくらいだろうね。
Cの上級本って少ないよ。
834デフォルトの名無しさん:2006/06/18(日) 00:25:00
rand()関数を使って推移確率行列を作るにはどうしたらいいでしょうか
835デフォルトの名無しさん:2006/06/18(日) 00:34:07
>>830
> カーネル読んでるのか、えらいな。
どのへんが*えらい*のか教えて?
836デフォルトの名無しさん:2006/06/18(日) 00:35:23
はいはい、えらくないえらくない、ワロスワロス
837デフォルトの名無しさん:2006/06/18(日) 00:43:50
va系の動作なんてちょっと考えれば実装は想像つくだろ。
要はスタックのアドレスを取得して操作しているだけだ。
838デフォルトの名無しさん:2006/06/18(日) 00:50:37
と、カーネルを読む気もないやつがほえています。
839デフォルトの名無しさん:2006/06/18(日) 01:33:12
Cで、ファイルの基本的な入出力まで学習しました。
そこで質問なのですが、あるtxt形式のファイルから、
「ある行のみを読み込む」、あるいは「ある行から書き込む」ことが
出来なくて困っております。
全て読むには、for文とfscanf関数で回せばいいのは解るのですが・・
840デフォルトの名無しさん:2006/06/18(日) 01:36:50
つPerl

if($.==ある行){
 好きな操作;
}
841デフォルトの名無しさん:2006/06/18(日) 01:39:56 BE:99846454-#
>>839
順番に一行ずつ読んでいくしかないだろ。
一行の長さが全部同じなら、fseek()で移動すればいいけど。
842839:2006/06/18(日) 01:43:43
>>840
1から勉強しなおすのもきついですorzっていうかスレタイw

>>841
それしかないですか・・・
一度全てオブジェクトに格納してから処理することにします。
>>840->>841さんレスありがとうございました。
843デフォルトの名無しさん:2006/06/18(日) 04:47:17
>>839
/* ある行のみを読み込む(=ある行まで全部読んである行だけ残す) */
for (行 = 1; 行 <= ある行; ++行) {
/* 同じバッファを使いまわす */
fgets();
}
/* 最後に残ったのはある行の内容 */

/* ある行から書き込む(=ある行の前まで全部コピーする) */
for (行 = 1; 行 < ある行; ++行) {
fgets();
fputs();
}
/* 後はお好きにどうぞ */
844デフォルトの名無しさん:2006/06/18(日) 05:02:04
長い行が出てきたとき、バッファクラッシュする。
プロはfgetcを使う。
845デフォルトの名無しさん:2006/06/18(日) 05:18:17
>>844
いや、プロなら長い行が出てきたときは行カウンタを調整すればいいだけだって気づけよ。
少なくとも、fgets()でバッファクラッシュさせるようなコードを書くのは素人以下だって。
846デフォルトの名無しさん:2006/06/18(日) 05:42:52
プロが糞というのは定説ですよ。
847デフォルトの名無しさん:2006/06/18(日) 09:30:02
va関係ってカーネルに依存するの?
てっきりコンパイラに依存すると思っていたよ。

カーネルか・・・ITRONなら見たことあるけどな。ちょっぴり
848デフォルトの名無しさん:2006/06/18(日) 09:34:38
>>847
どっちかというと実行環境のアーキテクチャに依存する。
引数がどうやって渡されるかということが、可変個引数の実装に最も直接的な影響を与える。
849デフォルトの名無しさん:2006/06/18(日) 10:01:42 BE:239630786-#
>>844
fgetc使ったって、状況はかわらんだろ。
850デフォルトの名無しさん:2006/06/18(日) 12:08:29
プロならfgetcなんか使わない
851デフォルトの名無しさん:2006/06/18(日) 13:07:31
素人が多いなw
852デフォルトの名無しさん:2006/06/18(日) 13:16:25
ある行、というのは行番号ではなくて、なんかの文字列ではないのか?
たとえば、** hogehoge という文字列を行の先頭に見つけたばあい、
その次の行殻の内容を別ファイルOUTPUTに書き込む。
次に** hogehoge が出てくると書き込み終了みたいな。

Perl使えば20ステップくらいで終わるな。
853デフォルトの名無しさん:2006/06/18(日) 13:23:51
Rubyなら15ステップくらいだな
854デフォルトの名無しさん:2006/06/18(日) 13:29:39
awkなら10ステップかな。
855デフォルトの名無しさん:2006/06/18(日) 13:38:40
以降、-5くらいまで進む予定です。乞うご期待!
856デフォルトの名無しさん:2006/06/18(日) 13:44:17
sedなら5ステップくらいだよ。
857デフォルトの名無しさん:2006/06/18(日) 13:49:22
テキスト処理などPerlで十分だよ。
ってかすれ違い
858デフォルトの名無しさん:2006/06/18(日) 14:05:48
ほっとけば0ステップだよ。
859デフォルトの名無しさん:2006/06/18(日) 15:01:22
数値計算するときなどは、FortranとかCとか使わざるを得ないときもあるからね。
860デフォルトの名無しさん:2006/06/18(日) 15:56:59
だけどプログラムを書くのがPGクォリティ
861デフォルトの名無しさん:2006/06/18(日) 17:11:44
テキスト処理にC使うプロなんていねーぞw
862デフォルトの名無しさん:2006/06/18(日) 17:56:38
物知らなさ杉
863デフォルトの名無しさん:2006/06/18(日) 20:40:52
実行環境によるよ

...テキストファイルをデータベースとして使ったりorz
864デフォルトの名無しさん:2006/06/18(日) 21:48:05 BE:404376899-#
だいたいプログラムの単位でステップなんか使うなよ。
865デフォルトの名無しさん:2006/06/19(月) 11:53:56
>>864
じゃあ KiB で。
866デフォルトの名無しさん:2006/06/19(月) 14:51:17
>>865
GiB の間違いじゃないか?
867デフォルトの名無しさん:2006/06/19(月) 20:25:27
GP-IBの間違いでした
868デフォルトの名無しさん:2006/06/20(火) 00:33:45
久々に覗いたらスレ番号がかなりズレてるんだが、何かあったのか?
869800:2006/06/20(火) 00:37:12
第2次勃起合戦がありますた
870デフォルトの名無しさん:2006/06/20(火) 20:58:59
if(条件文) exit(-1);

こんな風にexitがあったのですが、どういう意味なのでしょうか?
871デフォルトの名無しさん:2006/06/20(火) 21:02:47
exit のヘルプを見れば?
872デフォルトの名無しさん:2006/06/20(火) 21:47:50
man exit
873デフォルトの名無しさん:2006/06/20(火) 22:30:05
>>864
ステップって使わないの?
何を使うのが標準?
874デフォルトの名無しさん:2006/06/20(火) 22:46:20
>>873
じゃあ KiB で。
875↓この人童貞です:2006/06/20(火) 22:47:38
 
876↑この人処女です:2006/06/21(水) 00:02:05
877デフォルトの名無しさん:2006/06/21(水) 00:03:21
>>876
GiB の間違いじゃないか?
878デフォルトの名無しさん:2006/06/21(水) 00:52:16
質問です。
getc() で既成のファイルから1バイトずつ読み取り、
特定のビットパターンが来た時だけ char型配列に記録するプログラムを作っています。

同じようなファイルを通したとき、きちんと成功する場合もあれば
エラーが出る場合もあって困ってたのですが、どうやら

if( buff[ current ] == EOF )
{
......(終了処理)
}

と書いていた所がまずかったようで、ファイル中に 0xFF があったときに
-1(EOF) と誤認してプログラムを終了していたのが原因だったようです
処理が中断するまでのバイト数を調べたところ該当番地に 0xFF があったので多分間違いないと思います。

しかしこの 0xFF をどうやって避けたらいいものか判りません。
ファイルサイズは固定ではないので、そのファイルの状態に応じて判別するしかないとは思うのですが・・・
879デフォルトの名無しさん:2006/06/21(水) 01:04:30
>>878
getchar()、fgetc()の戻り値はintで受け取れ。
880デフォルトの名無しさん:2006/06/21(水) 01:09:22
GP-IBの間違いでした
881デフォルトの名無しさん:2006/06/21(水) 01:12:14
>>879
簡潔&的確な回答をありがとうございます。
お陰で2時間くらい悩んでたものがやっと解決しました
882デフォルトの名無しさん:2006/06/21(水) 01:12:49
>>878
EOFはchar型じゃないってことをまず知ろうな。
883デフォルトの名無しさん:2006/06/21(水) 09:17:39
>>882
そんなことはないだろう。
884デフォルトの名無しさん:2006/06/21(水) 12:30:52
>>883
あるよ
885デフォルトの名無しさん:2006/06/21(水) 17:10:12
>>883
stdio.hを開いて、EOFとgetchar()の定義をよく見てみよう。
886デフォルトの名無しさん:2006/06/21(水) 18:19:11
#include <stdio.h>
long foo(void){return EOF;}
int bar(void){return EOF;}
char dum(void){return EOF;}
int main(void){
long l;
int i;
char c;
l = foo ();
i = bar ();
c = dum ();
return 0;
}
>883
EOFは何型ですか?(lol
887886:2006/06/21(水) 18:24:26
ごめんアンカ違った
>885
888デフォルトの名無しさん:2006/06/21(水) 18:32:51
lolって久しぶりに見た気がする
889デフォルトの名無しさん:2006/06/21(水) 18:34:04
>>886
EOFはたしかint型の定数と定められていたと思う。
890デフォルトの名無しさん:2006/06/21(水) 18:35:57
ISO/IECではEOFはint型の負の値と決まっている。
>>886でエラーが出ないのはint→long int→charの暗黙の変換が認められているから。
891デフォルトの名無しさん:2006/06/21(水) 18:40:37
なんだこの流れは。
892デフォルトの名無しさん:2006/06/21(水) 18:42:29
>>891
困ったチャンの>886=883が無知を棚に上げて絡んでいるのを
周りが構ってあげてる流れ。
893デフォルトの名無しさん:2006/06/21(水) 19:10:00
http://www.dm.unife.it/Linguaggi1/download/BORLAND/Stdlib.h
のstdlib.hを使用したところ以下のようなエラーが発生しました。

エラー E2040 116行目:宣言が正しく終了していない.
警告 W8017 117行目:マクロ'abs'の重複定義

#else
int _RTLENTRY _EXPFUNC abs(int __x); ←116行目
# define abs(__x) __abs__(__x)       ←117行目
#endif

解る方がいらっしゃればよろしくお願いします。
894デフォルトの名無しさん:2006/06/21(水) 19:56:07
>>893
そんなよその物を使わず自分のコンパイラ付属の物を使え。
895デフォルトの名無しさん:2006/06/21(水) 20:56:47
>ISO/IECではEOFはint型の負の値と決まっている。
int型のEOFを返す、というのは散見しますが、
EOFはint云々はどこにも書かれてないと思いますが。
もし良かったら書かれている場所を特定してください。
896デフォルトの名無しさん:2006/06/21(水) 21:05:27
>>895
JIS X3010:2003の7.19.1の中にこんなことが書かれている。
> EOFは,型がintで,負の値を持つ整数定数式に展開する。
JISに書いてあればISO/IECにも書かれていないわけがなかろう。
897デフォルトの名無しさん:2006/06/21(水) 22:37:38
7.19.1
> EOF
> which expands to an integer constant expression, with type int and a negative value,
898デフォルトの名無しさん:2006/06/21(水) 22:53:13
#define EOF (-1) /* End of file indicator */
899デフォルトの名無しさん:2006/06/21(水) 23:03:12
>>898
別に何もおかしなところはないが
900デフォルトの名無しさん:2006/06/21(水) 23:19:00
>>899
おかしいから出したのではなく、
実際のコンパイラの定義例を出したので、当然。
>>885で言われたことぐらい調べてから話せよと。
901デフォルトの名無しさん:2006/06/21(水) 23:23:33
いやなんでそこでそれを出すのか理解できない
902デフォルトの名無しさん:2006/06/21(水) 23:34:29
>>901
回線クソ重で流れに乗り遅れたんだよ。
仕方ないだろ。許せよ!
903デフォルトの名無しさん:2006/06/21(水) 23:43:29
許す。
904デフォルトの名無しさん:2006/06/22(木) 21:35:29
↓次でぼけること
905デフォルトの名無しさん:2006/06/22(木) 21:52:56
(double) EOF
906デフォルトの名無しさん:2006/06/22(木) 21:56:04
unsigned char aaa;

aaa += 0;
907デフォルトの名無しさん:2006/06/22(木) 23:49:50
#define PI oppai
908デフォルトの名無しさん:2006/06/23(金) 01:25:11
ファイルから構造体の配列への読込と、書き込みがいまいち
分からないので、教えてください。
909デフォルトの名無しさん:2006/06/23(金) 01:27:49
>>908
つ[初心者スレ]
910デフォルトの名無しさん:2006/06/23(金) 01:32:54
>>909
初心者スレいってきます。
911デフォルトの名無しさん:2006/06/23(金) 11:16:50
>>873
いや、ステップでもいいけど、COBOLとかBASICチックだなと思って。
912デフォルトの名無しさん:2006/06/23(金) 14:20:03
>>873
使わないというか、1ステップを何に換算したらいいんだ?
Cで10行? 20行? 1関数? 10関数?
913デフォルトの名無しさん:2006/06/23(金) 14:55:47
1ステップ1行だろ?
ステップを使ってるところでは.
914デフォルトの名無しさん:2006/06/23(金) 14:58:07
K&R スタイル, GNUスタイル etc.. で、文法的には同一コードでもステップ数は変わるのか…
915デフォルトの名無しさん:2006/06/23(金) 15:25:20
>>914
ステップでコードの規模をはかるようなところは、大抵コーディング規約があるので、
そのようなことは問題にならない。
916デフォルトの名無しさん:2006/06/23(金) 17:48:58
>>914
cb -j ソース | wc -l
917デフォルトの名無しさん:2006/06/23(金) 20:19:46
うちはステップ数は大雑把にしか把握しない。
はっきり言って飾りです。

お金は昔からの経験で算出しているらしい。
下っ端なもんだからお金のことはわからないが
918デフォルトの名無しさん:2006/06/23(金) 20:23:08
>>917
たぶん君の知らないところでステップ数は使われてると思うよ
919デフォルトの名無しさん:2006/06/23(金) 21:54:00 BE:69892272-#
うちも見積もりは行数単位ではない。
かといってFPとか使ってるわけでもないけど。
920デフォルトの名無しさん:2006/06/23(金) 22:39:16
うちのところはステップ使ってる。
このアプリは〜Kステップとか。

H製作所やF通はステップ使うんじゃない?
921デフォルトの名無しさん:2006/06/23(金) 22:41:25
誰もステップでいいとは思ってないけど
他に計る方法がないので仕方なく・・って感じ
922デフォルトの名無しさん:2006/06/23(金) 22:44:22
行でいいけどね。
先輩方がステップ使うから、なんかそれがうちの標準なんだと納得。
923デフォルトの名無しさん:2006/06/23(金) 22:50:07
>>919
ん?見積もりは大体において、どこでも人月だろ?それ以外のとこ見たこと無いぞ。
924デフォルトの名無しさん:2006/06/23(金) 22:54:02
どう言うのが 1 step なの?
925デフォルトの名無しさん:2006/06/23(金) 22:58:25 BE:44931233-#
>>921
FPとか使ってるところってないのかなぁ。
やっぱ机上の理論なのか。
926デフォルトの名無しさん:2006/06/23(金) 23:00:14 BE:179723366-#
>>923
昔、COBOLの仕事をやってたときは、ステップ数のようだったけど。
見積の±5%以上の誤差があるとまずいらしくて、ループを展開したりして
調整させられたことがある。
927デフォルトの名無しさん:2006/06/23(金) 23:00:31
プログラムの規模の話をしてるやつと、見積もりの話をしてるやつと、開発工数の話をしている奴が
いりみだれているようだな。
俺は全く関心ないがな。
928デフォルトの名無しさん:2006/06/23(金) 23:02:21
>>926
その話は上司から聞いたことがある。ステップあたりいくらとかいう時代もあったようだ。
929デフォルトの名無しさん:2006/06/23(金) 23:10:49
ヂェネレーションギャップという奴じゃ
930デフォルトの名無しさん:2006/06/23(金) 23:17:29
ジェネレーションギャップという奴じゃ
931デフォルトの名無しさん:2006/06/23(金) 23:20:20
もともとはアセンブリ言語の名残でそ
932デフォルトの名無しさん:2006/06/23(金) 23:25:10
俺今アセンブリ勉強してるんだ。
933デフォルトの名無しさん:2006/06/23(金) 23:25:47 BE:269584496-#
機能から、ステップ数を予測して、プログラマの月にかけるステップ数で割って、
人月を出すって話なんじゃないか?
934デフォルトの名無しさん:2006/06/23(金) 23:27:44
開発スピードが5K/monのやつもいれば1K/monのやつもいるのだが
935デフォルトの名無しさん:2006/06/23(金) 23:32:57 BE:359446098-#
>>934
ベテランがどのくらい、新人がどのくらいって適当な基準でやってた。
936デフォルトの名無しさん:2006/06/24(土) 01:04:20
で、その、ステップやら人月やらというのは
ISO/ANSIで標準化された、C言語の仕様なのですか?
937デフォルトの名無しさん:2006/06/24(土) 01:18:30
んなわけないw
938デフォルトの名無しさん:2006/06/24(土) 05:15:21
JISです。
939デフォルトの名無しさん:2006/06/24(土) 08:44:30 BE:404376899-#
「ANSI-C」です。
940デフォルトの名無しさん:2006/06/24(土) 09:45:21
Nクイーンを配置する問題教えて
941デフォルトの名無しさん:2006/06/24(土) 11:04:32
>>939
安心しーや
942デフォルトの名無しさん:2006/06/24(土) 12:37:14
ぬるぽです。
943デフォルトの名無しさん:2006/06/24(土) 12:59:22
>>940
N×Nの盤面上にN個のクイーンを配置せよ。
ただしどのクイーンも縦横斜めの線上に他のクイーンが無いように置くこと。
944デフォルトの名無しさん:2006/06/24(土) 15:28:55
>>943
ねぇねぇ、それってなんでクイーンなの? プリンスじゃいけないの?
945デフォルトの名無しさん:2006/06/24(土) 15:47:56
>>944
チェスにプリンスの駒はない。
面白いと思って書いてるんだろうが、浅薄。
946デフォルトの名無しさん:2006/06/24(土) 15:56:28
>>945
チェスの駒と言う前提条件があるなら、>943の2行目は冗長だね。
曰く、「但し互いの利き筋に置かないこと」と。
947デフォルトの名無しさん:2006/06/24(土) 15:57:19
>>946
馬鹿?
948デフォルトの名無しさん:2006/06/24(土) 16:16:27
>>946
>チェスの駒と言う前提条件があるなら
ではない、チェスの駒しかない。
わかりきった事をネタにしたのかと思ったが、「知らなかった」らしいな。

浅薄は取消す、代わりに「無知」を授けるので謹んで拝領したまえ。
949デフォルトの名無しさん:2006/06/24(土) 16:21:45
Nクィーン問題も知らないのか。まぁ高卒じゃ無理もないかもな。
950デフォルトの名無しさん:2006/06/24(土) 17:00:20
>>949
失礼な。高専です
951デフォルトの名無しさん:2006/06/24(土) 17:10:34
俺は高専だが知っているぞ。
952デフォルトの名無しさん:2006/06/24(土) 17:32:32
高専だろうがどこだろうが底辺はこんなもんだろ。
使えないクズだらけだ。
953デフォルトの名無しさん:2006/06/24(土) 17:58:04
なぜだれも>946の2行目に突っ込まないんだろう……
954デフォルトの名無しさん:2006/06/24(土) 18:37:21
誰もチェスを知らないから。
955次スレテンプレ:2006/06/24(土) 20:13:05
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ANSI-C】 C言語なら俺に聞け!  Part 127
http://pc8.2ch.net/test/read.cgi/tech/1147375815/


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.28【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1149815331/
C言語/C++言語の宿題を片付けます 65代目
http://pc8.2ch.net/test/read.cgi/tech/1147902222/
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/
956デフォルトの名無しさん:2006/06/24(土) 20:37:56
これもリンク張っとく?
C言語なら俺に聞け(入門篇)
http://pc8.2ch.net/test/read.cgi/tech/1146700389/
はきだめC/C++下級者の質問箱
http://pc8.2ch.net/test/read.cgi/tech/1124256027/
C言語を今日から始める僕に1から教えるスレ
http://pc8.2ch.net/test/read.cgi/tech/1137933572/
957デフォルトの名無しさん:2006/06/24(土) 20:38:48
>>955
古いスレのリンク張ってるのはわざとか?
958デフォルトの名無しさん:2006/06/24(土) 23:16:56
レス数が950を超えています。1000を超えると表示できなくなるよ!
959デフォルトの名無しさん:2006/06/24(土) 23:21:53
テンプレ修正


このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ANSI-C】 C言語なら俺に聞け!  Part 127
http://pc8.2ch.net/test/read.cgi/tech/1147375815/


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.28【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1149815331/
C/C++の宿題を片付けます 68代目
http://pc8.2ch.net/test/read.cgi/tech/1151158759/
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/
960デフォルトの名無しさん:2006/06/24(土) 23:28:56
遅レスだが、ステップ数には言語や環境、システム形態に合わせた生産性って指標があってそれをかけると人月に変わる
正直な話、C言語のステップ数は金融機関と通信屋以外の仕事はまず無意味
961デフォルトの名無しさん:2006/06/24(土) 23:46:56
意味不明
962デフォルトの名無しさん:2006/06/24(土) 23:59:47
スレ違いどころか板違い。

こんな基本的なお約束すら守れないボケどもが
コーディング規約とか片腹痛い。
963デフォルトの名無しさん:2006/06/26(月) 09:35:23
【ANSI-C】 C言語なら俺に聞け!  Part 128
http://pc8.2ch.net/test/read.cgi/tech/1151282084/
964デフォルトの名無しさん:2006/06/26(月) 22:55:55
セキュアなプログラムを思いついた
int main_s()
{
return 0;
}
965デフォルトの名無しさん:2006/06/27(火) 14:02:54
ぬるぽ
966デフォルトの名無しさん:2006/06/27(火) 14:05:01
がっ
967デフォルトの名無しさん:2006/06/27(火) 15:04:58
ぬるぽ
968デフォルトの名無しさん:2006/06/28(水) 21:24:10
ぱっ
969デフォルトの名無しさん:2006/06/28(水) 22:18:13
ぬるぼ
970デフォルトの名無しさん:2006/06/29(木) 08:57:23
971デフォルトの名無しさん:2006/06/29(木) 15:01:20
ぬるぽ
972デフォルトの名無しさん:2006/07/02(日) 14:12:12
int test()
{
return 10;
}

int main()
{
test();
return 0;
}

上のように戻り値がある関数を呼び出した時に、戻り値を受け取る変数をセットして無くても
コンパイルは通るのですが、これは問題無いのでしょうか?
973デフォルトの名無しさん:2006/07/02(日) 14:24:42
>>972
戻り値を必要としないのであれば、問題ありません。
例えば、引き数が間違っていない限りエラーを返さないfseek()の戻り値は大抵捨てられます。
974972:2006/07/02(日) 14:29:59
>>973
即レスありがとうございます。
上の例で言えば、test関数を何度か呼び出すプログラムなんですが、
場合によっては戻り値を受け取りたくなかったんです。

なので、こういう使い方大丈夫なのかと思い質問した次第です。
勉強になりますm(_ _)m
975デフォルトの名無しさん:2006/07/02(日) 17:24:00
K&Rに書いてあります
976デフォルトの名無しさん:2006/07/02(日) 18:05:19
>>974
scanfとかprintfだって戻り値を返しているんだぞ。
977デフォルトの名無しさん:2006/07/02(日) 18:32:22
atoi(strncpy(openStr , "15" , 2));
MessageBoxでopenStrを表示したんですが、"15@"と表示されてしまいます。
なぜですか? 教えてチャソ。
978デフォルトの名無しさん:2006/07/02(日) 18:34:59
>>977
× strncpy(openStr , "15" , 2)
○ strncpy(openStr , "15" , 3)
979デフォルトの名無しさん:2006/07/02(日) 18:47:52
>>978
ありがとうございます。
すみません。まわりくどい質問だったかもしれません。
もし文字列が"15,15…"というのを格納した変数で後ろの"15"だけ2文字(NULL文字含む)
引っ張り出したいときはどうすればいいでしょうか?
980デフォルトの名無しさん:2006/07/02(日) 18:49:35
strncpy(openStr, "15,15…", 2);
openStr[2] = '\0';
981デフォルトの名無しさん:2006/07/02(日) 18:55:50
>>980
ああありgふぁとうございます。
おいどんが馬鹿でしたああ。やっぱNULL文字は大事ですね。
982デフォルトの名無しさん:2006/07/02(日) 19:02:25
sprintf(openStr,"%.*s",2,"15.55");
    
983デフォルトの名無しさん:2006/07/03(月) 16:48:19
char s[] = "15,15...";
char openStr[3];

openStr[0] = s[0];
openStr[1] = s[1];
openStr[2] = '\0';
984デフォルトの名無しさん:2006/07/03(月) 19:00:18
進数変換で
2進数0001.1111と0001.0010を8進数にするやり方教えてください。
985デフォルトの名無しさん:2006/07/03(月) 19:05:11
ビットオーダーとバイトオーダーが云々
986デフォルトの名無しさん:2006/07/03(月) 21:20:46
0001.1111
00.011.111
0.3.7
037

0001.0010
00.010.010
0.2.2
022
987デフォルトの名無しさん:2006/07/04(火) 10:18:01
2進小数じゃないのか?
つまり、1.74(8)と1.10(8)じゃね?
988デフォルトの名無しさん:2006/07/04(火) 11:10:37
>>984
8進数は2進数を3桁ごとに区切ればできる。

で、その途中の '.' は何だ?
それがもし小数点なら3桁ごとの区切り目の起点がそこになる。
989デフォルトの名無しさん:2006/07/04(火) 21:44:56
入門書に載ってた問題で
「条件式が常に真になるようなwhile文を記述してください。
 また、その繰り返し処理の中で変数iをインクリメントし、
 iが100よりも大きくなったら繰り返し処理を抜け出せるようにしてください。」

#include <stdio.h>
int main()
{
int i = 0;
while( 1 ){
i++;
printf("i:%d\n",i);
if( i>100 ){
break;
}
}
}

上記のソースが問題の答え
while( 1 ) のカッコの中の数字を100や1000に変えても問題なく処理され
なぜ1なのかが解らないのですが
これは、どんな理由からなのでしょうか?
990デフォルトの名無しさん:2006/07/04(火) 21:49:06
whileが判定しているのは「0以外であること」だから。
別に1でなくても100でも1000でもいい。
991デフォルトの名無しさん:2006/07/04(火) 21:49:51
バカですか?
偽は0
真は0以外
と知らないんですか?人間性を疑います。
貴方みたいな人はプログラムを止めてください。
992デフォルトの名無しさん:2006/07/04(火) 21:52:52
>>991
人間性まで疑う必要は無いと思うが……。
993989
>>990-991
ありがとうございます