C言語なら俺に聞け(入門篇) Part 17

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 16
http://pc11.2ch.net/test/read.cgi/tech/1184003625/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 93代目
http://pc11.2ch.net/test/read.cgi/tech/1184506311/
21:2007/07/24(火) 23:18:31
3デフォルトの名無しさん:2007/07/25(水) 00:01:02
>>1
4デフォルトの名無しさん:2007/07/25(水) 00:55:38
プッツ
5デフォルトの名無しさん:2007/07/25(水) 01:13:26
C++のことを聞きたいのだったらここへ行きなさい。
【初心者歓迎】C/C++室 Ver.40【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1184717430/l50
6デフォルトの名無しさん:2007/07/25(水) 04:20:59
大昔にBASICって言語があって、
GOTOがはびこっていたので、GOTOを
なくそうとしてPASCALがうまれて、
でもPASCALでもまだ少しGOTOが残っていたので
Cで完全にGOTOをなくせたけど、まだ
再帰とポインタが残っていたので
JAVAで再帰とポインタを駆逐した、って
あってる?
7デフォルトの名無しさん:2007/07/25(水) 05:04:59
大間違い。
8デフォルトの名無しさん:2007/07/25(水) 05:54:57
つうか合ってる箇所が一つも無いな
9デフォルトの名無しさん:2007/07/25(水) 08:06:43
再帰を駆逐してどうする
10デフォルトの名無しさん:2007/07/25(水) 10:10:45
printfみたいにいくつ引数があるかわからない関数を作るにはどうしたらいいのでしょうか?
11デフォルトの名無しさん:2007/07/25(水) 10:42:00
>>10
環境によって大きく2通りあるけど、一つは
stdarg.h をincludeして、可変引数の部分を ... にして
va_start、va_arg、va_end を使う。
これらの単語を適当にググレばサンプルあると思う。
12デフォルトの名無しさん:2007/07/25(水) 10:46:22
>>11
ありがとう
そこらへんぐぐってがんばってみます
13デフォルトの名無しさん:2007/07/25(水) 20:53:51
今日は静かだな
14匿名:2007/07/25(水) 23:23:37
C言語のプログラミングについておしえてほしいんですけど誰か教えてくれませんか?
15デフォルトの名無しさん:2007/07/25(水) 23:27:26
これはひどい釣り
16デフォルトの名無しさん:2007/07/25(水) 23:28:54
>>14
なにか分からないことがあったら、そのとき質問してみな。
17匿名:2007/07/26(木) 00:19:46
6ヶ月分のガス料金を求めます。
使用料金=基本料金+(1㎥当たりの単価×使用量)
使用量      基本料金   1㎥当たりの単価
25㎥以下      690円     127円
25から500㎥以下  1170円     108円
500㎥より多い   6980円     96円

月の使用量を順番にキーボードから入力する。
使用料金は基本料金+(1㎥当たりの単価×使用量)計算する。
各月の使用料金は算出して以下のように表示させる。
      1gatu 2gatu 3gatu 4gatu 5gatu 6gatu Goukei Heikinn
charge 12500 25600 35410 19860 13250 29800 1278540 21906

if文と繰り返し(for.while.do〜whileのいずれか)、2次元配列を利用してプログラムを作成する。

以上なんですけどお願いできませんか?
18デフォルトの名無しさん:2007/07/26(木) 00:21:34
>>17
宿題池
19匿名:2007/07/26(木) 00:23:21
自分ができないから他に聞けってことか
ただのさらしじゃん
20デフォルトの名無しさん:2007/07/26(木) 00:25:08
>>19
宿題池
21デフォルトの名無しさん:2007/07/26(木) 00:33:16
宿題池ってなんですか?
22デフォルトの名無しさん:2007/07/26(木) 00:35:13
7月の宿題にしちゃ簡単だな。高校生くらいか?
宿題スレでテンプレに沿って書けば簡単だからいっぱい答えてもらえると思うよ
23デフォルトの名無しさん:2007/07/26(木) 01:04:29
とりあえず>>1ぐらい見ろよ…
24デフォルトの名無しさん:2007/07/26(木) 06:41:21
>>17
ちょっと前に全く同じ質問があって、回答もされてた。
残念だったな。
25デフォルトの名無しさん:2007/07/26(木) 09:07:36
>>17
ほれ。
s,v[7];main(i,n){for(;n=i<7;s+=v[i++]=n<26?690+n*127:n<501?1170+n*108:6980+96*n)scanf("%d",&n);
for(++i;n<6;i=1)printf("%*dgatu ",i,++n);printf("Goukei Heikinn\ncharge");for(;i<7;printf(" %5d",v[i++]));printf(" %6d %d\n",s,s/6);}
26デフォルトの名無しさん:2007/07/26(木) 17:01:57
char型で渡されてきた数式を逆ポーランド記法に変換して文字列として出力したいのですが、
この手のソースやライブラリがあれば教えてください。
よろしくお願いします。
27デフォルトの名無しさん:2007/07/26(木) 17:02:27
ツリーでやれ
28デフォルトの名無しさん:2007/07/26(木) 17:18:26
#include <stdio.h>

int main()
{
float x =0.0;

while(x != 1.0){
x+=0.1;
}
return 0;
}
これが無限ループになるのはなぜですか?
教えてください。
29デフォルトの名無しさん:2007/07/26(木) 17:22:12
0.1は二進法で正確に表現できない。
だから10回足しても誤差が入って1.0ちょうどにならない。
30デフォルトの名無しさん:2007/07/26(木) 17:25:54
while(x != 1.0){
x+=0.1;
printf("%.15g\n", x);
}
としてみると判るかと思います。
31デフォルトの名無しさん:2007/07/26(木) 17:32:25
>>29 30
0.100000001490116
など出て無限ループになった意味がよくわかりました。
ありがとうございます。
32デフォルトの名無しさん:2007/07/26(木) 18:02:05
#include<stdio.h>

int tasu(int b[]){
int y,i;

for(i = 0; i <= 4; i++){
y += b[i];
}
return y;
}

main()
{
int a[]={1,2,3,4,5};
int x;

x = tasu(a);
printf("%d",x);
}

15と表示させたいんですが変な値が出てしまいます。
どこがおかしいんでしょうか?
33デフォルトの名無しさん:2007/07/26(木) 18:04:02
>>32
tasu()関数のy の初期化
34デフォルトの名無しさん:2007/07/26(木) 18:06:30
ありがとうございます。
基本的な間違いでした。反省します。
35デフォルトの名無しさん:2007/07/26(木) 18:19:42
*(cp+1) = *cp;
cp++;
という操作を一息でやりたいのですが、
*(++cp) = *cp; や、*(cp++) = *cp; ではうまくいきませんでした。
なぜダメなのかを教えてほしいです。
また一息でやるすべはないのでしょうか?よろしくお願いします。
36デフォルトの名無しさん:2007/07/26(木) 18:26:21
>>35
一つの式の中で代入系の動作を複数含むと、いつその動作をすればいいか確定できない。
従って、一つの式で全てを賄うのは無理。
37デフォルトの名無しさん:2007/07/26(木) 18:53:39
早期回答ありがとうございます。
実はポインタの勉強でこういうプログラムを書きました。
#include<stdio.h>
#define N 10
main(){
char c[N]={100};
int i[N]={100};
int j;
char *cp =c;
int *ip =i;

for(j=0;j<N;j++){
*(cp+1) = *cp;
cp++;
*(ip+A) = *ip;
ip++;
}
for(j=0;j<N;j++){
printf("%c %d\n",c[j],i[j]);
}
}
38デフォルトの名無しさん:2007/07/26(木) 18:54:53
A=1とすると正常に動作しますが
A=4とすると正常に動作しません。
私はA=4だと思うのですが、なぜA=1で正常に動作するのでしょうか?
よろしくお願いします。
39デフォルトの名無しさん:2007/07/26(木) 18:58:57
>>38
ポインタには型がある。
ポインタの足し算で、1足すというのはアドレスを sizeof (型) * 1足すということなんだよ。
40デフォルトの名無しさん:2007/07/26(木) 19:01:48
早期回答ありがとうございます。
そんな便利機能があったとは知りませんでした。
でも前に意図的に4足したような記憶があります。
そういうケースってありますか?
41デフォルトの名無しさん:2007/07/26(木) 19:03:07
char* にキャストしてたら4足さなきゃならんだろうな
42デフォルトの名無しさん:2007/07/26(木) 19:06:48
なんとなくわかったような気がします。
何度もありがとうございました。
43デフォルトの名無しさん:2007/07/26(木) 19:31:08
44すこふぃーるど:2007/07/26(木) 20:25:55
明日プログラミング(C言語)のテストです。過去問を見て、どこ探してもわからないんで質問させてもらいます。
Q1 7500個の実数を読み込み、その一番初めのデータが2*3、14159より大きかったら
そのままの順で、そうでなかったら全てを逆順で出力せよ。

Q2 4つの実数(x1、x2、x3、x4)を読み込み、そのうち2つずつの和
(x1+x2、x1+x3、x1+x4、x2+x3、....)のうち最も小さな数値
を出力する。
45デフォルトの名無しさん:2007/07/26(木) 20:33:19
>その一番初めのデータが2*3、14159より大きかったら
これはどういう意味?
46デフォルトの名無しさん:2007/07/26(木) 20:48:25
>>44
Q2だけ

#include <stdio>
int main(void)
{
char buf[100];
int x[4],i,k,min=0x7fffffff;
printf("入力>");
fgets(buf,100,stdin);
if(sscanf(buf,"%d %d %d %d",&x[0],&x[1],&x[2],&x[3])!=4)
{
printf("エラー\n");
return 0;
}
for(i=0;i<3;i++) for(k=i+1;k<4;k++) if(x[i]+x[k]<min) min=x[i]+x[k];
printf("最小値=%d",min);
return 0;
}
47デフォルトの名無しさん:2007/07/26(木) 21:01:40
>>45
2*PIってことでしょう(たぶん)
48デフォルトの名無しさん:2007/07/26(木) 21:04:51
>>47
天才
自分まじで気づかんかったわ
49デフォルトの名無しさん:2007/07/26(木) 21:24:50
>>47
エスパー乙
やっぱ資質ある者って一般人とは違うな。普通気づかない。
50デフォルトの名無しさん:2007/07/26(木) 22:59:17
逆に、なんでみんなが判らないのか判らなかった漏れもいる。
なるほど、読点と思っちゃったわけか。
51デフォルトの名無しさん:2007/07/26(木) 23:03:48
うん
騙し絵で一つの見え方にはまってた感じ
52デフォルトの名無しさん:2007/07/27(金) 00:17:54
>>44
Q1
#include<stdio.h>
#define Bsize 80
#define Dsize 7500
main(){
char buf[Bsize];
int i;
double data[Dsize];

for(i=0;i<Dsize;i++){
fgets(buf,Bsize,stdin);
sscanf(buf,"%lf",&data[i]);
}
if(data[0] > 2*3.14159){
for(i=0;i<Dsize;i++){
printf("%lf\n",data[i]);
}
}
else{
for(i=Dsize-1;i>=0;i--){
printf("%lf\n",data[i]);
}
}
}
53デフォルトの名無しさん:2007/07/27(金) 02:22:42
001 C言語によるプログラムの一般的な作成手順を述べよ。
002 C言語のプログラムのソースファイルの拡張子は何か。
003 ソースファイルからオブジェクトファイルを作ることを何というか。
004 オブジェクトファイルから実行ファイルを作ることを何というか。
005 講義で使ったコンパイラの名前を答えよ。
006 UNIX(LINUX)では実行ファイルの名前はどのようになるか。
007 デバッグとは何か。
008 C言語でプログラムに使う文字はどういうものか。
009 C言語の標準規格はどう呼ばれるか。
010 もっとも短い実行できるC言語のソースを書け。
011 main関数とは何か。
012 main関数の型は何か。
013 main関数の戻り値はどうなるか。
014 グローバル(大域)変数とローカル(局所)変数の違いを答えよ。
015 静的変数はどういうときに使われるか。
016 変数の基本データ型をいくつか答えよ。
017 初期値が1である整数変数iの宣言は。
018 変数のアドレスとは何か。
019 変数のアドレスを知るにはどうするか。
020 講義で使ったシステムの整数の範囲を答えよ。
021 配列(変数)とは何か。
022 100個宣言した配列(変数)の添え字の範囲は。
023 配列(変数)の初期値はどのように設定するか。
024 2次元配列はどのように宣言するか。
025 2次元配列はどのように並んでいるか。
026 構造体とは何か。
027 typedefとstructの役割はどう違うか。
028 #includeとは何か。
029 #include <stdio.h>の<>の意味は。
030 ヘッダファイルとは何か。
54デフォルトの名無しさん:2007/07/27(金) 02:24:25
031 ヘッダファイルの拡張子は何か。
032 コメントとは何か。
033 コメントをソースに記入するのにはどうするか。
034 代入i=1の式としての値は何になるか。
035 整数変数iを1増やすのにどういう方法があるか。
036 printf関数は何をする関数か。
037 printf関数のfの由来は。
038 printf関数で改行させたいときには何を使うか。
039 printf関数で文字配列sの文字列を表示させたいときにはどう書くか。
040 整数変数iの値が1のときprintf("%d",--i);printf("%d",i++);でどういう表示がされるか。
041 整数変数dにscanf関数で整数をキーボード入力させる文を書け。
042 文字配列にscanf関数でキーボード入力するとき気をつけるべきことは。
043 文字リテラル'A'の整数としての値は。
044 'c'-'C'の値はいくらになるか。
045 文字の種類を判別するときにインクルードするヘッダファイルの名前は。
046 文字列と'\0'の関係は。
047 strcmp関数を使うときにインクルードするヘッダファイルの名前は。
048 文字列の長さを知るために使う関数は。
049 1*2+3の値はいくらになるか。
050 10%(-3)の値はいくらになるか。
051 ビット演算子の例をあげよ。
052 27&15の値はいくらになるか。
053 27|15の値はいくらになるか。
054 31>>2の値はいくらになるか。
055 int i,j;と宣言されているとき、&i-&jの絶対値はいくらか。
056 整数変数aの値が12から19までのときだけ「TEEN」の4文字を表示する文を書け。
057 (i>=0)?i:(-i)は何をする式か。
058 NULLとは何か。
059 for(i=0;i<10;i++)printf("!");という文では感嘆符は何回表示されるか。
060 for(i=10;i>-10;--i)if(i)printf("o");ではoは何文字表示されるか。
55デフォルトの名無しさん:2007/07/27(金) 02:24:55
061 i=10;while(i){printf("+");--i;}では+は何文字表示されるか。
062 breakはfor,do,whileではどのような意味があるか。
063 continueはfor,do,whileではどのような意味があるか。
064 switch文ではcaseの最後にbreak文が必要なのはなぜか。
065 switch文でdefault:はどういう意味を持つか。
066 if(i==0){}else{printf("A");}を出来るだけ簡単に書き直せ。
067 関数のプロトタイプ宣言はなぜ必要か。
068 関数の値を返すのに使う予約語は。
069 ファイルを扱うときにインクルードするヘッダファイルの名前は。
070 ファイルを扱うときに使う構造体の型の名前は。
071 fopen関数の戻り値は何か。
072 fopen関数が実行に失敗するとどうなるか。
073 fprintf関数とprintf関数の引数の違いは。
074 fscanf関数で1行読み込むときの注意は。
075 getc関数はどのような引数と戻り値を持つ関数か。
076 EOFとは何か。
077 cが整数変数、fpが正しい状態でwhile(EOF!=(c=getc(fp)))printf("%c",c);を実行すると結果は。
078 fflush関数は何をする関数か。
079 fclose関数が実行に失敗するとどうなるか。
080 標準入力とは何か。
081 標準出力とは何か。
082 ファイル入出力でどのようなエラーが考えられるか。
083 マルチタスク環境でファイルをロックするとはどういうことか。
084 rand関数を扱うときにインクルードするヘッダファイルの名前は。
085 rand関数の返す整数の値はどのような名前で呼ばれるか。
086 擬似乱数のシードとは何か。
087 srand関数はrand関数とどのような関係にあるか。
088 32ビットのint型は10進数で何桁の精度になるか。
089 float型は十進数でほぼ何桁の精度になるか。
090 double型は十進数でほぼ何桁の精度になるか。
56デフォルトの名無しさん:2007/07/27(金) 02:25:48
091 プログラムの処理の手順を一般に何と呼ぶか。
092 自分自身を呼び出すプログラムの手法を何というか。
093 キュー(待ち行列)とはどのようなものか。
094 スタックとはどのようなものか。
095 オーバーフローとは何か
096 アンダーフローとは何か。
097 いわゆるセグメンテーションフォルトで中断した後にできるファイルを一般に何というか。
098 C言語を作ったのは誰か。
099 C言語の祖先に当たるプログラム言語は。
100 C言語はどういう種類のプログラム言語か。
57デフォルトの名無しさん:2007/07/27(金) 02:43:28
>>53
C言語プログラマへの100の質問?
そういうのは個人サイトでやってくれ。
58デフォルトの名無しさん:2007/07/27(金) 03:01:16
イチローのやつかと思った
59デフォルトの名無しさん:2007/07/27(金) 07:34:53
>>56
097
今時一々ファイルを作る設定にしている香具師はいませんが。
60デフォルトの名無しさん:2007/07/27(金) 07:46:09
Cygwin とかデフォでコアダンプされた気が
61デフォルトの名無しさん:2007/07/27(金) 09:03:22
テスト中はコアダンプがけっこべんり
62デフォルトの名無しさん:2007/07/27(金) 09:33:49
コアダンプ見ても意味わかんねーよバーヤバーヤ
という俺はgdb派。
63デフォルトの名無しさん:2007/07/27(金) 09:42:05
gdbでもcoreつかえるべ?
64すこふぃーるど:2007/07/27(金) 11:13:00
プログラミング(C言語)の事で質問があります。過去問を見て、どこ探してもわからないんで質問させてもらいます。
昨日の質問と合わせると結局全部になっちゃいますけど、質問させてもらいます。

Q3 平面上の10個のてんの座標がある。このうち原点から最も遠い点まで
の距離を求めよ。データは1行に座標x、yの2つの数値が並んでいるとする。

Q4 3つの数を読み込んでこれらを3辺とする三角形が存在するっかどうか
判断せよ。

Q5 直線上を運動するある物体の速度(m/s)を10秒置きに測定した一連の
データがある。測定データの総数は1番初めのデータで与えるとする。
10秒間の速度の平均変化率が最も大きかったときの時刻(測定開始後何秒から何秒
の間か)
とその数値を求めよ。

Q6 直線上を運動するある物体の速度(m/s)を10秒置きに測定した一連のデータ
がある。
測定データの総数は1番初めのデータで与えるとする。
移動距離を求めるため、このデータを数値積分せよ。
概算でよいので、速度を平均速度とみなし、測定間隔と速度の積を足し合わせる
だけでよい。

Q7. 3つの0でない実数(x、y、z)を読み込み、そのうち2つずつの比(x/y、
x/z、y/z、....)
の全ての組合せの値を出力する
65デフォルトの名無しさん:2007/07/27(金) 11:21:12
宿題は宿題スレへ。ネタ回答希望なら止めないが。
66デフォルトの名無しさん:2007/07/27(金) 11:23:29
素朴な疑問だが、xとyの比はx / yではないと思うしyとxの比に等しいと思うのだがx / yとy / xの両方必要なのだろうか。
67デフォルトの名無しさん:2007/07/27(金) 13:20:55
xとyの比はx/yで、yとxの比はy/xだろ普通。
68デフォルトの名無しさん:2007/07/27(金) 13:52:22
aとbみたいな表現だとa,bが対等な関係になっちゃって
a/bかb/aかなんて代入順序に依存する式を表す事なんてできるわけがない
69デフォルトの名無しさん:2007/07/27(金) 13:57:13
うん
70デフォルトの名無しさん:2007/07/27(金) 15:02:13
-foo.c-
static void foo(){
}
void *fp() = foo;

-main.c-
extern void *fp();

main(){
 (*fp)();  // ←これは呼べる
 foo();   // ←これは呼べない
}

この理解で合っていますか?
71デフォルトの名無しさん:2007/07/27(金) 15:13:56
>>70
そのままだとコンパイルさえできない。
fpの定義がvoid (* fp)() = fooで、
宣言がextern void (* fp)()ならば、
コンパイルできるがリンクはできない。
7270:2007/07/27(金) 15:26:22
分かりました。ありがとうございます

staticの関数を別ファイルから呼ぶことは
どうやっても出来ないってことですか?
73デフォルトの名無しさん:2007/07/27(金) 15:34:42
>>72
だれが呼べないと書いた?
変数の定義と宣言を直せば呼べるぞ。
74デフォルトの名無しさん:2007/07/27(金) 15:44:33
ちなみに、
(*fp)();

fp();
でも呼べる。
7570:2007/07/27(金) 15:47:44
リンクできないってのがそうだと思って

-foo.c-
static void foo(){
}
void (*fp)() = foo;

-main.c-
#define FLAG 1
extern void (*fp)();

main(){
#if FLAG
 (*fp)();  // ←これは呼べる
#else
 foo();   // ←これは呼べない
#endif
}

FLAGが1なら普通に動作し
FLAGが0ならリンクエラーって事ですか?
76デフォルトの名無しさん:2007/07/27(金) 15:47:52
要はこうしておけばいいのだ。
--foo.h--
extern void (* fp)(void);
--foo.c--
#include "foo.h"
static void foo(void) {printf("Whee!\n");}
void (* fp)(void) = foo;
--main.c--
#include "foo.h"
int main()
{
fp();
return 0;
}
--
本来staticな関数はあくまでも同一ファイル内限定公開なのだから、お勧めはしないが。
#コンパイラの最適化の妨げにもなるし。
77デフォルトの名無しさん:2007/07/27(金) 15:49:33
>>75
>71はそういうことだね。fooと言う名前の関数エントリを探しても見つからないからリンクエラーになってしまう。
何故なら、fooはfoo.c内の静的リンケージしか持たないから名前自体が公開されないので。
7870:2007/07/27(金) 15:57:12
ありがとうございました

ヘッダーで公開する関数を制御したかったのですが
ヘッダーになくてもグローバルだと呼べるから駄目と言われたので
なんかないかと思いまして
79デフォルトの名無しさん:2007/07/27(金) 16:05:19
>>78
そういうことなら止めないけど、通常のstaticな関数と見分けがつくようにしておいた方がいいよ。
#関数にstaticがついてたら非公開だと思う人が圧倒的多数だから。
80デフォルトの名無しさん:2007/07/27(金) 19:42:32
すみません。質問させていただきます。
文字を入力して回文か否かを判定するプログラムを制作したのですが、すべて「回文です」という判定が表示されてしまいます。

#include<stdio.h>
int kaibun(const char *ss)
{
char *s = "ss";
char *r = "ss";
while(*r)
*s++; *r--;
while(*s){
if(*s != *r)
return(1);
*s++;
*r--; }
return(0); }
int main(void){
char str[100];
printf("文字列を入力してください");
scanf("%s",str);
if(kaibun(str))
printf("%sは回文ではありません\n",str);
else
printf("%sは回文です\n",str);
return(0);
}

どこが変なのかさっぱりわかりません。ぜひお願いします。
81デフォルトの名無しさん:2007/07/27(金) 20:06:40
>>80
多バイト文字では無いこと前提になるけど

char *s = "ss";
char *r = "ss";
ssという文字を見てるだけ
これはchar *ssのことじゃない
8281:2007/07/27(金) 20:09:23
あとこの部分もおかしい
>while(*r)
>*s++; *r--;

これは
while(*r) {*s++;}
*r--; ←これはwhile()の外になる

と同じで*r が0以外である間*s++ を実行
無限ループになる
8380:2007/07/27(金) 20:21:12
>>81,82
ありがとうございます。

char *ssを代入すればいいのでしょうか?

>while(*r)
>*s++; *r--;
のところは{}をつけたらいいのでしょうか?

すみません、始めたばかりで本当にセンスがなくて全くわかりません・・・。
8481:2007/07/27(金) 20:35:59
>>83
>{}をつけたらいいのでしょうか?
それでもssの先頭アドレスから r--; していくからおかしなことになる

さっきも言ったけど多バイト文字だとうまく動かないからね
1バイト文字であること前提で

まず
char *s = "ss"; char *r = "ss"; を
char *s = ss; char *r = ss; にする
次に
while(*r) *s++; *r--; を
while(*r) r++; 
r--;
にする (この r--; は while() ループの外だからね
while(*r) r++; で*r は '\0'を指すことになるから、r--; で一つ前に戻しておく

while(*s){
if(*s != *r)
return(1);
*s++;
*r--; }
return(0); }
この部分はいいと思うよ
85デフォルトの名無しさん:2007/07/27(金) 20:55:58
他人ですが、while(*s)とかやられると頭が?になってしまいます。

NULLで無い限り続けるって事ですよね?
8681:2007/07/27(金) 20:57:58
>>85
while(*s!='\0') または while(*s!=0) ってことです
while(*s!=NULL) はちょっと・・・私からはなんとも言えません
8780:2007/07/27(金) 20:58:27
>>84
こんなに丁寧に教えていただいてありがたいです。
訂正してコンパイラしてみたのですが、
char *s = ss; char *r = ss;
この部分がエラーがでて
「初期化により、ポインタの示す型からの修飾子が切り捨てられます」
と表示されてしまうのですがこれはどうしてなんでしょうか?
8881:2007/07/27(金) 21:02:56
>>87
警告でなくて?

const char *s = ss; const char *r = ss; でしたね
頭に const を付けてください
もしくは引数の const をはずしてください
89デフォルトの名無しさん:2007/07/27(金) 21:26:07
>>86
ポインタのポインタなら、while(*s!=NULL)だね。
9089:2007/07/27(金) 21:27:17
ああ、上から話が続いてたのか。
読まずにカキコした。
9181:2007/07/27(金) 21:39:59
>>90
いえいえ、気にしないでください
9280:2007/07/27(金) 21:58:04
>>88
すみません。警告です。エラーと勘違いしました。

const!そうでした!!思い出しました。ありがとうございます!
しかし、ずっと学校の演習室で自習をやっていて今帰ってきたところなので実行できていません。すみません。

81さん、スレのみなさん色々ありがとうございました。

明日行って実行してきます。
全くといっていいほどCに対してセンスがないのでここの板のみなさんは本当にすごいと思います。
頭悪いのでペースは遅いと思いますが、
ポインタまでは自分のものにしたいのでまたちょくちょくここでお世話になるかもしれません。
そのときはまたよろしくお願いします。
9381:2007/07/27(金) 22:05:55
>>92
今まで学校ですか
どの程度やっていたのか知りませんが、自分で>>80までやったのなら大丈夫だと思います
お疲れ様でした
9480:2007/07/27(金) 22:13:46
>>93
いや、あれも参考書読んだり教授に聞いたりしながらグダグダな感じで作ったものです・・・
本当にCに嫌われているみたいで、わからないのが本当にくやしくて・・・
やっぱVBできたぐらいじゃCなんて到底無理なんだなって思いましたw

また最初から参考書読み直して基礎力つけてきます
95デフォルトの名無しさん:2007/07/27(金) 22:38:33
1 2 3
4 5 6
7 8 9

こんなnum.datファイルがあったとして、これを3*3の配列に入れるためには
どうすればいいのですか?

{
int i,j;
int num[3][3];
FILE *fp;
fp = fopen("num.dat","r");

for( i = 0 ; i < 3; i ++ ){
for( j = 0 ; j < 3; j ++ ){
fscanf(fp, "%d",&num[i][j]);
}
}
fclose(fp);
}

教科書見ながらこんなようなことしてみましたが、やっぱり無理でした。
96デフォルトの名無しさん:2007/07/27(金) 23:00:38
>>95
それでいいんじゃね?
ためしに動かしたら、正常に動いたよ。

#include <stdio.h>

main()
{
        int i,j;
        int num[3][3];
        FILE *fp;
        fp = fopen("num.dat","r");

        for( i = 0 ; i < 3; i ++ ){
                for( j = 0 ; j < 3; j ++ ){
                        fscanf(fp, "%d",&num[i][j]);
                }
        }
        printf("%d %d %d\n", num[0][0], num[0][1], num[0][2]);
        printf("%d %d %d\n", num[1][0], num[1][1], num[1][2]);
        printf("%d %d %d\n", num[2][0], num[2][1], num[2][2]);
        fclose(fp);
}
97デフォルトの名無しさん:2007/07/27(金) 23:16:36
なんで>>96は>95を改悪するんだろう……
98デフォルトの名無しさん:2007/07/27(金) 23:19:05
>>97
printf()以外はコピペだけど?
99デフォルトの名無しさん:2007/07/27(金) 23:20:10
入れる場所が悪いって事でしょ。
100デフォルトの名無しさん:2007/07/27(金) 23:23:11
動作確認用の書き捨てコードで、コレを使えってわけじゃないよ。
>>96で動くんだから、>>95 をそのまま使えばいいよ。
101デフォルトの名無しさん:2007/07/27(金) 23:26:19
main()
これはないだろ
102デフォルトの名無しさん:2007/07/27(金) 23:29:08
できればreturn 0も欲しいところだね。
103デフォルトの名無しさん:2007/07/27(金) 23:30:12
できればセミコロンも欲しいところだね。
104デフォルトの名無しさん:2007/07/27(金) 23:31:32
>>101
リターン値がintで引数0だから、それはまったくおかしくない。

>>102
K&Rも、プログラミング言語C++も、最初の説明用のコードはreturn省略。
105デフォルトの名無しさん:2007/07/27(金) 23:37:55
C++ には main の return 0; は省略可能という正式な仕様がある。
106デフォルトの名無しさん:2007/07/27(金) 23:38:37
>>105
Cでも省略可能。
107デフォルトの名無しさん:2007/07/27(金) 23:41:22
C99 ならね・・・。
108デフォルトの名無しさん:2007/07/27(金) 23:42:10
>>104
あれ、C99でも返り値のINTって省略できたっけ?
109デフォルトの名無しさん:2007/07/27(金) 23:42:46
>>107
C99以前でも省略可。
110デフォルトの名無しさん:2007/07/27(金) 23:47:24
>>109
んなわけねー
111デフォルトの名無しさん:2007/07/27(金) 23:48:09
コンパイラの拡張機能に頼ってると、
規格とか分かんなくなるよね。
112デフォルトの名無しさん:2007/07/27(金) 23:48:53
>>109
とりあえずソース希望
113デフォルトの名無しさん:2007/07/27(金) 23:49:44
>>110
省略してるコード見たことないの?
ぱらぱらとめくってみたら、UNIXネットワークプログラミングのサンプルもreturn省略だな。
114デフォルトの名無しさん:2007/07/27(金) 23:50:14
>>110
省略できるよ、0を返すという意味にはならないけど。
115デフォルトの名無しさん:2007/07/27(金) 23:51:24
確かにエラーにはならんね。
116デフォルトの名無しさん:2007/07/27(金) 23:51:52
>>113
その「サンプル」は規格に準拠したものなのか?
説明の便宜上、省いているだけってことは?
117デフォルトの名無しさん:2007/07/27(金) 23:53:16
>>112
たとえば、ここの、11.12
http://www.kouno.jp/home/c_faq/c11.html

> exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない

return省略すると、警告でるコンパイラもあるけど、そいうのはウンコ。
118デフォルトの名無しさん:2007/07/27(金) 23:56:46
>>116
ANSI準拠のK&Rでも、省略してるし、大丈夫なんじゃないの?

>>96 も動作確認用の書き捨てコードだから、省略したんだけど。
119デフォルトの名無しさん:2007/07/27(金) 23:58:22
>>117
>exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない
これって「exit()を呼ぶならreturn は省略できる」って意味だと思うけど
120デフォルトの名無しさん:2007/07/28(土) 00:03:40
>>117
んー?
それmain()をvoidと宣言してる場合じゃん
121デフォルトの名無しさん:2007/07/28(土) 00:10:19
>>119
言われてみたら、回答がへんなような気がするね。
なんで最初に「return入れろ」じゃなくてexit()が着てるんだろ。
まあ、returnは省略を前提にしてるQ&Aに見えるけど。

>>120
質問者がvoidにしたいって言うのを、回答者はまっさきに否定してるじゃん。
その後はmain()を前提にした回答でしょ。
122デフォルトの名無しさん:2007/07/28(土) 00:22:18
>>121
こんな感じ(?)

>main()の戻り値は省略できるか?
>できない。main()はintを戻り値とし、(適切な型の)0個か2個の引数 を持つと定義しなければならない。
main()はintを戻り値として返さなければならない.引数も(ry・・・としなければならない
>exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない
ただし、exit()を呼んだ場合はreturn を省略できるが、それでも警告が出るなら return を記述するしかない
つまり、return (戻り値)を呼ぶか、exit()を呼ぶかであって戻り値を省略できるわけではない

と受け取れる
123デフォルトの名無しさん:2007/07/28(土) 00:27:57
>>122
「exit()を呼んでも*まだ*警告が出る のであれば」
だから、本来はexit()なしでも警告も出ないってことなんじゃない?
で、そのごに「return入れろ」と言ってるということは、exit()もreturnもなしのmain()を
想定した問答なんじゃ?
124デフォルトの名無しさん:2007/07/28(土) 00:38:36
main 関数で return 0; 省略は規格違反。省略した場合の戻り値は未定義。
GCC でいつも -ansi -pedantic -Wall でコンパイルしている俺が言うんだから間違いない。
-std=c99 にすると警告消える。
125デフォルトの名無しさん:2007/07/28(土) 00:39:46
一通りの書き方を妄信する奴はPythonでもやっとけ
126デフォルトの名無しさん:2007/07/28(土) 00:47:03
>>124
リターン値が未定義ってだけで、規格違反ではないよ。
-ansi残して、-Wall消せば警告でないんじゃない?
127デフォルトの名無しさん:2007/07/28(土) 00:50:37
新ANSI C言語辞典で、mainを見ると、返却値が未定義になると書いてあるけど、
その項目のmain()のサンプルは全部return省略してるな。

Cの最小のコードは、main(){ return 0;} じゃなくて main(){}
128デフォルトの名無しさん:2007/07/28(土) 00:55:22
>>126
return の省略とは誰も言ってない。
return 0; の省略と言ってる。
129デフォルトの名無しさん:2007/07/28(土) 00:56:30
>>127
普通のコンパイラを普通に使えば
コンパイラの拡張機能として省略可能にしてあることが多いから
問題が起こることは無いんだろう。
130デフォルトの名無しさん:2007/07/28(土) 01:01:36
>>129
いや、拡張機能じゃないでしょ。
ansi互換のオプションとかでコンパイルできるし。

131デフォルトの名無しさん:2007/07/28(土) 01:04:10
>>129
>コンパイラの拡張機能として省略可能にしてあることが多いから 

どこのコンパイラ?
132デフォルトの名無しさん:2007/07/28(土) 01:34:27
>>96
ありがとうございます。

なぜか自分の方だけはいつまでもできなくて
今まで唸っていたのですが、iとjが同じになっていていました。
133デフォルトの名無しさん:2007/07/28(土) 01:57:05
ていてい!
134デフォルトの名無しさん:2007/07/28(土) 02:16:45
>>127
つまりプログラム自体は未定義でないということでは?
135デフォルトの名無しさん:2007/07/28(土) 08:41:33
>>130
戻り値が 0 になるとは限らないけどな。
136デフォルトの名無しさん:2007/07/28(土) 08:45:55
まとめ

1. main 関数で return を省略する事は可能。しかし、コンパイラによっては警告が出る可能性はある。
2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。
3. C99 や C++ でなら 0 が返る事が保証される。つまり、return 0; の省略は可能である。
137デフォルトの名無しさん:2007/07/28(土) 10:15:13
もう一つ。
関数の戻り値の型はcでは省略可能。その場合、intと仮定される。
main()に関しては、void(=戻り値なし)としている例が散見されるが厳密には処理系依存。
大抵の処理系で許容されているが、その場合コマンドインタプリタへの引渡し値が0になる保障は無い。
138デフォルトの名無しさん:2007/07/28(土) 10:25:02
>>137
C99では、関数宣言で戻り値の型の省略ができなくなったはず。
139デフォルトの名無しさん:2007/07/28(土) 10:27:45
>>138
>cでは
140デフォルトの名無しさん:2007/07/28(土) 10:44:20
C99 が C ではないという口ぶりネ。
そう言いたくなる気持ちは分かるけど。
141デフォルトの名無しさん:2007/07/28(土) 10:50:20
C99なんてCじゃないやい!
とか、余計な方向へ持っていこうとするテスト(って懐かしいなぉぃ)
142デフォルトの名無しさん:2007/07/28(土) 10:58:04
コマンドインタプリタなんて概念は C にはないということもつっこんでいいのかな。
143デフォルトの名無しさん:2007/07/28(土) 12:49:21
>>136
> 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。 

動作が未定義じゃなくて、リターン値が未定義なだけだから、省略は可能。


144デフォルトの名無しさん:2007/07/28(土) 12:51:03
>>143
もっと読解力をつけた方がいい。
145デフォルトの名無しさん:2007/07/28(土) 12:54:21
>>144
>>143の理解でまったく問題ありません。
146デフォルトの名無しさん:2007/07/28(土) 13:02:56
147デフォルトの名無しさん:2007/07/28(土) 13:05:23
>>146
それが何か?
148デフォルトの名無しさん:2007/07/28(土) 13:38:29
>>145
return 0; を期待して return を省略する事はできない、と言ってるんだよ。
149デフォルトの名無しさん:2007/07/28(土) 13:39:53
main が未定義値を返した時の動作が未定義なら、
return を省略する事はできないと言える。
で、どうなんだ?
150デフォルトの名無しさん:2007/07/28(土) 13:55:00
>>148
かなり前から、リターン値は未定という前提で、話は進んでます。

>>149
リターン値は未定義でも、動作は未定義じゃないよ。
151デフォルトの名無しさん:2007/07/28(土) 15:51:08
どうせこうなるんならめんどくても書いたほうがいいと思う初心者だが、
プロはやっぱり出来る限り省略しないといけないぐらい(納期とか)厳しいんだろうか
152デフォルトの名無しさん:2007/07/28(土) 15:54:16
逆だな、普通に書いておくもんだ。
153デフォルトの名無しさん:2007/07/28(土) 16:09:10
return 0;
を書くことで時間が足りなくなることなんてまずないだろw
154デフォルトの名無しさん:2007/07/28(土) 16:37:20
>>150
> 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。

> return 0; を期待して return を省略する事はできない、と言ってるんだよ。
ということ。
リターン値が未定だからこそ、そうなる。
155151:2007/07/28(土) 16:38:56
いやでもほら、プロの悲惨な現場、って感じの読み物とか時々読んで鬱になるわけだけど、
そこで数万行のコードの話とか出るじゃん
チリも積もれば山となるのかなーと

どちらにせよ初心者が省略なんて覚えたらロクなことにならなそうなんでちゃんと書こうと思った
156デフォルトの名無しさん:2007/07/28(土) 16:41:44
ソースコードが何万行もあってもmain関数が何万個もあるわけじゃないだろw
157デフォルトの名無しさん:2007/07/28(土) 16:43:29
いやだって、プログラム単体ならmain()なんて一個しかないわけだし、
複数プログラムを連携させるようなアプリケーションなら戻り値は必要になるし、
どっちにしても省略するメリットなんて無いよ。
#行単価なんてしょうもない契約だったら尚更省略しないだろうし。
158デフォルトの名無しさん:2007/07/28(土) 16:45:26
そういえばmain関数の話だった
俺アホス
159デフォルトの名無しさん:2007/07/28(土) 17:06:30
return 0; なんて1秒もかからんちん
160デフォルトの名無しさん:2007/07/28(土) 18:07:53
return 0 つー、正常終了なら0を返すという決まりは
UNIXLinuxシステムの依存ものだから
exit(EXIT_SUCCESS); を薦めておく
161デフォルトの名無しさん:2007/07/28(土) 18:09:50
EXIT_SUCCESSが0であることも規格で決まってなかったっけ?
162デフォルトの名無しさん:2007/07/28(土) 20:27:13
決まってる。
main 関数の戻り値は 0 は正常終了、1 は異常終了、
その他は処理系定義という形で規定されている。
163デフォルトの名無しさん:2007/07/28(土) 20:37:44
main の戻り値 = プログラムがその呼び出し元にどういう値を返すか ではないからな。

環境依存の部分は main から戻ったあとで処理系が勝手にやってくれる。
164デフォルトの名無しさん:2007/07/28(土) 20:48:04
C99を使えばmainのreturn 0;は省略できるのに。
165デフォルトの名無しさん:2007/07/28(土) 20:57:21
無限ループに突入したところに恐縮ながら質問するぜ

while( !feof(fp) ) {
 fgetc(fp);
 byte++;
}

で何バイトか計算するんだけど、実際より1バイト大きくなるのはなんでだぜ?
と書いてて気付いたが前判定だから最後のインクリメントが一回分余計なのかな?
166デフォルトの名無しさん:2007/07/28(土) 21:08:26
>>165
fgetc(fp); で最後の一文字を読み込んとすると今はEOFの場所にあるわけだが
その状態でfeof(fp)を呼び出してもEOFを検出しない
現在EOFにある状態でfgetc(fp);を呼び出して初めてfeof(fp)は0以外を返す

while( fgetc(fp)!=EOF ) {
 byte++;
}
にすればよいかと
167デフォルトの名無しさん:2007/07/28(土) 21:09:12
>>165
feofはファイルの最後に来たら0返すんじゃなくて
ファイルの最後(EOF)の読み込み終わったら0返すんじゃなかったっけ?
あとfseekとftell使ってないのはループの仮定でなんか処理入れてるから?
168デフォルトの名無しさん:2007/07/28(土) 21:21:53
>>151
仕事のときには書いたほうがいいよ。
>>96みたいなコードに、return省略するなってツッコミ入れるやつって、
単に揚げ足とりたいだけなんだよ。
returnとfclose()の省略はめっちゃ釣れる書き方だな。
べつに釣ろうと思って書いてるわけじゃないけど。
169デフォルトの名無しさん:2007/07/28(土) 21:23:28
>>166-167
なるほど…
うーん難しい
170デフォルトの名無しさん:2007/07/28(土) 21:30:11
>>167
追記
その二つを使っていないのはとても簡単な理由
まだ知らないからだ

開く・閉じる・EOF検知・エラー検知の関数の解説が終わって練習問題にあった
171デフォルトの名無しさん:2007/07/28(土) 21:39:57
ということは、

/* f1の内容をtempにコピー */

while( !feof(f1) ) {
ch = fgetc(f1);
if( !feof(f1) ) fputc(ch, temp);
}

で判定が重複してるのも同じ理由?
ものすごく使いづらい気がするんですが…
172デフォルトの名無しさん:2007/07/28(土) 21:41:46
そもそもファイルの終端を検出するのに
feofはあまり使わない気がするんだが。
普通入出力関数の戻り値で判定できるし。
173デフォルトの名無しさん:2007/07/28(土) 21:44:43
feofなんて知らなかった
174デフォルトの名無しさん:2007/07/28(土) 21:46:41
>>171
こういうふうに書いてみるとか。

while (1) {
  ch = fgetc(f1);
  if (feof(f1))
    break;
  fputc(ch, temp);
}

ループに突入する前にf1のリードが入ってると、>>171と動作がちがっちゃうけど。
175デフォルトの名無しさん:2007/07/28(土) 21:50:44
ちょっと調べてみるとやっぱり他の処理と組み合わせるなら>>165のようにしたほうがいいって書いてあるな…

しかも解答はあくまでコードだけで説明ないからわからん
危うく\(^o^)/オテアゲ

回答者感謝
176デフォルトの名無しさん:2007/07/28(土) 21:53:31
fgetc()は、エラーとファイル終わりでEOFを返すとあるけど、
feof()はferror()と別関数になってるね。
fgetc()がエラーで、EOFを返すような場合、feof()でループの終了判定してると、
無限ループになったりしないのだろうか。
177デフォルトの名無しさん:2007/07/28(土) 22:13:05
しないだろ。
178デフォルトの名無しさん:2007/07/28(土) 22:20:44
でも可能性は低いだろうけど
while(!feof(fp))
{
ch=fgetc(fp);
if(ch!=EOF) fputc(ch,fp);
}
ってコードがあったとして fgetc()がエラーでEOF返し続けるといつまでたっても !feof(fp) が偽にならず
無限ループになるんじゃない?
179デフォルトの名無しさん:2007/07/28(土) 22:23:25
よく見たらアンカおかしかった

>>175
× >>165
○ >>166

おかげでようやく次に進めました
改めて感謝
180デフォルトの名無しさん:2007/07/28(土) 22:28:02
>>177
ためしてみたら、なった。
181名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:01:02
教科書でfgets()を使ってstr[]にテキストファイルから文字を格納する、ってところで

FILE *fp;
char str[80];

fgets(str, 79, fp);

のように79になってるのはなんでだろう

・str[80]は0-80で(ヌル入れて)81字
・fgets()は指定された数-1まで読み込んで最後にヌルと改行文字をつける

だったらfgets()で80を指定すれば
79字まで読み込み→最後にヌルと改行文字→81字
でstr[80]にぴったりだと思うんだけど…

なんか後半に進んでいくにつれて説明がはしょられるようになってわからないところが多くなってきた…
182名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:05:14
>>181
間違いだらけ。
・先ずその糞本を晒せ。
・char str[80]は80要素、つまり0-79しかない。
・fgets()のパラメータは、そのような使い方の場合fgets(str, sizeof(str), fp)とするのが常道。
・マニュアルページを読めば判るように、fgets()はそれで巧くやってくれる。
183名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:05:44
・str[80]は0-79で(ヌル入れて)80字

だったらfgets()で79を指定すれば
79字まで読み込み→最後にヌルと改行文字→80字
でstr[80]にぴったりだと思うんだけど…
184名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:06:38
fgetsの第二引数はターミネータを含めた長さ
規格嫁やボケ
185名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:07:31
>>183
>182をよく読め。
186名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:08:35
その教科書書いた奴が無知だっただけ。
80でおk。
だから80なんて書くなって。
188名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:18:51
教科書がウンコってのはわかるけど、>>181が攻められすぎだろ。
189名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:21:45
自分で調べもせずにぞっき本を盲信してうだうだ言うからだろ
190名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:22:48
すまん、俺が勝手に勘違いして覚えてる可能性が存分にあるので本叩きは待ってくれ
っていうかむしろまず間違いなく俺が原因だ

何をトチ狂ったか

・str[80]は0-80で(ヌル入れて)81字

なんて書いたが、落ち着いて考えてみたら0-79+ヌルで80になるってのは理解してた
暑さとよくわからん解説でダレてボケたとしかいいようがない…

ということは1字ズレるということもなくしっかり収まるのかな?
自分に呆れてしまう…本当に申し訳ない
191名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:27:09
>>190
もういい、一晩寝てから改めてレスをよく読め。
192名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:27:47
>>190
まだまちがっとる。
0-78+NUL(79) で 80だよ。
193181.190:2007/07/29(日) 01:31:04
どうやらもう本格的にダメらしい

落ち着いて考えてきます
恥ずかしすぎる
194181.190:2007/07/29(日) 01:50:55
・[80]は要素の数だからそもそも[0]-[79]までしか存在しない
・文字列の場合さらにヌルが入るから[78]までしか使えない
・だからfgets()で79を指定するのは当然、-1なのも当然

これでいいんだよな…いいんだよな?
結局回答をトレースしただけだけど…
説明不足扱いしてごめんなさい教科書

何を質問したか忘れてしまいたいほどに恥をかいたがこれで今後間違えることはないはず
超くだらない質問にマジレスしてくれて本当にありがとう
195名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:55:32
だから、その教科書がおかしいってみんな言ってるだろ。
196名無しさん@そうだ選挙に行こう:2007/07/29(日) 02:12:11
>>194
・だからfgets()で79を指定するのは当然、-1なのも当然
fgetsの第2引数はナルターミネータを含んだ長さ(即ち80)だと何度言えばわかってくれるんだ
197名無しさん@そうだ選挙に行こう:2007/07/29(日) 02:22:44
>>196
80を指定したら79まで(-1された数まで)文字が入るのはつまりそういうことだよね

ここがみんなの言ってた本の悪いところか…
それすらわかってなかった俺お先真っ暗

ちなみに本は「独習C 第3版」です
この本がやるからにはなにかあると思ったんだけど過信しすぎだったか
198名無しさん@そうだ選挙に行こう:2007/07/29(日) 02:23:01
すみません 質問をしたいのですが
コマンドラインから
「読込ファイル名」「出力ファイル名」を入力し
読込ファイル名は「絶対パス」「相対パス」「ファイル名」の3つを入力をします
「絶対パス」「相対パス」の中で
ディレクトリの読込権限 または
ファイルの読込権限がなかった場合を判定したいです。
access関数の使用をしているのですが
ディレクトリの読込権限をどのように判定すれば良いのか
どなたかご教授あ願い致します。
199名無しさん@そうだ選挙に行こう:2007/07/29(日) 02:53:19
>>198
access()はディレクトリにも使えるよ。
200名無しさん@そうだ選挙に行こう:2007/07/29(日) 03:27:18
>>198
ありがとうございます
ただ僕が悩んでいる所は
if(access(Yname ,R_OK)==0){
printf("読込可能ファイルアクセス権限があります");
}
if(access(Yname ,R_OK)!=0){    //←この部分の判断です
printf(""); //ここのメッセージは2つの可能性があります 
}

2度目の判断文で
ディレクトリでエラーが発生した場合は
「ディレクトリのアクセス権限がありません」と表示し
ファイルが存在したがアクセス権限がなかった場合は
「ファイルのアクセス権限がありません」
と表示したいです

読込エラー発生時に「ディレクトリ」で発生したのか
「ファイル読込」で発生したのかを判断したいのですが
どうにもうまく思いつきません。
もう少しヒントをお願い致します。


201名無しさん@そうだ選挙に行こう:2007/07/29(日) 03:39:39
>>200
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html
ディレクトリかどうかは、statで判定できるよ。
202198:2007/07/29(日) 07:13:13
>>201

ありがとうございます
ただ statを使って2つのエラーメッセージを使い分ける
方法がちょっと見えて来ないんですが
少し詳しくご教授お願い致します。
203名無しさん@そうだ選挙に行こう:2007/07/29(日) 07:18:08
>>202
ディレクトリとファイル名に分割してディレクトリを調べてみるしかないんじゃね?
#つーか、errnoじゃだめなんか?
204名無しさん@そうだ選挙に行こう:2007/07/29(日) 07:36:49
>>202
こんな感じかね。

if(access(Yname ,R_OK)!=0){
    struct stat sb;
    if (stat(Yname, &sb) == 0) {
        if (sb.st_mode & S_IFMT == S_IFDIR)
            puts("ディレクトリのアクセス権限がありません");
        else
            puts("ファイルのアクセス権限がありません");
    }

205名無しさん@そうだ選挙に行こう:2007/07/29(日) 08:35:08
>>203
>>204
ありがとうございます
「ファイル読込に失敗した時に」
「ファイルが存在する場合」 までは理解できたのですが
if (sb.st_mode & S_IFMT == S_IFDIR)
この部分がちょっと自身がないのですがこういった意味なのですか?
「ファイルの種類がディレクトリならば」と言う意味で

絶対パスでこのように指定した場合(erroeがアクセス権限なしのディレクトリ)
[ c:/dir/dir2/error/hoge.txt ]
[ c: ]にアクセス権限があるか?
[ dir ]にアクセス権限があるか?
[ dir2 ]にアクセス権限があるか?
[ error ]にアクセス権限があるか?
を if (sb.st_mode & S_IFMT == S_IFDIR)  の一文で調べ
[ error ]にアクセス権限がなかったため
puts("ディレクトリのアクセス権限がありません");
と表示されると言う事ですか?
206名無しさん@そうだ選挙に行こう:2007/07/29(日) 08:57:52
>>203

後 errno についても調べてみたのですが
機能としては  if(access(Yname ,R_OK)==0) などで
失敗をした場合にどんなエラーが発生をしたかを返す と言う事ですか?
C言語は始めたばかりでerrnoの存在を知らずに居たので
使えるかどうかはちょっと分からないです・・・
207名無しさん@そうだ選挙に行こう:2007/07/29(日) 14:09:38
すみません質問です。
static void test( lpfunc func )
{
(void) func;
}
のように関数のアドレスを受け取り、
代入も何もせずvoidにキャストしているだけ(?)の場合
どういう意味があるのか教えてください。

208名無しさん@そうだ選挙に行こう:2007/07/29(日) 16:48:47
>>207
それだけ見る限り、何の意味もなさそうだ。
func()としていればその関数を呼ぶことになるわけだが。
209207:2007/07/29(日) 17:32:15
>>208 
すみません情報が足りませんでした。

元のソースは以下になります。(nasm091)
static void bin_init (FILE *afp, efunc errfunc, ldfunc ldef)
{
fp = afp;

error = errfunc;
(void) ldef; /* placate optimisers */

start_point = 0; /* default */
textsect.contents = saa_init(1L);
datasect.contents = saa_init(1L);
textsect.length = datasect.length = 0;
textsect.index = seg_alloc();
datasect.index = seg_alloc();
bsslen = 0;
bssindex = seg_alloc();
relocs = NULL;
reloctail = &relocs;
}
210エスパー:2007/07/29(日) 17:39:11
>>209
関数を改良してたらその引数は使わなくなった

でも、よそから使われてるから、いまさらインターフェイス変えられない

残してると、引数が使われてないとコンパイラが警告を出す

無意味に使ってやるか…
211名無しさん@そうだ選挙に行こう:2007/07/29(日) 17:46:01
placate optimisers って書いてあるから、コンパイラが出す「変数つかってねーぞ」っていう
ワーニングを抑制するための参照だろう。
212名無しさん@そうだ選挙に行こう:2007/07/29(日) 17:48:32
リロード(T=T)
213名無しさん@そうだ選挙に行こう:2007/07/29(日) 17:51:41
質問なのですが。
構造体の中の構造体の中にポインタの構造体を宣言しているのですが、
最下層であるポインタの構造体のメンバを出力させてたいのですが、..->ではないのでしょうか?
これだと何故かエラーになり...で出力できます。
214デフォルトの名無しさん:2007/07/29(日) 17:55:33
何言ってるか分からんが、言ってる通りなら -> だ
とりあえずソース貼れ
215207:2007/07/29(日) 17:55:35
>>210
>>211
よく分かりました。ありがとうございます。

216名無しさん@そうだ選挙に行こう:2007/07/29(日) 19:06:35
struct C{
int num5;
char str6;
char str7[20];
};

struct B{
int num3;
int num4;
srtuct C *c;
}

struct A {
int num1;
int num2;
struct B b;
}

これでC構造体のメンバを全て出力させてさせたいのですが、..−>では
エラーになり...でstr7などが何故か出力されます。
217名無しさん@そうだ選挙に行こう:2007/07/29(日) 20:04:58
何がいいたいのかわからんが

A a;
a.b.c->num5;
a.b.c->str6;
a.b.c->str7;

でよくね
218198:2007/07/29(日) 20:34:19
アロー演算子で出力出来なくて
ドット演算子で出力できる理由をしりたいのかな?

219デフォルトの名無しさん:2007/07/29(日) 21:31:52
構造体からはドット演算子、構造体のポインタからはアロー演算子。
220デフォルトの名無しさん:2007/07/29(日) 22:06:57
ご丁寧に有難う御座います、しかし、...で出力されてアローがエラーになる理由がわかりません。
218さんわかりますでしょうか?
221デフォルトの名無しさん:2007/07/29(日) 22:12:33
再現する最低限の、確実にコンパイルできるソースを晒せ。
222デフォルトの名無しさん:2007/07/29(日) 22:31:36
>>53->>56
回答求む
223デフォルトの名無しさん:2007/07/29(日) 22:34:23
宿題スレ行け
224デフォルトの名無しさん:2007/07/29(日) 22:34:51
>>220
なりません。
だからとっととソースを晒せと
225デフォルトの名無しさん:2007/07/29(日) 22:50:36
質問です。
4元1次連立方程式のデータはcとcheckの2つの配列に入力されますが、何故でしょうか?
また、1つの配列に入力して済ませる方法はありますか?宜しくお願いします。

void inputdata(double c[4][5],double check[4][5])
int ie ,ic;
226デフォルトの名無しさん:2007/07/29(日) 22:55:01
>>225
その質問に答えられるってどんなエスパーですかw
227デフォルトの名無しさん:2007/07/29(日) 22:58:25
4元1次連立方程式ってなに?
調べるのめんどいからおせーて
228デフォルトの名無しさん:2007/07/29(日) 23:04:38 0
>>225
そんなんで分かるわけねーだろwww
229225:2007/07/29(日) 23:09:32 0
>>226
ゴメンなさいww何処まで書けばいいのやらで(汗

>>227
変数が四つ入ってる式のこと・・・だと思います。
例として・・・w+x+y+z=20 3w+x+y+5z=18 (w,x,y,zは全て変数)
230デフォルトの名無しさん:2007/07/29(日) 23:15:55 0
>>229
さぼらずに全部書け
ソースも書け
問題も書け
環境も書け
出題基も書け
何もかも書け
全て書け
とにかく書け
231225:2007/07/29(日) 23:23:15 0
以下、プログラムです。長くて申し訳ありません。
#include<stdio.h>
#include<math.h>
void inputdata (double [4][5],double [4][5]);
void calsol (double [4][5],double [4]);
void elimination (double [4][5],double [4][5]);
void pivot (int *,double [4][5],int *);
void outputdata (double[4]);
void checksol (double [4][5],double[4]);
main(){
double c[4][5],check[4][5],x[4];
inputdata(c,check);
calsol(c,x);
outputdata(x);
checksol(check,x);
return (0);
}
void inputdata(double c[4][5],double check[4][5]){
int ie ,ic;
printf("-----\n");
printf("Input Data\n");
printf("(a0*x0 + a1*x1 + a2*x2 + a3*x3 = a4)\n");
printf("\n");
for(ie=0;ie<=3;ie++){
printf("Equation %d\n",ie);
printf("Input a0 a1 a2 a3 a4\n");
for(ic=0;ic<=4;ic++){
scanf("%lf",&c[ie][ic]);
check[ie][ic] = c[ie][ic];
}
}
}
232225:2007/07/29(日) 23:24:58 0
続きです。
void calsol(double c[4][5],double x[4]){
double cc[4][5];
elimination(c,cc);
x[3]=cc[3][4];
x[2]=cc[2][4]-cc[2][3]*x[3];
x[1]=cc[1][4]-cc[1][3]*x[3]-cc[1][2]*x[2];
x[0]=cc[0][4]-cc[0][3]*x[3]-cc[0][2]*x[2]-cc[0][1]*x[1];
}
void elimination(double c[4][5],double cc[4][5]){
int ie,ic,ienew,imax,eli;
eli=0;
while(eli<4){
pivot (&eli,c,&imax);
cc[eli][eli]=1;
for(ie=eli+1;ie<=4;ie++){
cc[eli][ie]=c[imax][ie]/c[imax][eli];
}
ienew = 0;
for(ic=0;ic<=3-eli;ic++){
if(ie != imax){
for(ie=eli+1;ie<=4;ie++){
c[ienew][ie] = c[ic][ie]-cc[eli][ie]*c[ic][eli];
}
ienew = ienew + 1;
}
}
eli =eli + 1;
}
}
233デフォルトの名無しさん:2007/07/29(日) 23:29:03 0
>>225
>4元1次連立方程式のデータはcとcheckの2つの配列に入力されますが、何故でしょうか?

片方は、答えだした後、チェック用に使ってるだけじゃん
何が聞きたいのかよく分からんのだが…
234デフォルトの名無しさん:2007/07/29(日) 23:31:29 0
チェック用に使っている事を理解できなかったから質問したのでは?
235225:2007/07/29(日) 23:44:36 0
>>233
返信ありがとうございます。
検算用に使っているだけ、ということですか。わかりました。
検算の他に理由があるのかが分からなかったので質問させて頂きました。

これら二つをまとめてプログラムすることは可能でしょうか。
236デフォルトの名無しさん:2007/07/29(日) 23:52:54 0
1つの配列でどうやって検算するんだよ
237198:2007/07/29(日) 23:55:19 0
>>198です
ディレクトリのアクセス権限ですが以下の方法でやってみました
レビューをお願い致します。
絶対パスで[c:/dir1/dir2/yomikomi.txt]まで入力します。
ファイルの権限とディレクトリの権限を調べるにはこれで問題ないでしょうか?
お願い致します。

main(int argc , char *argv[]){
char *Yname = argv[1] , *Sagyou = argv[1];
struct stat sb, struct stat sa;
int Loop , LenYname = strlen(Yname);

for(Loop = LenYname ; Loop >= 0 ; Loop--){
if(Sagyou[Loop] == '/'){
Sagyou[Loop] = '\0';
break;
}
}
if(stat(Sagyou , &sa) == 0){
if(access(Sagyou , 04 /*R_OK*/)!=0)
puts("ディレクトリのアクセス権限がない");
}
if(stat(Yname, &sb) == 0) {
if(access(Yname , 04 /*R_OK*/)==0)
puts("ファイルのアクセス権限がある");
if(access(Yname ,04/*R_OK*/)!=0)
puts("ファイルのアクセス権限がない");
}
}
</pre>
238デフォルトの名無しさん:2007/07/30(月) 00:09:22
>>237
・YnameとSagyouが共にargv[1]を指してしまうので、Sagyou[Loop]に書き込むことでYnameとしても同様に短くなってしまう。
・できればargv[1]からのエリアはは書き変えないほうがいい。
・strcpy()やstrrchr()を使え。
・ディレクトリ区切りにバックスラッシュを使われたらどうするんだ?
239デフォルトの名無しさん:2007/07/30(月) 00:36:52
>>238
ありがとうございます
質問ですが
Yname と Sagyouはポインタを使わず配列を
使ったほうが良いという事ですか?
240デフォルトの名無しさん:2007/07/30(月) 01:30:47
んだね。
241デフォルトの名無しさん:2007/07/31(火) 09:07:47
#include<pic.h>
#include"delay.h"
main() {
unsigned short i=0;
unsigned short d[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
__CONFIG(XT & WDTDIS & PWRTEN & UNPROTECT);
__IDLOC(0100);

TRISA = 0x00;
TRISB = 0x00;
PORTA = 0x01;
PORTB = 0x00;

while(1){
if(RA3==1){DelayMs(500);}
if(RA3==1){i++;}
if(RA4==1){DelayMs(500);}
if(RA4==1){i--;}

PORTB=d[i];
if(i==10){
i=0;}
if(i=-1){
i=9;
}}}
242241:2007/07/31(火) 09:18:24
7セグLEDを光らすプログラムを作っていて、スイッチRA3を押すと+1、RA4を押すと-1で,
0123456789012...とループするプログラム作ろうとしているのですが、
一番最後にループするために代入する式を入れてからなんか動きがおかしくなりはじめました。
どうすれば直るでしょうか?
243デフォルトの名無しさん:2007/07/31(火) 09:21:05
>>242
if(i=-1)
244デフォルトの名無しさん:2007/07/31(火) 09:43:05
だから条件式はリテラルを先に置けとあれほど
245デフォルトの名無しさん:2007/07/31(火) 10:15:50
そんな気持ち悪い書きかたを人に強制するな
246デフォルトの名無しさん:2007/07/31(火) 10:45:44
コンパイル通らなくなって原因が分りやすいってのは利点なんだろうけど、どうにも受け付けない。

しょっちゅうそんなミスするわけでもないし、ミスっても大概のコンパイラで警告出るだろ。
247デフォルトの名無しさん:2007/07/31(火) 11:04:18
書いた人間がちゃんと警告を出せるコンパイラでチェックする手間と、
読む人間(書いた当人の数ヵ月後も含む)が毎回混乱する無駄を考えればどちらがいいかは一目瞭然。
248デフォルトの名無しさん:2007/07/31(火) 11:09:00
最近の人間はlintとか使わんわけ?
249デフォルトの名無しさん:2007/07/31(火) 11:12:09
そんなミスが頻発し、すぐに対応できずに混乱しちゃうようなら必須なのかもね。
250デフォルトの名無しさん:2007/07/31(火) 11:13:54
お前らんとこには優秀なコーダーが揃ってるんだな…
251デフォルトの名無しさん:2007/07/31(火) 11:49:52
= にしたら大抵警告が出るのに、リテラル前に書くメリットは皆無。
252デフォルトの名無しさん:2007/07/31(火) 14:49:23
while (num = fread(buf, size, max, fs)) {}
って書く時に警告でたらうっとおしくない?

リテラルは前に書くことはないけど
253デフォルトの名無しさん:2007/07/31(火) 14:52:43
>>250
俺を雇ってみる?
32歳実務経験なしだけど
254デフォルトの名無しさん:2007/07/31(火) 14:54:24
まあリテラルを前に書く習慣をつけるほど注意深い人は、
=と間違うミスはまずしないし、すぐ気がつくだろうという矛盾が
255デフォルトの名無しさん:2007/07/31(火) 14:56:12
>>252
while ((num = fread(buf, size, max, fs))) {}
256デフォルトの名無しさん:2007/07/31(火) 15:23:46
カッコがちょっとうっとおしいな

会社で演算子の優先度が分かりにくいから
条件式に全部カッコつけろって言われた
一般的にはそうなの?
257デフォルトの名無しさん:2007/07/31(火) 15:43:53
まぁ、論理演算子や関係演算子、ビットシフト演算子は括るのが多いかな。
258デフォルトの名無しさん:2007/07/31(火) 15:45:20
しまった、代入演算子もだ。
259デフォルトの名無しさん:2007/07/31(火) 16:05:47
ちょっとでも他人が迷いそうなやつはつけてる
優先順位表さっと見られる状態に無い場合もあるしな
260デフォルトの名無しさん:2007/07/31(火) 16:12:24
((A == B) && (C ==D)) || (E == F)

みたいな感じか?
流石に鬱陶しいから、俺ならこう書くけど。

(A == B && C == D) || E == F

このカッコは動作に影響はないけど書く。
261デフォルトの名無しさん:2007/07/31(火) 17:38:21
#include <stdio.h>

void func(int* num1, int* num2)
{
*num1+=1;
*num2++;
}

int main(void)
{
int num1=0;
int num2=0;

func(&num1, &num2);
printf("%d %d\n", num1, num2);

return 0;
}

なんでこのプログラムの実行結果はこうなりますか
262デフォルトの名無しさん:2007/07/31(火) 17:45:55
どうなるんだよ
263デフォルトの名無しさん:2007/07/31(火) 17:45:57
こうすれば期待通りかな?
(*num2)++;
264デフォルトの名無しさん:2007/07/31(火) 17:50:09
優先順位の話してるときに優先順位の質問が来たw
265デフォルトの名無しさん:2007/07/31(火) 19:53:07
>>263
なんでなんで?括弧がない場合は何がどうなってるの?
266デフォルトの名無しさん:2007/07/31(火) 20:17:12
*num2++と書くと演算子の優先順位から*(num2++)ということになる。

num2++;という式文は次のように書くのと同等。
num2 = &num2[1];
ポインタに対する増分演算子は、次の要素へ進むことを意味し、
普通は配列を指すポインタでないと使い道がない。

ようするに*num2++ではポインタ型の変数そのものの値を書き換えているが、
ポインタが指す値は読み取るだけで、書き換えてはいない。
267デフォルトの名無しさん:2007/07/31(火) 20:45:18
じゃあ括弧がない場合のprintfはnum2[1]の値が表示されるますか、あたまがこんがらがっちゃっちゃ
268デフォルトの名無しさん:2007/07/31(火) 20:50:11
いや、それはない。

func内のnum2とmain内のnum2は別の変数。
func内でnum2自身の値をいくら書き換えようとも、呼出元のmainへは反映されない。
下のプログラムで0と出力されるのと同じ理屈。
void f(int x)
{
  x = 7;
}

void g()
{
  int i = 0;
  f(i);
  printf("%d\n", i);
}
269デフォルトの名無しさん:2007/07/31(火) 20:57:10
*num2++;



*num2;
num2++;

と同じようなもんだと考えれば。
270デフォルトの名無しさん:2007/07/31(火) 20:58:39
入出力で「1文字」って場合、1バイト分を指すの?
271デフォルトの名無しさん:2007/07/31(火) 21:00:04
文脈による
272241:2007/07/31(火) 21:13:26
>>243
サンクス。やってみます。
273デフォルトの名無しさん:2007/07/31(火) 22:29:54
>>266>>268
簡潔かつ分かりやすい説明ありがとうございました。
なるほど。
274デフォルトの名無しさん:2007/07/31(火) 23:18:39
>>272
???
275デフォルトの名無しさん:2007/08/01(水) 00:00:20
質問
001 C言語によるプログラムの一般的な作成手順を述べよ。
002 C言語のプログラムのソースファイルの拡張子は何か。
003 ソースファイルからオブジェクトファイルを作ることを何というか。
004 オブジェクトファイルから実行ファイルを作ることを何というか。
005 講義で使ったコンパイラの名前を答えよ。
006 UNIX(LINUX)では実行ファイルの名前はどのようになるか。
007 デバッグとは何か。
008 C言語でプログラムに使う文字はどういうものか。
009 C言語の標準規格はどう呼ばれるか。
010 もっとも短い実行できるC言語のソースを書け。
011 main関数とは何か。
012 main関数の型は何か。
013 main関数の戻り値はどうなるか。
014 グローバル(大域)変数とローカル(局所)変数の違いを答えよ。
015 静的変数はどういうときに使われるか。
016 変数の基本データ型をいくつか答えよ。
017 初期値が1である整数変数iの宣言は。
018 変数のアドレスとは何か。
019 変数のアドレスを知るにはどうするか。
020 講義で使ったシステムの整数の範囲を答えよ。
021 配列(変数)とは何か。
022 100個宣言した配列(変数)の添え字の範囲は。
276デフォルトの名無しさん:2007/08/01(水) 00:02:02
023 配列(変数)の初期値はどのように設定するか。
024 2次元配列はどのように宣言するか。
025 2次元配列はどのように並んでいるか。
026 構造体とは何か。
027 typedefとstructの役割はどう違うか。
028 #includeとは何か。
029 #include <stdio.h>の<>の意味は。
030 ヘッダファイルとは何か。
031 ヘッダファイルの拡張子は何か。
032 コメントとは何か。
033 コメントをソースに記入するのにはどうするか。
034 代入i=1の式としての値は何になるか。
035 整数変数iを1増やすのにどういう方法があるか。
036 printf関数は何をする関数か。
037 printf関数のfの由来は。
038 printf関数で改行させたいときには何を使うか。
039 printf関数で文字配列sの文字列を表示させたいときにはどう書くか。
040 整数変数iの値が1のときprintf("%d",--i);printf("%d",i++);でどういう表示がされるか。
041 整数変数dにscanf関数で整数をキーボード入力させる文を書け。
042 文字配列にscanf関数でキーボード入力するとき気をつけるべきことは。
043 文字リテラル'A'の整数としての値は。
044 'c'-'C'の値はいくらになるか。
277デフォルトの名無しさん:2007/08/01(水) 00:03:22
045 文字の種類を判別するときにインクルードするヘッダファイルの名前は。
046 文字列と'\0'の関係は。
047 strcmp関数を使うときにインクルードするヘッダファイルの名前は。
048 文字列の長さを知るために使う関数は。
049 1*2+3の値はいくらになるか。
050 10%(-3)の値はいくらになるか。
051 ビット演算子の例をあげよ。
052 27&15の値はいくらになるか。
053 27|15の値はいくらになるか。
054 31>>2の値はいくらになるか。
055 int i,j;と宣言されているとき、&i-&jの絶対値はいくらか。
056 整数変数aの値が12から19までのときだけ「TEEN」の4文字を表示する文を書け。
057 (i>=0)?i:(-i)は何をする式か。
058 NULLとは何か。
059 for(i=0;i<10;i++)printf("!");という文では感嘆符は何回表示されるか。
060 for(i=10;i>-10;--i)if(i)printf("o");ではoは何文字表示されるか。
061 i=10;while(i){printf("+");--i;}では+は何文字表示されるか。
062 breakはfor,do,whileではどのような意味があるか。
063 continueはfor,do,whileではどのような意味があるか。
064 switch文ではcaseの最後にbreak文が必要なのはなぜか。
065 switch文でdefault:はどういう意味を持つか。
066 if(i==0){}else{printf("A");}を出来るだけ簡単に書き直せ。
067 関数のプロトタイプ宣言はなぜ必要か。
068 関数の値を返すのに使う予約語は。
069 ファイルを扱うときにインクルードするヘッダファイルの名前は。
070 ファイルを扱うときに使う構造体の型の名前は。
278デフォルトの名無しさん:2007/08/01(水) 00:03:30
279デフォルトの名無しさん:2007/08/01(水) 00:04:26
071 fopen関数の戻り値は何か。
072 fopen関数が実行に失敗するとどうなるか。
073 fprintf関数とprintf関数の引数の違いは。
074 fscanf関数で1行読み込むときの注意は。
075 getc関数はどのような引数と戻り値を持つ関数か。
076 EOFとは何か。
077 cが整数変数、fpが正しい状態でwhile(EOF!=(c=getc(fp)))printf("%c",c);を実行すると結果は。
078 fflush関数は何をする関数か。
079 fclose関数が実行に失敗するとどうなるか。
080 標準入力とは何か。
081 標準出力とは何か。
082 ファイル入出力でどのようなエラーが考えられるか。
083 マルチタスク環境でファイルをロックするとはどういうことか。
084 rand関数を扱うときにインクルードするヘッダファイルの名前は。
085 rand関数の返す整数の値はどのような名前で呼ばれるか。
086 擬似乱数のシードとは何か。
087 srand関数はrand関数とどのような関係にあるか。
088 32ビットのint型は10進数で何桁の精度になるか。
280デフォルトの名無しさん:2007/08/01(水) 00:05:43
089 float型は十進数でほぼ何桁の精度になるか。
090 double型は十進数でほぼ何桁の精度になるか。
091 プログラムの処理の手順を一般に何と呼ぶか。
092 自分自身を呼び出すプログラムの手法を何というか。
093 キュー(待ち行列)とはどのようなものか。
094 スタックとはどのようなものか。
095 オーバーフローとは何か。
096 アンダーフローとは何か。
097 いわゆるセグメンテーションフォルトで中断した後にできるファイルを一般に何というか。
098 C言語を作ったのは誰か。
099 C言語の祖先に当たるプログラム言語は。
100 C言語はどういう種類のプログラム言語か。
281デフォルトの名無しさん:2007/08/01(水) 00:07:06
>>53-56 を読んだら氏ね
282デフォルトの名無しさん:2007/08/01(水) 00:09:33
読みましたよ。同じですね。答え教えて。
283デフォルトの名無しさん:2007/08/01(水) 00:12:40
>>282
100回ググれ。全ての答えはそこにある。
284デフォルトの名無しさん:2007/08/01(水) 00:13:14
何しに来たの?
死ねよマジで
285デフォルトの名無しさん:2007/08/01(水) 00:20:20
なにしにって答え聞きに。
286デフォルトの名無しさん:2007/08/01(水) 00:21:54
殺伐中のところお邪魔しますよ

問題:指定したテキストを、タブをスペースに置き換えて別ファイルとしてコピーする

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

int main(int argc, char *argv[])
{
FILE *from, *to;
char ch;
int tab, count=0;

if(argc!=3) {
printf("<test> <コピー元> <コピー先>\n");
exit(1);
}

if( (from=fopen(argv[1], "r")) ==NULL) {
printf("コピー元ファイル %s が開けません。" , argv[1]);
exit(1);
}

if( (to=fopen(argv[2], "w")) ==NULL) {
printf("コピー先ファイル %s が開けません。" , argv[2]);
exit(1);
}
287デフォルトの名無しさん:2007/08/01(水) 00:23:58

while(!feof(from)) {
ch = fgetc(from);
if(ch=='\t') {
for(tab=count; tab<8; tab++)
fputc(' ' , to);
count=0;
}
else {
if(!feof(from)) fputc(ch, to);
count++;                 //※
if(count==8 || ch=='\n') count=0;  //※
}
}
fclose(from);
fclose(to);

return 0;
}

/* ここまで */

※の部分は何のために何の処理をしているんだろう
288デフォルトの名無しさん:2007/08/01(水) 00:25:39
>>285
学校(がっこう)の先生(せんせい)か、パパやママにきいてみよう!
289デフォルトの名無しさん:2007/08/01(水) 00:26:54
先生は教えてくれない。親は使えない
290286-287:2007/08/01(水) 00:27:22
見づらくなってしまった…すいません
あと、
tab<8

count==8
の8は何の数なんだろう
291デフォルトの名無しさん:2007/08/01(水) 00:34:48
>>290
実行して確認するとかしてみたのか?
「8」はタブ文字を8個のスペースにしてるだけだ。
for文の前後3行を読むだけでわかる。
292デフォルトの名無しさん:2007/08/01(水) 00:36:33
>>291
ということは別に8である必要はないのかな
293デフォルトの名無しさん:2007/08/01(水) 00:38:31
Windowsならデフォルトは8じゃないか?Linuxとかは知らん。
デフォルトって言葉が正しいかどうかは知らんが、メモ帳とかはそうだよな。
ってか、8が何かわからんかったら10にして実行してみろ。
294デフォルトの名無しさん:2007/08/01(水) 00:47:45
なるほど
サントス
295デフォルトの名無しさん:2007/08/01(水) 00:55:01
俺のはシカト?
296デフォルトの名無しさん:2007/08/01(水) 01:08:45
おーい
297デフォルトの名無しさん:2007/08/01(水) 01:46:27
#include <stdio.h>
main()
{
static int a[][3] = {{001, 010, 100}, {002, 020, 200}, {003, 030, 300}};

int i, j;

for (i=0; i<3; i++) {
for (j=0; j<3; j++) {
printf("%d\t", a[i][j]);
}
putchar('\n');
}
}

このプログラムの実行結果が下のなんですがなぜそうなるかわかりません。
教えてください。

1 8 100
2 16 200
3 24 300
298デフォルトの名無しさん:2007/08/01(水) 01:50:11
頭に0がついてると八進数になるから
299デフォルトの名無しさん:2007/08/01(水) 01:50:36
0から始る場合8進数になるから
300デフォルトの名無しさん:2007/08/01(水) 01:51:10
>>297
>{{001, 010, 100}, {002, 020, 200}, {003, 030, 300}}
これは0で始まってるから8進法で書かれてる
んでprintfでの出力は10進法になってる
301デフォルトの名無しさん:2007/08/01(水) 01:51:16
#include <stdio.h>
main()
{
static char input[] = "B1LSWIELTECH1\1\11W\1EE1ELLST?";
int i, c;

for (i=0; (c=input[i]) != '\0'; i++) {
switch(c) {
case 'B' : putchar('A'); continue;
case '1' : break;
case 1 : while ((c=input[++i]) != '\1' && c != '\0');
case 9 : putchar('T');
case 'E' : case 'L' : continue;
default : putchar(c); continue;
}
putchar(' ');
}
putchar('\n');
}

実行結果 A SWITCH T ST?
A SWITCHから先の動きがわかりません。わかる方教えてください。
302デフォルトの名無しさん:2007/08/01(水) 01:53:39
ってちょっと言い方がまずかったな
>{001, 010, 100}
たとえばこの部分の001と010が8進法で100は10進法ね
303デフォルトの名無しさん:2007/08/01(水) 01:54:26
#include <stdio.h>
char input[] = "SSSWILTECH1\1\11W\1WALLMP1";

main()
{
int i, c;

for (i=2; (c=input[i]) != '\0'; i++) {
switch(c) {
case 'a' : putchar('i'); continue;
case '1' : break;
case 1 : while ((c=input[++i]) != '\1' && c != '\0');
case 9 : putchar('S');
case 'E' : case 'L' : continue;
default : putchar(c); continue;
}
putchar(' ');
}
putchar('\n');
}

実行結果 SWITCH SWAMP
同じ感じなんですが、SWITCHから先の動きがわかりません。お願いします。
304297:2007/08/01(水) 02:00:39
ありがとうございます
解決しました
305デフォルトの名無しさん:2007/08/01(水) 02:01:36
while ((c=input[++i]) != '\1' && c != '\0');
ここで条件が真の間、iが+1ずつされていく。
whileをぬけたらbreakが無いので次のputschar('T')が実行されて・・・
って感じだ。
デバッガあるならステップ実行してみればわかる。
なければwhileを弄れば多少わかる?
while ((c=input[++i]) != '\1' && c != '\0')puts("[while中]");
306デフォルトの名無しさん:2007/08/01(水) 03:28:00
自分で考えるための方法を教える必要があるような状況だな。
307デフォルトの名無しさん:2007/08/01(水) 11:32:27
リンカする前の実行ファイルを起動すると一瞬で消えるんだが何故でしょうか?
308デフォルトの名無しさん:2007/08/01(水) 11:45:28
>>307
「リンカする」なんてことは通常できません。
リンクする前なら、それは実行ファイルになっていない筈です。
リンクされた実行ファイルについてなら、GUIを持たないプログラムを
GUIからダブルクリックで起動したら終了と同時に表示が消えるのは自明ですね。
309デフォルトの名無しさん:2007/08/01(水) 11:50:37
Ctrl-F5で解決する例のあれか
310デフォルトの名無しさん:2007/08/01(水) 12:29:44
昨日のお子様哀れすぎワロタ
311初心者:2007/08/01(水) 15:14:36
構造体の数値データからcsv形式のファイルを作りたいのですが、どうすればいいでしょうか。教えていただけるとありがたいです。
312デフォルトの名無しさん:2007/08/01(水) 15:24:33
構造体のメンバをcsv形式でファイルに書き込め
313デフォルトの名無しさん:2007/08/01(水) 15:56:39
C++なら簡単に出来るからC++スレで質問するといいよ^^
314デフォルトの名無しさん:2007/08/01(水) 15:58:15
まだ全然初歩のプログラムなのですが、わからないので教えてください。
プログラムファイル
入力データファイル
が用意されている。
問題
 文字データ中に含まれる文字の種類を調べるプログラムを作成しなさい。
[仕様]
・入力データ件数10件
  1件に最大100文字(半角とする)
  入力データは、文字型1次元配列(サイズ:101)に格納

・文字の種類は最大200種(文字型1次元配列使用)
 ただし、入力した文字中の改行(’¥n’)マークは処理対象外 とする

・文字コード順に並べ替えを行い出力する
・出力設計
 1行に最大25文字(文字区切りに1カラム空白)
 構成文字(並べ替え済み)を出力する

 X X X X X X X〜〜X X X X X X X
315デフォルトの名無しさん:2007/08/01(水) 16:08:34
>>314
自分がどこまでできてて、どこがわからないのか明確に
丸投げなら宿題スレに

C/C++の宿題を片付けます 94代目
http://pc11.2ch.net/test/read.cgi/tech/1185452895/
316デフォルトの名無しさん:2007/08/01(水) 17:11:26
プログラムは既に出来てるように思えた
317デフォルトの名無しさん:2007/08/01(水) 18:41:55
>>314
です。入力データ、文字種を入力するところまではわかるのですが、どういう処理をすれば入力データに文字データが含まれているのか、また、そのデータを文字コード順に並べる処理がわからないです。アルゴリズムが浮かばなくて悩んでいます。お願いします。
318デフォルトの名無しさん:2007/08/01(水) 18:47:33
文字の種類が200種なんだから、int の配列[200]を用意して
文字種ごとに足していけばよかろう。
まあ文字種そのものは256個あるから[256]作ったほうが楽ではあるが。
319デフォルトの名無しさん:2007/08/01(水) 19:18:22
ちょっと今感動してる・・。
一ヶ月前の自分には解らなかった事が解るようになってる。
ニマニマしちゃうよ。
320デフォルトの名無しさん:2007/08/01(水) 23:36:44
>>318
回答ありがとうございます。文字種類の配列を用意するのは理解できました。もし
int i,n
char moji[100],shu[200]で入力しおえて
文字種ごとに足していくにはどのように書けばよいのでしょうかか?
321デフォルトの名無しさん:2007/08/02(木) 00:03:16
>>320
char shu[256]={0}
としたうえで

for(i=0;i<100;i++) {
shu[moji[i]]++;
}
322デフォルトの名無しさん:2007/08/02(木) 00:25:13
>>321
素早い回答ありがとうございます。その文字種に含まれた文字はどのようにしたら文字コード順に並び替えられるのですか?
323デフォルトの名無しさん:2007/08/02(木) 00:28:42
>>322
ちょっと根本的に分かってないみたいだけど
文字コードがインデックスになってるから

for(i < 256) {
for(j = 0 ; j < shu[i] ; j++){
putchar i
}
}

でおk
324デフォルトの名無しさん:2007/08/02(木) 06:46:03
分布数えソートだな。
325デフォルトの名無しさん:2007/08/02(木) 08:05:01
>>323
全然理解してなくて申し訳ないです。
回答ありがとうがざいました。これからプログラム書いてみようと思います。
326デフォルトの名無しさん:2007/08/02(木) 09:39:43
プログラムファイルは用意されてたんじゃなかったのかよw
sageは半角でな
327デフォルトの名無しさん:2007/08/02(木) 09:45:47
分布数えソート大好き
328デフォルトの名無しさん:2007/08/02(木) 09:59:24
分布数えソートはもっと巧妙だけどな
アイディアは同じ
329デフォルトの名無しさん:2007/08/02(木) 10:08:09
Linux環境で半角の円マーク(\)打つのってどうやればいい?
330デフォルトの名無しさん:2007/08/02(木) 10:08:49
英字キーボードで、と言った方が良かったかも
331デフォルトの名無しさん:2007/08/02(木) 10:17:11
バックスラッシュと円マークの文字コードは
ASCII コードの範囲内でなら同一。
あとはフォントの問題。

どうしても混在させたいなら、ユニコードで何とかするしかない。
00A5 が円マークだ。
もちろん、エスケープ記号としては使えんがな。
332デフォルトの名無しさん:2007/08/02(木) 13:38:15
Linuxでの最長パス名なのですが、#defineされているものに
MAX_PATH とか MAXPATHLEN とかありますが
どれを#includeしてどの#defineを使うのが一般的なのでしょうか。
なんかいろいろあってわからなくなった。
教えて下さい。
333デフォルトの名無しさん:2007/08/02(木) 17:08:43
Linuxは知らないが、標準Cには<stdio.h>にFILENAME_MAXという定数がある。
334デフォルトの名無しさん:2007/08/03(金) 00:02:15
int a[3][4];
int b[4];

と宣言した際に

a[0] = b;

がNGなんですか?

C言語の2次元配列は配列の配列と習ったんで
aのゼロ番目に大きさ4の配列を入れれると思ったんです。

335デフォルトの名無しさん:2007/08/03(金) 00:07:29
配列の配列と2次元配列は別物だよ
336デフォルトの名無しさん:2007/08/03(金) 00:17:43
というか、int a[3], b[3];だったとしても、
a = b; みたいな代入はできない。
337デフォルトの名無しさん:2007/08/03(金) 00:21:15
>>336みたいなのが何で出来ないんですか?って質問されたら
言語仕様です。としかいえないよな。
それでもなんで?って聞いてきたら教えるのをあきらめる。
338デフォルトの名無しさん:2007/08/03(金) 00:30:31
Cを作った人や、後にコンパイラを実装した人達が
できなくてよいという判断を下したから。
339デフォルトの名無しさん:2007/08/03(金) 00:47:16
配列の代入はできません。
340デフォルトの名無しさん:2007/08/03(金) 01:01:38
>>335
規格票では全く同一のものとなっていますが何か?
341デフォルトの名無しさん:2007/08/03(金) 01:08:11
配列の配列
配列へのポインタ
ポインタの配列

などの細かなこと知らなくても問題ないよ
342デフォルトの名無しさん:2007/08/03(金) 01:09:38
いや、それは問題ある。
343デフォルトの名無しさん:2007/08/03(金) 01:17:23
構文上は配列の配列と思っておくと都合がいいけど、
Cでは配列の配列とは別に2次元配列が存在するわけでもないので、
少なくともCでは両者の言葉が区別されることなく使われている。

こう言えばいいか?
344デフォルトの名無しさん:2007/08/03(金) 01:21:08
>>342
ないよ

そんな細かなこと知っててもなんの役にもたたん
345デフォルトの名無しさん:2007/08/03(金) 01:24:34
int (*a)[10];

って大きさが10のintの配列へのポインタですよね

これの配列(大きさ20)はどう宣言すればいいのですか?
346デフォルトの名無しさん:2007/08/03(金) 01:26:09
そんなの自分で考えろよ

int (*a)[10][20];


死ねよ
347デフォルトの名無しさん:2007/08/03(金) 01:28:43
>>344
int n[10][10]; を int** に渡せないとか言う人の相手をしなきゃいけない身になってみろ。
348デフォルトの名無しさん:2007/08/03(金) 01:33:51
>>346
君が死んだほうがいいような・・・
349デフォルトの名無しさん:2007/08/03(金) 01:42:50
配列は 「変数名の直後に [サイズ] を書く」
ポインタは 「変数名の直前に * を書く」

括弧があろうがこれは変わらない。

それだけ覚えていれば何も迷うことは無い。
350デフォルトの名無しさん:2007/08/03(金) 02:28:56
>>346
最初の一行、このスレのタイトルからしてお前が来なきゃ良いんじゃね?って
周りに思われていることに気づいた方が良いんじゃね?
自分が嫌うものをわざと見つけて、勝手にその対象物を叩いてイラついている
基地外にしか見えない・・・
351デフォルトの名無しさん:2007/08/03(金) 02:40:09
配列へのポインタの配列が必要になる状況って考え付かないんだけど、どんなの?
352デフォルトの名無しさん:2007/08/03(金) 02:44:52
double x y;
scanf("%f%f",&x,&y);

1.0 1.0
と取り込んだら
printf("x y = %f %f\n",x,y);

x y = 0.000000 0.000000
と出力された。
なんで???
353デフォルトの名無しさん:2007/08/03(金) 02:46:04
%lf
354352:2007/08/03(金) 02:48:12
わいわ…アホや…
355デフォルトの名無しさん:2007/08/03(金) 03:04:33
>>351
必要になるならないは問題ではない
どう書けるかときいているのです。
356デフォルトの名無しさん:2007/08/03(金) 03:08:06
そんなどうでもいいこと気にする前にもっと学ばなきゃいけないことがたくさんあると思うけど。
357デフォルトの名無しさん:2007/08/03(金) 03:33:49
わからないならわからないっていえよ
しったかぶってんなよw
358デフォルトの名無しさん:2007/08/03(金) 03:35:56
教えられないくせに学べだの説教するやつは痛過ぎ・・・
359デフォルトの名無しさん:2007/08/03(金) 03:36:37
>>351
回転行列へのポインタの配列とか。
360デフォルトの名無しさん:2007/08/03(金) 03:37:26
あげくのはてには、必要ないだってw

361デフォルトの名無しさん:2007/08/03(金) 03:41:54
int (*(*(*p[1])[2])[3])();

を3秒以内に理解できるかい?
362デフォルトの名無しさん:2007/08/03(金) 03:43:06
そこまですっきりしてると分かりやすい。
363デフォルトの名無しさん:2007/08/03(金) 03:45:00
int (*(*p)(int (*)(int (*)[20])))[10];
364デフォルトの名無しさん:2007/08/03(金) 03:49:20
それを有効に使ったコード書いてみてくれw
365デフォルトの名無しさん:2007/08/03(金) 04:07:32
ごめん、無理。
366デフォルトの名無しさん:2007/08/03(金) 05:42:26
・C言語の欠陥
関数アドレスを返す関数において、その関数と同じ型の関数アドレスを
返す型の循環構造を定義できない。

typedef func_t (*func_t)(); // エラー
func_t f();
367デフォルトの名無しさん:2007/08/03(金) 05:58:18
こういう場合は構造体を定義するしかない。
struct _s_t;
typedef struct _s_t (*func_t)();
typedef struct _s_t {
func_t f;
} s_t;

s_t f() {
s_t s = {f};
printf("f()");
return s;
}

main () {
// f()()()()()(); 本来期待する呼び出し形式
f().f().f().f().f().f();
}

結果:
f()f()f()f()f()f()
368デフォルトの名無しさん:2007/08/03(金) 06:35:56
それ聞いたことはあるけど、どういう場合に使うの?
369デフォルトの名無しさん:2007/08/03(金) 07:34:06
にわかプログラマーは心の狭いやつが多いねぇ
おまけにちょっと噛み付かれたらギャーギャー喚き散らさないと気がすまないらしい
370デフォルトの名無しさん:2007/08/03(金) 08:12:21
371デフォルトの名無しさん:2007/08/03(金) 08:39:05
   / ̄ ̄\
 /   _ノ  \
 |   ( ●)(●)  < スレタイ読めないならどっか余所へ行けよ
. |     (__人__)____
  |     ` ⌒/ ─' 'ー\
.  |       /( ○)  (○)\
.  ヽ     /  ⌒(n_人__)⌒ \
   ヽ   |、    (  ヨ    | ← にわかプログラマー
   /    `ー─−  厂   /
   |   、 _   __,,/     \
372デフォルトの名無しさん:2007/08/03(金) 11:57:59
>>370
他の解説読んでたけどif文にセミコロンいらないの知らなかった…
でもコード見たらちゃんと書けてた

(´・ω・`)??
とりあえず気付けてよかった
373デフォルトの名無しさん:2007/08/03(金) 12:51:25
>>345
ヒント:a[20]と書くとaと[がとても強くくっつくので、「aは20個の要素を持つ配列です」ということになります。
374デフォルトの名無しさん:2007/08/03(金) 14:58:37
ポインタについて質問なのですが、軽くググった感じではポインタとは
ガーベッジコレクタを利用した変数という認識で良いのでしょうか
375デフォルトの名無しさん:2007/08/03(金) 15:06:18
全然違います。
アドレスを保持する変数です。
376デフォルトの名無しさん:2007/08/03(金) 15:06:38
>>374
びっくりするぐらいダメ
377デフォルトの名無しさん:2007/08/03(金) 15:06:54
>>374
ぜーーーんぜん違いますw

ポインタ = 変数や関数のアドレスを格納した変数。値はつねにアドレスになる。
378デフォルトの名無しさん:2007/08/03(金) 15:07:54
なにこの同時ダメだしw ワロタ
379デフォルトの名無しさん:2007/08/03(金) 15:08:42
wwwwwwwwwwwwwwwwwwwwwwww
380374:2007/08/03(金) 15:10:06
私も吹きました。修行不足のようですね。出直してきます
381デフォルトの名無しさん:2007/08/03(金) 15:45:39
そもそもCにガベコレなんて無いし
382デフォルトの名無しさん:2007/08/03(金) 16:50:41
軽くググってガベージクレクタにたどり着いた道程に興味があります。
383デフォルトの名無しさん:2007/08/03(金) 17:10:33
童貞に興味があります
384デフォルトの名無しさん:2007/08/03(金) 17:10:51
>>383
いりますか?
385デフォルトの名無しさん:2007/08/03(金) 17:10:59
俺は無い
386デフォルトの名無しさん:2007/08/03(金) 18:56:25
質問です。
@wininetを使ってhtmファイルを読み込みtemp.htmで出力。
Aそのtemp.htmを読み込み、必要な部分をaaa.htmで出力。
ということをしたいのですが、1度ならできたのですが、
while文で2回以上ループさせると@のtemp.htmをwモードで
fopenするとエラーが出てうまくいきません。
一応大まかなソースを書いておきます。よろしくお願いします。

void create_htm(int times){
 FILE *wfp;
 FILE *rfp;
 if((wfp = fopen("temp.htm, "w")) == NULL){ ←2回目になるとここでエラーが発生し強制終了。しかしfprintfは実行されないまま。
  fprintf(stderr, "--- wfp error");
  exit(1);
 }
 get_htm(wfp, times); /*@の関数*/
 fclose(wfp);
 if((rfp = fopen("temp.htm", "r")) == NULL){
  fprintf(stderr, "--- rfp error times = %d", times);
  exit(2);
 }
 diet_htm(rfp, times); /*Aの関数*/
 fclose(rfp);
}

main(){
 int times;
 get_config(); /*gettimesをファイルから取得。gettimesはグローバル変数*/
 for(times = 0; times < gettimes; times--){
  create_htm(times);
 }
}
387386:2007/08/03(金) 18:59:51
すいません。while文ではなくfor文でループしてます。
mainのfor文はtimes--ではなくtimes++です。
よろしくおねがいします。
388デフォルトの名無しさん:2007/08/03(金) 19:15:36
問題の無い部分を手書きで書いて見せたって何にもならんと思うのだが。
せめてエラーのときはerrnoくらい出してよ。
389386:2007/08/03(金) 19:35:44
問題のある部分がcreate_htm関数のif((wfp = fopen("temp.htm, "w")) == NULL)
の部分でエラーが出るのですが。すみません。errnoはどのように出すのでしょうか。
ネットで調べてみて、問題のある部分のあとに書いたのですが、強制終了されるので
出力されないのですが。
390デフォルトの名無しさん:2007/08/03(金) 19:53:26
そもそもこれはファイル名の後に"が抜けててコンパイルもできないだろ
問題のあったソースをコピペすることもできんのか
エラー処理もしないでそこで落ちるというのはどうやって判明したんだ?
391デフォルトの名無しさん:2007/08/03(金) 19:55:41
強制終了って、アクセス違反?
どっかぜんぜん別のところでメモリ破壊を起こしてるのかもね。
get_htm や diet_htm の中身を見ないと解決できない気がする。
>>386に載ってる部分では特に問題なさげ。
392386:2007/08/03(金) 20:05:19
>>390
あ、すみません。抜けてました。
そこで落ちるというのは、一行ごとにprintfでどこがエラーかをみてみたら、
その部分でprintfがされなかったので判明しました。


>>391
メモリ破壊ですか。メモリ破壊を調べる方法とかないですか?
393デフォルトの名無しさん:2007/08/03(金) 21:04:33
gdb使えよ
394386:2007/08/03(金) 21:48:16
windowsでもgdbは使えますか?
turbo debuggerというので動かしてみると、例外が出たと言われました。
395デフォルトの名無しさん:2007/08/03(金) 21:56:31
いまどきCなんて使う機会ってあるの?
OSを書く
組み込み系

これくらいにしか使わないよね
396386:2007/08/03(金) 21:56:57
何度も失礼します。
gdbをするには、gcc -g program.cをすればいいですよね?
でも、コンパイル時にwininet.hのInternetOpenなどでエラーが出るのですが
どうしたらいいですか?
397デフォルトの名無しさん:2007/08/03(金) 22:03:15
>>395
LinuxアプリとかR&Dとか
398デフォルトの名無しさん:2007/08/04(土) 00:55:07
>>396
そもそも何使って開発してるのよ。VCのデバッガ使えば?
399386:2007/08/04(土) 01:06:28
windows XP、bccを使っています。
すみません、自己解決できそうです。
メモリ破壊というものをネットで調べながらソースとにらめっこしてたら、
どうやら、Aの関数内でmallocでサイズを確保するときに、strlenではなく
sizeofを使ってしまっていたのが原因のようでした。お騒がせしました。
また、新たなエラーが発生した際にはお邪魔させていただきます。
400デフォルトの名無しさん:2007/08/04(土) 01:12:41
もう来るな
401デフォルトの名無しさん:2007/08/04(土) 01:13:26
>>400
お前みたいな奴に質問に答えてもらわんでも結構、お前が来るな
402デフォルトの名無しさん:2007/08/04(土) 01:14:47
sizeofをどう使ってたんだ?
403デフォルトの名無しさん:2007/08/04(土) 01:15:34
>>400-401
邪魔
404デフォルトの名無しさん:2007/08/04(土) 01:18:15
>>402
ポインタに使ってばぐったんだろ。
405デフォルトの名無しさん:2007/08/04(土) 01:19:16
だから他の関数も最初から晒(ry
406デフォルトの名無しさん:2007/08/04(土) 01:20:40
>gdbをするには、gcc -g program.cをすればいいですよね?
>windows XP、bccを使っています。
質問される方の身になってください。

類似例
http://www.nicovideo.jp/watch/sm8005
407デフォルトの名無しさん:2007/08/04(土) 06:45:47
>>403 お前も邪魔。いちいちうるせー
408デフォルトの名無しさん:2007/08/04(土) 13:11:15
>>407-408
邪魔
409デフォルトの名無しさん:2007/08/04(土) 16:56:50
質問ですが、

int main() {
int w;
printf("0から6までの整数を入力してください!\n");
scanf("%d",&w);
switch (w) {
case 0: printf("日曜日です。\n"); break;
case 1: printf("月曜日です。\n"); break;
case 2: printf("火曜日です。\n"); break;
case 3: printf("水曜日です。\n"); break;
case 4: printf("木曜日です。\n"); break;
case 5: printf("金曜日です。\n"); break;
case 6: printf("土曜日です。\n"); break;
default:printf("???\n");
} return 0; }

の4行目のscanfで("%d\n",&w)と間違えて打ったら2度入力が求められ、
結果には、1回目の入力が反映されました。なぜでしょうか?
使っているコンパイラはborland c++ 5.5.1で、OSはビスタです。

410デフォルトの名無しさん:2007/08/04(土) 17:06:32
>>409
scanf()は、エラーの場合、そのデータが取り除かれないで、入力ストリームに残ったままになるから。
エラー処理をしっかりしたかったら、scanf()は使わないほうがいいよ。
411デフォルトの名無しさん:2007/08/04(土) 17:09:29
>>409
scanfは"%d\n"の書式に合う文字列を入力したあとに改行が押されるまで待ってる
つまり1回目の改行は書式の中で要求されてるからそっちで使われていて2回目の改行でscanfが終了できる
412デフォルトの名無しさん:2007/08/04(土) 17:16:33
>>410, >>411
す、素早い!
ありがとうございます。勉強になった。
413デフォルトの名無しさん:2007/08/04(土) 17:40:34
scanf("%d\n", &w) の場合、%d と \n の2個分の入力が要る。
414デフォルトの名無しさん:2007/08/04(土) 19:58:53
マクロでこうゆうのは有りですか?(使われていたりしますか?)
※VFuncは動的引数持ちの関数

#define MACRO_HOGE(inA, inB)   inA = VFunc inB

-使用例-----------------------------------
void main(void){
int V;

MACRO_HOGE(V, (A, B, C));
}

例は適当に書きましたがようするにMACRO_HOGEの第2引数に"()"付きで複数の引数を書き並べることについてです。
415デフォルトの名無しさん:2007/08/04(土) 20:08:35
なんでまたそんなことをしたいと?
416デフォルトの名無しさん:2007/08/04(土) 20:09:58
>>414
(コーディング規約などで制限されていない限り)誰も止めはしないと思うよ。
デバッグ出力用途で時折見掛けるしね。
417デフォルトの名無しさん:2007/08/04(土) 20:24:59
>>414

×こうゆう
○こういう
418デフォルトの名無しさん:2007/08/04(土) 20:29:40
>>415
引数の数が不定の関数に対するマクロを作る必要がありました。
マクロの内容も実際には複数行にわたっており、その中でin_Aの値を使用するためこのような形になってしまっています。

>>416
製品に組み込まれるソースではなく、社内でデバック用に開発メンバーのみで使用するものです。
他のところでも使われているようでちょっと安心しました。

ありがとうございました。

>>417
「・・・・・・・・・・・・・・・・・・。」
419デフォルトの名無しさん:2007/08/04(土) 20:51:59
>>414
c99で可変長引数のマクロつかえば.
420デフォルトの名無しさん:2007/08/04(土) 21:10:38
> >>417
> 「・・・・・・・・・・・・・・・・・・。」

ガキか
421デフォルトの名無しさん:2007/08/04(土) 22:06:47
int *p;
は、「intへのポインタ」ってことらしいけど
「ポインタが指している変数の型がint」ってこと?
422デフォルトの名無しさん:2007/08/04(土) 22:14:55
うん。
int *p; は *p が int になる。
423デフォルトの名無しさん:2007/08/04(土) 22:23:24
サントス

噂に聞いていたがポインタは難しい…
424デフォルトの名無しさん:2007/08/04(土) 22:44:18
難しいと思ってるから難しいんだよ。一度分かれば何が難しかったのか理解するのが難しくなる
425デフォルトの名無しさん:2007/08/04(土) 23:02:18
ポインタは、変数の置いてある場所を入れておくもの。
置いてある場所が分かれば、そこにある値も操作できるはず。
426デフォルトの名無しさん:2007/08/04(土) 23:06:34
とにかくいろいろ読んだり組んだりしなきゃダメだな
がんばるぜ

じゃーの
427デフォルトの名無しさん:2007/08/04(土) 23:28:58
fopenでファイルがオープンされなかったらNULLが返ってくるけど
rはファイルがなかった場合などが挙げられる。
じゃーwだったらどういうときにそうなるの?
428デフォルトの名無しさん:2007/08/04(土) 23:31:34
>>427
存在しないディレクトリだとか。
429デフォルトの名無しさん:2007/08/04(土) 23:31:41
書き込みロックされてる場合とか
430デフォルトの名無しさん:2007/08/04(土) 23:32:17
ディレクトリを fopen しようとした時とか
431デフォルトの名無しさん:2007/08/04(土) 23:57:35
ファイルの作成をOSに拒否されたときとか
432デフォルトの名無しさん:2007/08/05(日) 00:14:17
ファイルの開き過ぎとか
433デフォルトの名無しさん:2007/08/05(日) 00:18:56
How many files(0-15)?
434デフォルトの名無しさん:2007/08/05(日) 05:58:56
ファイルを書き込むのに十分な空き容量がないとか
書き込めない場所への書き込みをしようとしたとか
435デフォルトの名無しさん:2007/08/05(日) 06:30:36
ディレクトリに書き込み権限がないとか。

って、切りがないよw
436デフォルトの名無しさん:2007/08/05(日) 06:42:56
入れる穴がないからといって後ろの(ry
437デフォルトの名無しさん:2007/08/05(日) 12:31:35
アッーー!
438デフォルトの名無しさん:2007/08/05(日) 13:17:12
なるほど。勉強になった。
fopen・fcloseをちゃんとしてれば、その一連は何度もループできるの?
それとも上限回数とかあったりするの?
439デフォルトの名無しさん:2007/08/05(日) 13:55:08
容量は有限なんだから、書き込みで新しいファイルを作っていけばいつかは上限に達する。
440デフォルトの名無しさん:2007/08/05(日) 14:02:14
しかし、既にあるファイルを開いて閉じてなら、永遠に繰り返していい。
441デフォルトの名無しさん:2007/08/05(日) 14:45:00
できました〜。ありがとうございます。
442デフォルトの名無しさん:2007/08/05(日) 18:21:27
無償リンクソフトは無いのでしょうか?
もし無いのであれば有名なリンクソフトを教えて頂けないでしょうか?
443デフォルトの名無しさん:2007/08/05(日) 18:23:35
リンクソフトって何のことよ?
リンカーのことなら、GNU ld か?
目的を書いた方がいいと思うよ
444デフォルトの名無しさん:2007/08/05(日) 18:24:14
コンパイラ入れたら大抵リンカも入ってるだろ
445デフォルトの名無しさん:2007/08/05(日) 21:01:14
質問ですが
「C言語のプログラムをアセンブリ・コードに変換せよ」
という課題が出されたのですが、変換するツールのようなものはありますか?
446デフォルトの名無しさん:2007/08/05(日) 21:03:45
あります。
447デフォルトの名無しさん:2007/08/05(日) 21:04:46
コンパイラで出来たような気がする
448デフォルトの名無しさん:2007/08/05(日) 21:05:32
コンパイラがやってくれる
gcc なら -S オプションつけてコンパイルしてみ
449デフォルトの名無しさん:2007/08/06(月) 00:11:36
#defineかなにかでファイル指定するときに
違うディレクトリのファイルを指定することはできますか?
450デフォルトの名無しさん:2007/08/06(月) 00:14:10
#define でファイル指定???
#include のことか?
違うディレクトリのファイルは指定できる。
451デフォルトの名無しさん:2007/08/06(月) 00:22:32
#includeでできるんですか。
今homeディレクトリにいるとして、
そのhomeディレクトリの下にworkディレクトリがあるとします。
その中のファイル1.txtを指定したい場合、どう書けばいいのですか?
452デフォルトの名無しさん:2007/08/06(月) 00:27:06
#include "work/ファイル1.txt"
453デフォルトの名無しさん:2007/08/06(月) 00:35:12
ありがとさん。
扱うファイル多すぎで困ってたんだ
454デフォルトの名無しさん:2007/08/06(月) 01:11:23
無理やり#defineを絡めてやる。
#deifne FOO "work/ファイル1.txt"
#include FOO
455デフォルトの名無しさん:2007/08/06(月) 11:10:24
ググっても良く分からないので質問させてください。
ポインタなんですが・・・スコープは変数と扱い同じ?
456デフォルトの名無しさん:2007/08/06(月) 11:17:15
ポインタ変数のことなら当然普通の変数と同じ扱いじゃないかな?
457デフォルトの名無しさん:2007/08/06(月) 11:18:25
ポインタ変数なら、ポインタ変数以外の変数と同一。
ポインタ値なら、数値と同一。
つまり、ポインタ変数に入っているポインタ値が有効かどうかは別の問題。
458デフォルトの名無しさん:2007/08/06(月) 11:56:40
doumoarigatougozaimasu。
459デフォルトの名無しさん:2007/08/06(月) 12:10:54
スコープは他の変数と変わりないんだけど、戻り値にポインタ変数取るときや、引数で渡して参照渡しにするとき
なんかに混乱しやすい気がする。
460デフォルトの名無しさん:2007/08/06(月) 12:54:20
>>459
普通の変数に格納している、数値と同じだってばさ。
例えばグローバルな整数配列を用意して、そのインデックス番号を受け渡しをすることを考えればいい。
461デフォルトの名無しさん:2007/08/06(月) 17:02:00
flag = A | B | C;  というのを本を読んると出会いました。
ABCというのはdefineで定義された、0とか1などの数字です。

それで適当に、自分でもこれを作って調べてみたものの
挙動が不安定?で、規則性が見出せません。
どなたかわかる方いらっしゃいましたら、よろしくお願いします
462デフォルトの名無しさん:2007/08/06(月) 17:03:41
>>461
普通にビット演算の or だけど、何がわからないの?
463デフォルトの名無しさん:2007/08/06(月) 17:09:02
なるほど、単なるビット演算でしたか・・・
ありがとうございました。
464デフォルトの名無しさん:2007/08/06(月) 17:42:31
>>460
便乗で質問です。
自動変数へのポインタを返す関数は、普通の変数を使ってどう考えたらいいでしょうか?

465デフォルトの名無しさん:2007/08/06(月) 17:46:49
よく意味が分からんが、
自動変数のアドレスを返すような関数は作っちゃダメだぞ。
466デフォルトの名無しさん:2007/08/06(月) 17:57:29
>>464
>460の二行目のアナロジーでいけば、ローカルな配列のインデックス番号を返すことと同じくらい
ローカルな変数へのポインタを返すことが無意味であることが判る。
467デフォルトの名無しさん:2007/08/06(月) 17:57:44
int *hoge(void)
{
int a;
return &a;
}
たとえば、こんなことすると、アドレスは返るがaはスコープを外れているので不正となる
468デフォルトの名無しさん:2007/08/06(月) 18:06:11
自動変数は関数内で作られて、関数を抜ければ破棄されるからな。
469デフォルトの名無しさん:2007/08/06(月) 18:20:37
まあ直後で無い限り、たいていは別の用事で使われとるわ
470デフォルトの名無しさん:2007/08/06(月) 19:03:47
>467の例がダメなのは、スコープを外れているからではなくて寿命が切れてるからなのだな。
スコープはコンパイル時の話。寿命は実行時の話。
471464:2007/08/06(月) 20:02:13
>>465>>470
ありがとうございます。
配列とかインデックスとかは理解にはあまり関係なさそうですね。
スコープと寿命で調べてみます。
472デフォルトの名無しさん:2007/08/06(月) 23:04:23
なんだ、釣りだったのか。
473デフォルトの名無しさん:2007/08/06(月) 23:53:58
A>>Bっていう記号はC言語じゃないならば、
Aのほうが圧倒的にBより大きいことを示しますけど
これをC言語で表すにはどうすればいいですか?
474デフォルトの名無しさん:2007/08/06(月) 23:58:12
「圧倒的」なんて曖昧なものはC言語では表せません
475デフォルトの名無しさん:2007/08/06(月) 23:58:12
a > b
圧倒的かどうかは人間の主観。
そんなものコンピュータに持ち込めない。
476デフォルトの名無しさん:2007/08/06(月) 23:58:58
>>473
そもそもあらわす場面がないのだが?
実現したい内容がわからないので答えられない。
477デフォルトの名無しさん:2007/08/07(火) 00:02:53
a と b が double 型なら、
a / b > 1.0e+10 みたいに
「圧倒的に大きい」という基準を自分で示してやる必要がある。
ただ、b が 0 になる場合には特殊な処理が必要。
478デフォルトの名無しさん:2007/08/07(火) 00:11:23
「圧倒的に」を具体的に定義すれば出来なくもないけど。
もちろんその「定義」は決めた人の概念による

除算じゃなくて差でもいいと思うけど
479デフォルトの名無しさん:2007/08/07(火) 00:22:13
数学で >> と使う場合、オーダー差が大きいことを表すことが多いからね。
まあ、差で判定した方がいい状況なら差でもいいと思う。

a > 1.0e+10 * b にすれば、
b が 0 なら a が 0 より大きければ常に a が圧倒的に大きいと判別する、
という仕様なら特殊な処理は要らない。
でも、実際には理論的には a も 0 になるところが数値誤差で 0 にならなかった、
なんてこともあるから、
a や b が極端に小さい場合はどっちみち特殊な処理を入れた方がいい。

あと、絶対値をとる必要があるかどうかとかも考慮する必要もある。
480デフォルトの名無しさん:2007/08/07(火) 01:39:03
質問です。例えば、

operate(char *s){
 char data[64];
 char *ptr;
 fgets(data, 64, stdin);
 ptr = strstr(data, "lemon");
 exchage(ptr, 'l', 'm');      /*lとmの入れ替えをする関数*/
 change(ptr, 'n', '\0');      /*nの次をヌルに変える関数*/
 s = (char *)malloc(strlen(ptr));
 strcpy(s, ptr);
}

main(){
 char *str;
 operate(str);
 printf("str = %s\n", str);
}

のようにmainで宣言したstrをoperate関数の引数として渡し、
入力文字にlemonがあればmelonにしてその部分だけを取り出す、
というような処理を行った場合、うまくstrに格納されず、表示されません。

どうすれば上手く処理できますか?教えてください。
481デフォルトの名無しさん:2007/08/07(火) 02:06:18
char *operate(void){
char *s;
.....
.....
strcpy(s, ptr);
return s;
}

main(){
char *str = operate();
...
}
482480:2007/08/07(火) 02:16:49
>>481さん回答ありがとうございます。
やはり、そのようにしないとできないのですか?
1つの場合はそうできますが、複数の場合はどう対処すればいいですか?

例えばoperate(char *s1, char *s2)と引数を2つ取り、
そして、mainでstr1とstr2を渡して同様の処理を行うこととし、
operate関数ではstr1にはlemonを、str2にはmelonを表示させたいです。
その他基本処理は>>480と同じです。
その場合うまくmainでstr1とstr2を希望通り表示させるにはどうすればいいですか?
483デフォルトの名無しさん:2007/08/07(火) 02:19:37
じゃあこれで
operate(char **s){
.....
.....
*s = (char *)malloc(strlen(ptr));
strcpy(*s, ptr);
}

main(){
char *str;
operate(&str);
.....
}
484デフォルトの名無しさん:2007/08/07(火) 02:24:44
書いてから気づいたけど、

誤) malloc(strlen(ptr))
正) malloc(strlen(ptr) + 1)
485480:2007/08/07(火) 02:35:12
>>483->>484さん、ありがとうございます!できました!

でも、ポインタのポインタにするとどうしてできるようになったのですか?
ポインタだけだとなぜできなかったのですか?

すみません、どうしてなのか気になったので質問ばかりで。
486デフォルトの名無しさん:2007/08/07(火) 02:41:42
関数 引数 値渡し でググるんだ
487480:2007/08/07(火) 02:43:09
>>486さん、ほんとありがとうございます!
ググって勉強してきます!
488デフォルトの名無しさん:2007/08/07(火) 02:45:00
暇なのでlemonちゃんをmelonちゃんに変えてみた。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 64
void operate(char **s1,char **s2){
char data[N],temp[N],*ptr,*ch;
fgets(data, N, stdin);
ptr = strstr(data, "lemon");
strncpy(temp,ptr,strlen("lemon"));
temp[strlen("lemon")] ='\0';
*s1 = malloc(strlen(temp)+1);
strcpy(*s1,temp);
if((ch = strchr(ptr,'l'))!=NULL) *ch = 'm';
if((ch = strrchr(ptr,'m'))!=NULL) *ch = 'l';
if((ch = strchr(ptr,'n'))!=NULL) *(ch+1) = '\0';
*s2 = (char *)malloc(strlen(ptr)+1);
strcpy(*s2, ptr);
}
int main(){
char *str1=NULL,*str2=NULL;
operate(&str1,&str2);
printf("str1 = %s str2 = %s\n", str1,str2);
free(str1);free(str2);
return 0;
}
489デフォルトの名無しさん:2007/08/07(火) 02:48:38
operate(int x) {
x = 10;
}
main() {
int y;
operate(y);
printf("%d", y);
}

で 10 がプリントされないのが理解できてるなら、
そっくりそのまま int → char* に置き換えてみれば以下もだめなことがわかる。

operate(char *x) {
x = "10";
}
main() {
char *y;
operate(y);
printf("%s", y);
}
490480:2007/08/07(火) 02:54:32
>>488さん
ふと思いついた例だったのに、ちゃんとプログラムにしてくれるとは。
勉強になります!

>>489さん
上はわかります。なるほど、そのまま置き換えて考えれば。
そういうことだったのか。ひとつ賢くなれた気がします!
491デフォルトの名無しさん:2007/08/07(火) 06:21:47
ポインタについて質問させてください。
#include <stdio.h>
int main(int argc, char* argv[])
{
char *a;
char b = 3, c;
a = &b;
c = *a;
printf("The content of a is %d and the address of a is %x\n", a, &a);
printf("The content of c is %d and the address of c is %x\n", c, &c);
return (0);
}
上記のプログラムを実行してでる結果は、
"The content of a is 3 and the address of a is 下と異なるアドレス"
"The content of c is 3 and the address of c is 上と異なるアドレス"
になると予想していたのですが、
"The content of a is 37814172 and the address of a is 240ff9b"
"The content of c is 3 and the address of c is 240ff9a"
と表示されてしまいます。
わかる方がいたらどうか教えてください。
492デフォルトの名無しさん:2007/08/07(火) 07:29:48
>>491 こういうこと?
, a, &a);

, *a, &a);
493デフォルトの名無しさん:2007/08/07(火) 07:33:33
>491の実行結果はおかしくないか?
aのアドレスが0x240ff9b、bが0x240ff9c、cは0x240ff9aって、
ポインタ変数の大きさが1バイト??
494デフォルトの名無しさん:2007/08/07(火) 09:43:19
>>493
なんでそうなるんだよ
495494:2007/08/07(火) 09:45:37
スタックに積んだ状態で
c(char)b(char)a(char*) となってんだから、a,b,cの間は1バイトでいいべ
496デフォルトの名無しさん:2007/08/07(火) 10:07:22
>494
491をよーく見てみたら?
497デフォルトの名無しさん:2007/08/07(火) 10:08:07
この場合、b(char)c(char)a(char*) だったな
498デフォルトの名無しさん:2007/08/07(火) 10:08:44
>>496
キミがよくみなさい
499デフォルトの名無しさん:2007/08/07(火) 10:15:21
やっぱ変だな。
500デフォルトの名無しさん:2007/08/07(火) 10:17:06
>498
a = &b = 37814172 = 240ff9c
501493:2007/08/07(火) 10:52:10
aのアドレスが一番大きい実行結果なら疑問に思わなかった。
あと今思ったが、ポインタ変数が奇数番地に置かれるのも違和感ある。
502デフォルトの名無しさん:2007/08/07(火) 11:07:27
抽象化って何でしょう?
ぐぐったけど、説明サイトは見つかりませんでした。
503デフォルトの名無しさん:2007/08/07(火) 11:26:34
データ抽象化でぐぐるんだ
504デフォルトの名無しさん:2007/08/07(火) 15:54:56
>>501
メモリ効率を優先してるのかね。
俺も違和感はあるが、
バイト境界に置かなくてもバスエラーが出ない環境なら間違いではないな。
遅くはなるかもしれんが。
505デフォルトの名無しさん:2007/08/07(火) 17:51:12
C言語でネットに繋いでデータを送信することはできますか?
506デフォルトの名無しさん:2007/08/07(火) 17:53:59
できます。
507デフォルトの名無しさん:2007/08/07(火) 17:55:49
それはC言語で送信するのではなく、どの言語であれそういう処理をしてくれる
実行プログラムにて可能になります。ソースコードだけでは無理です。
コンパイルして下さい、おながいします!
508デフォルトの名無しさん:2007/08/07(火) 18:16:37
>>506
できたら詳しく教えてほしいです。

>>507
ごもっともです。
509デフォルトの名無しさん:2007/08/07(火) 18:21:29
C言語 ソケットプログラミングでググれ。
一番面倒なやり方だけどな。

何をやりたいかによって最適なライブラリは変わってくるだろう。
510デフォルトの名無しさん:2007/08/07(火) 18:29:04
>>509

有難うございます。
511デフォルトの名無しさん:2007/08/07(火) 18:38:27
512デフォルトの名無しさん:2007/08/07(火) 18:41:43
ヒープソートを実装する。
実装する際、それぞれのソーティング用の計算時間を計測する機能を取り入れる。ランダム的なデータを使い、データ数は1KBとする。C言語のコマンドラインを利用してプログラムを実行する。

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

#define MAX 1000000
#define RAND_N 10000

void swap(int i, int j, int *A);
void upmin(int i, int *A, int n);
void insert(int x, int *A, int *n);
void heap_sort(int *A, int n);
void heapify(int *A, int n);
void downmax(int i, int *A, int n);
int deletemax(int *A, int n);

int A[MAX];

int main(int ac, char *av[])
{
int i, n, pn;
time_t seed;
clock_t start, end;
513デフォルトの名無しさん:2007/08/07(火) 18:42:21
先は長そうだな・・・
アップローダ使って欲しいとこだが
514512続き:2007/08/07(火) 18:42:43
if (ac != 3) {
printf("A WORNING COMMAND.\n");
exit(0);
} else {
n=atoi(av[1]);
}

if (n>MAX) {
printf("n is too big.\n");
exit(0);
}

start=clock();
srand((unsigned)time(NULL));
for (i=0; i<MAX; i++)
insert((rand()/RAND_N), A, &n);
printf("ソート前:");
for (i=0; i<pn; i++)
printf("%d ", A[i]);
putchar('\n');

heap_sort(A, n);
515512続き:2007/08/07(火) 18:43:24
if (n>10) {
pn=9;
} else {
pn=n;
}

printf("ソート後:");
if (strcmp(av[2],"up") == 0) {
for (i=0; i<pn; i++) {
printf("%d ",A[i]);
}
putchar('\n');
}

if (strcmp(av[2],"down") == 0) {
for (i=pn; i>0; i--) {
printf("%d ",A[i]);
}
putchar('\n');
}
end=clock();

printf("%20.18lf秒\n", (double)(end-start)/CLOCKS_PER_SEC);
}
516512続き:2007/08/07(火) 18:44:16
//挿入
void insert(int x, int *A, int *n)
{
int n1;
n1 = *n;
if (n1 >= MAX)
{
printf("Error: Heap A is full.\n");
exit(1);
}
A[n1] = x;
upmin(n1, A, n1+1);
*n = n1 + 1;
return;
}

void upmin(int i, int *A, int n)
{
int j;

if (i<0 || i>=n)
{
printf("Illegal element i=%d for n=%d\n", i, n);
exit(1);
}
if (i == 0) return;
j = (i-1)/2;
517512続き:2007/08/07(火) 18:45:38
if (A[j] > A[i])
{
swap(i, j, A);
upmin(j, A, n);
}
return;
}

void heap_sort(int *A, int n)
/* 配列A[0], … , A[n-1]wpヒープソートにより整列 */
{
int i;

heapify(A,n); /* ヒープ化;ただし根は最大をもつ */

for (i=n-1; i>0; i--) /* 最大要素を末尾へ */
A[i] = deletemax(A, i+1);
}

void heapify(int *A, int n)
/* A[0], … ,A[n-1]をヒープ化 */
{
int i;

for (i=n/2-1; i>=0; i--) downmax(i, A, n);
}
518デフォルトの名無しさん:2007/08/07(火) 18:48:27
せめて空行くらい削ってくれよ
519デフォルトの名無しさん:2007/08/07(火) 18:49:04
なんかの課題かね。
520デフォルトの名無しさん:2007/08/07(火) 18:49:08
だらだら投稿してないでうpろだ使えよ
521512続き:2007/08/07(火) 18:49:14
void downmax(int i, int *A, int n)
/* A[i]から下方へ、ヒープの性質を回復するためのswap操作を適用 */
{
int j;
j=2*i+1;
if (j >= n) return;
if (j+1<n && A[j]<A[j+1])
j=j+1;
if (A[j] > A[i])
{
swap(i, j, A);
downmax(j, A, n);
}
return;
}
522512続き:2007/08/07(火) 18:50:26
int deletemax(int *A, int n)
/* ヒープA[0], … ,A[n-1]から最大要素A[0]の出力と除去 */
{
int max;

max=A[0]; A[0]=A[n-1];
downmax(0, A, n-1);
return;
}

void swap(int i, int j, int *A)
{
int temp;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}

長くなってしまいました。(汗
すいませんアップローダよくわからなくて…。
課題です…ちゃんと動作しないので教えてもらえるとたすかります。
523デフォルトの名無しさん:2007/08/07(火) 18:51:00
次の質問をどうぞ
524デフォルトの名無しさん:2007/08/07(火) 18:53:58
ならまずアップローダの使い方から勉強する
525デフォルトの名無しさん:2007/08/07(火) 18:54:25
C/C++の宿題を片付けます 94代目
http://pc11.2ch.net/test/read.cgi/tech/1185452895/
526デフォルトの名無しさん:2007/08/07(火) 18:58:04
insert の引数 n は何よ
初期値にコマンドラインから何を与えてるわけ?
527512:2007/08/07(火) 19:01:38
nはデータ数を与えてます。
コマンドラインからはデータ数、昇順か降順か("up"か"down")です。
528デフォルトの名無しさん:2007/08/07(火) 19:43:09
ttp://www.ie.u-ryukyu.ac.jp/~kono/os/ex/file/file.html
ここにある、ファイルの属性を出力するプログラム(stat.c)についてなのですが、
これをコンパイルして実行しても、属性が表示されないファイルがあります。

例えばcygwinをインストールしている方であれば
c:/cygwin/bin
の中にある「pnmnoraw」というファイルです。
このファイルについて実行すると、

$ ./stat pnmnoraw
pnmnoraw: No such file or directory

と出力されて終了し、属性が表示されません。

Unixコマンドであるstatを用いると、ちゃんと属性が表示されます。
このプログラムではなぜエラーが起きるのでしょうか?
529デフォルトの名無しさん:2007/08/07(火) 19:47:08
>>528
sid の有無とか?
530デフォルトの名無しさん:2007/08/07(火) 19:51:12
cygwin だったらファイル名に .exe を付けないとだめってことない?
531デフォルトの名無しさん:2007/08/07(火) 19:56:56
>>528
エクスプローラだと拡張子を表示しない設定になっている可能性が高いので
ls とか dir コマンドでファイル名の正式名称を調べてみて
532528:2007/08/07(火) 20:05:05
レスありがとうございます。

>>529
SID・・・
調べてもユーザアカウントの識別子ということしか分からず、
当問題の解決に繋がるのか分かりませんでした。

>>530
$ ./stat pnmnoraw.exe
で試しましたが、駄目でした。

>>531
拡張子は全て表示する設定にしてあります。
正式名称を調べても、「pnmnoraw」のみでした。
533デフォルトの名無しさん:2007/08/07(火) 20:10:27
ショートカットかもね。 pnmnoraw.exe.lnk で試してみそ。
534デフォルトの名無しさん:2007/08/07(火) 20:11:05
あ、pnmnoraw.lnk かも。
535デフォルトの名無しさん:2007/08/07(火) 20:11:23
pnmnoraw.lnk とかも
536デフォルトの名無しさん:2007/08/07(火) 20:12:26
ショートカットファイルを直接調べて
目的は果たせるんだろうか?
537528:2007/08/07(火) 20:25:25
>>533-536
ありがとうございます。
$ ./stat pnmnoraw.exe.lnk

$ ./stat pnmnoraw.lnk
も試してみましたが、相変わらずエラーが出ます。
538デフォルトの名無しさん:2007/08/07(火) 20:32:33
>>512
みたいな書き込みは本当にやめて欲しい。
アップローダくらい知ってるだろうし。
あんな長々とした書き込みは読む気せん。
539デフォルトの名無しさん:2007/08/07(火) 23:24:09
>528
うちのところだと /usr/bin/pnmnoraw は指し先のファイルが存在しないシンボリックリンクになってるな。
stat(path,&buf) になってるところを lstat(path, &buf) にしてみるとシンボリックリンク自体の属性が表示できるはず。
stat だとシンボリックリンクの参照先の属性を表示しようとするので、今回の場合は参照先が存在しないから No such file or directory になる。
540デフォルトの名無しさん:2007/08/07(火) 23:33:37
>>528
試しにls -l pnmnorawとかfile pnmnorawした結果を貼ってみてくれないか。
541デフォルトの名無しさん:2007/08/08(水) 00:10:35
>>539
なるほど、そういうことでしたか。
statはリンクの参照先に関する情報を読み込むんですね、
おかげ様で理解できました!
私の望んでいたものは、まさにそのlstatの挙動です。
どうも有難うございましたm(__)m

>>540
$ ls -l pnmnoraw
lrwxrwxrwx 1 [user] なし 17 Jan 11 2007 pnmnoraw -> pnmtoplainpnm.exe

$ file pnmnoraw
pnmnoraw: broken symbolic link to `pnmtoplainpnm.exe'

確かに"broken"でした。
542デフォルトの名無しさん:2007/08/08(水) 00:20:12
すみません、C言語の勉強を始めるためLSI C-86体験版を落としたのですが、どうにもコンパイルができずにエラーばかり出てきます。


このような場合はどうすればコンパイルできるようになるでしょうか?
唐突な質問ですみません。
543デフォルトの名無しさん:2007/08/08(水) 00:23:12
>>542
コンパイラを変えてみるとか。
544デフォルトの名無しさん:2007/08/08(水) 00:24:14
いくらなんでもlsicはないだろ・・・
cygwinのgccかmingwinでも使っとけ。
545デフォルトの名無しさん:2007/08/08(水) 00:27:07
Borland C++ Compilerもまあまあいいよ
546デフォルトの名無しさん:2007/08/08(水) 00:27:30
>>542
LSICって16bitだっけ?とにかく過去の遺物だからほかのがいいよ
547デフォルトの名無しさん:2007/08/08(水) 00:30:17
皆さん短時間にレス、本当にありがとうございます。

>>545
持っているのですが、それもコンパイルができないのです…orz


今外出先なので、後ほどまた参ります。
それでは。
548デフォルトの名無しさん:2007/08/08(水) 00:31:32
549デフォルトの名無しさん:2007/08/08(水) 00:34:21
int array[3][4];

int型の大きさ4の配列を要素にもつ大きさ3の配列ですよね

あってます?
550デフォルトの名無しさん:2007/08/08(水) 01:05:20
3行4列の行列だと思えばよろし
551デフォルトの名無しさん:2007/08/08(水) 01:07:19
便乗質問

int a[ ][@]={{1,2,3,4},{5,6,7,8}};

のとき、@に入れるべきは2?それとも4?
552デフォルトの名無しさん:2007/08/08(水) 01:10:30
だから BCC はクソだって。
C++ の現在の仕様は 2003 年のものだぜ?
それ以前のものはどうあってもクソ。
553デフォルトの名無しさん:2007/08/08(水) 01:10:46
bccは初期設定できれば結構初心者に優しいと思うんだけどなぁ
554デフォルトの名無しさん:2007/08/08(水) 01:12:06
>>551
[2][4]
ってかそれくらいコンパイルしてみればすぐわかる。
2入れたらコンパイルエラー出るでしょ。
555デフォルトの名無しさん:2007/08/08(水) 01:13:24
>>554
出ないから聞きました
556デフォルトの名無しさん:2007/08/08(水) 01:17:27
>>555
出るようなコンパイラに乗り換えることをお勧めする。
会社での指示等で環境の変更が難しいなら必死で規格を勉強をしてください。
557デフォルトの名無しさん:2007/08/08(水) 01:18:23
いや、遊びだからどうでも良かったんだけどね
558デフォルトの名無しさん:2007/08/08(水) 01:19:02
私とは始めからそういう関係にするつもりだったのね!
559デフォルトの名無しさん:2007/08/08(水) 01:20:45
いえ、教えてくれてありがとうございました
560デフォルトの名無しさん:2007/08/08(水) 01:22:15
>>552
おまえが適切にプログラミングできないのが糞だって気づいてくれ
561デフォルトの名無しさん:2007/08/08(水) 01:23:49
弘法筆をなんちゃらってやつだね
562デフォルトの名無しさん:2007/08/08(水) 01:25:52
筆下ろし?
563デフォルトの名無しさん:2007/08/08(水) 01:26:33
うぜぇ
処理系押し付けスレでも立ててそっちでやれや
564デフォルトの名無しさん:2007/08/08(水) 09:46:43
「やってみれば解る」の意外な弊害
565デフォルトの名無しさん:2007/08/08(水) 09:50:25
>>503
ありがとう。
566デフォルトの名無しさん:2007/08/08(水) 10:34:56
なんでこうも、やってみないか?ウホッな奴が多いんだ
567デフォルトの名無しさん:2007/08/08(水) 11:49:38
昨夜質問させて頂いた者です。

>>548をダウンロードしてみたのですが、コンパイルしてもコマンドプロンプトで認識されませんと出たり、存在しませんなどと出てきます。

教えて君ですみませんが、解決策をよろしく頼みます。
568デフォルトの名無しさん:2007/08/08(水) 11:50:19
readme100回読め
569デフォルトの名無しさん:2007/08/08(水) 11:50:38
>>567
自分が何をやったのか、一つ一つ書いてみ
570デフォルトの名無しさん:2007/08/08(水) 12:05:52
どうもです。

>>569

まず>>548をダウンロードし、その後にデスクトップに作成したフォルダに解凍しました。
その後Borland C++Compiler / Turbo Debuggerを落とし、cpadの初回起動の設定画面でBorland C++Compiler / Turbo Debuggerを解凍
したフォルダからBin→bcc32を選択し、OKをクリックしました。


コマンドプロンプトでは「内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません」と出てきます・・・。
571デフォルトの名無しさん:2007/08/08(水) 12:14:17
BCCのパス通してなくね?
572デフォルトの名無しさん:2007/08/08(水) 12:21:52
>Bin→bcc32を選択し、OKをクリック
この直後に「コマンドプロンプトでは「内部コマンド・・・」って出るの?
573デフォルトの名無しさん:2007/08/08(水) 12:29:23
VC++ 2005 Express でいいじゃん
574デフォルトの名無しさん:2007/08/08(水) 12:33:04
レスありがとうございます。

>>571
パスですか?具体的にどのようなことをすれば・・・すみません。

>>572
書き方が悪くて申し訳ない。
OKをクリックしてcpadを起動した後、簡単なプログラムを打ってコンパイルすると
コマンドプロンプトにそう出てきます。
575デフォルトの名無しさん:2007/08/08(水) 12:37:43
実行タブ→設定をクリックして、必須のとこをちゃんと設定したか?
576デフォルトの名無しさん:2007/08/08(水) 12:38:48
実行タブじゃなくてメニューの実行だった・・
577デフォルトの名無しさん:2007/08/08(水) 12:46:42
bccはちゃんとインストールしたのか?
解凍、としか書いてないが解凍だけしてインストールして無いとかの落ちじゃないよな
578デフォルトの名無しさん:2007/08/08(水) 13:16:58
皆さんレスありがとうございます。

なんとかコンパイルできるようになりましたが、テキスト通りのサンプルプログラムを入力したにも関わらず「stdio.hをオープンできない」、
「プロトタイプ宣言の無い関数printfの呼び出し」とコマンドプロンプトに表示されるのですが、どのようにして解決すればいいのでしょうか?


何度も申し訳ない。
579デフォルトの名無しさん:2007/08/08(水) 13:20:01
コマンドプロンプトに表示?
580デフォルトの名無しさん:2007/08/08(水) 13:22:03
もともとどのファイルをインストールしたんだ?
同じような質問があって、アップデート用の差分しか入ってないやつを
インストールして(当然stdio.hは入ってない)、同じエラーで困ってるのがいたが。

cpadからならツールメニューのbcc32.cfgの編集の-Iのとこに書かれた場所に
該当ヘッダファイルがあるか調べてみ

ってcpadとbccをさっき初めてインストールして初めて使ってみてるんだけどな
581デフォルトの名無しさん:2007/08/08(水) 13:27:53
>>579
はい。その通りです。

>>580
-I"C:\Documents and Settings\○○ ○ \デスクトップ\新しいフォルダ (3)\Include"
-L"C:\Documents and Settings\○○ ○ \デスクトップ\新しいフォルダ (3)\Lib"



-L"C:\Documents and Settings\○○ ○ \デスクトップ\新しいフォルダ (3)\Lib"

というものはもうあるのですが、ここに何か付け足すのですか?
ちなみに○○の部分は私の名前です(汗
582デフォルトの名無しさん:2007/08/08(水) 13:31:03
エクスプローラーで
C:\Documents and Settings\○○ ○ \デスクトップ\新しいフォルダ (3)\Include
のフォルダにstdio.hがあるか探してみな
583デフォルトの名無しさん:2007/08/08(水) 13:32:09
つーか、、、インストール先が
C:\Documents and Settings\○○ ○ \デスクトップ\新しいフォルダ (3)
ってことは、インストールして無いんじゃね?
584デフォルトの名無しさん:2007/08/08(水) 13:36:20
C言語関係ないような気がする
585デフォルトの名無しさん:2007/08/08(水) 13:36:57
bcc勧めると結局こうなるんだよな
586デフォルトの名無しさん:2007/08/08(水) 13:39:22
BCC :パソコン初心者で設定できない
VC++EE :項目大量でパニくる
587デフォルトの名無しさん:2007/08/08(水) 13:47:40
レス、ありがとうございます。

>>582
すみません・・・stdio.hはありませんでしたorz
これはどうするべきでしょうか?
初歩的な質問ばかりでごめんなさい。
588デフォルトの名無しさん:2007/08/08(水) 13:49:11
>>587
bccのインストールのやりなおし。できればダウンロードから。
VC++問い打てもある
589デフォルトの名無しさん:2007/08/08(水) 13:53:44
MS社の無料のやつは600MBあるぞ
>>587はダイヤルアップだよね、大丈夫かな?
590デフォルトの名無しさん:2007/08/08(水) 14:14:16
ネットに散在する情報だけでうまくできないときは、
インストールから丁寧に書いてある入門書探してやったほうが効率いいよ。
金かかるけど。
591デフォルトの名無しさん:2007/08/08(水) 14:36:34
皆さん、親切な返答ありがとうございます。

とりあえず、今はLSI-C86を使ってみたのですが、今度はコマンドプロンプトで
can't open: \BIN.c: No such file or directoryと出てきました。
何度もすみません、解決策をご教授お願いします・・・。

>>590さんの言う通りに本屋行って入門書買った方がいいのかな・・・orz
592デフォルトの名無しさん:2007/08/08(水) 14:43:58
パトラッシュ、、ぼくもう・・
593デフォルトの名無しさん:2007/08/08(水) 14:48:36
コマンドプロンプトを使えてないっぽいな
594デフォルトの名無しさん:2007/08/08(水) 15:07:21
面倒がないよう分からないうちはc:\直下にインストール下方がいいと思う、英語名で
595デフォルトの名無しさん:2007/08/08(水) 15:09:18
コマンドプロンプトみたいなショボいものを使うからCUIが好きになれないんだ
最初からzsh使っとこうぜ!!
596デフォルトの名無しさん:2007/08/08(水) 15:15:10
LSI-C86なんて時代遅れな物使うなよ
597デフォルトの名無しさん:2007/08/08(水) 15:33:37
bcc をインストールしたときのファイル名は何だ?
598デフォルトの名無しさん:2007/08/08(水) 15:40:09
だからさー、bccはアップデート版ダウソしてんだよ。
中にstdio.hがあるわけない。
ダウンロードページを三回読み直して来いよ。
599デフォルトの名無しさん:2007/08/08(水) 15:41:11
ファイル名が、freecommandlinetools2.exe じゃないならやりなおしで。
600デフォルトの名無しさん:2007/08/08(水) 15:56:52
なぜこのレベルでプログラミングなんぞに手を出そうと思うのか
601デフォルトの名無しさん:2007/08/08(水) 15:57:57
多分コーディングだけは天才的なんだよ
602デフォルトの名無しさん:2007/08/08(水) 16:04:09
まあ皆最初はこんなもんだろうけど・・・。
質問したりしないよなぁ、調べれば済むレベルなんだし。
603デフォルトの名無しさん:2007/08/08(水) 16:29:24
俺最初の頃はバッチファイルとか全然分からなかったし、ずっとBINフォルダのなかにソースコードおいてコンパイルしてたよ
604デフォルトの名無しさん:2007/08/08(水) 16:49:12
>BINフォルダのなかにソースコードおいてコンパイル
その発想はなかったわwww
605デフォルトの名無しさん:2007/08/08(水) 17:42:29
「パスを通す」っていう概念を知らないんだな
606デフォルトの名無しさん:2007/08/08(水) 17:53:32
いきなりコンパイルなんてしなかったからなあ。
コマンドラインで使うコマンドやらシェルやらを覚えて
その延長にコンパイルがあったからなあ。
今はそれをすっとばしていきなりコンパイルするから大変だなw
607デフォルトの名無しさん:2007/08/08(水) 18:52:02
俺カレントの概念を知らなくて毎回フルパスで打ってたわw
608デフォルトの名無しさん:2007/08/08(水) 18:59:22
ファイルをD&Dでフルパスを入力できるけどなw
609デフォルトの名無しさん:2007/08/08(水) 19:24:30
D&Dができない環境とか想像もできないのかな……
610デフォルトの名無しさん:2007/08/08(水) 20:32:01
質問なんですが、ある関数内でmallocでメモリを確保した場合、使い終わったらfreeをしたほうがいいですか?
それともその関数が終わると勝手にメモリを開放してくれるのでしょうか?
611デフォルトの名無しさん:2007/08/08(水) 20:35:26
>>610
したほうがいいんじゃなくて
しなければならない
612デフォルトの名無しさん:2007/08/08(水) 20:36:09
今来ました
BCCって2バイト文字のパスおkだったっけ?>>581
613デフォルトの名無しさん:2007/08/08(水) 20:36:25
>>610
メモリを確保する関数と解放する関数は別にする場合もあるけどしなくていいわけじゃないよ
614610:2007/08/08(水) 22:03:14
回答ありがとうございます。

ということは、関数が終わってもメモリは解放されないから
必ずfreeを使わなければならないのですね。

あと、freeを使う場合というのはmallocでメモリを確保したときだけでいいのでしょうか?
例えば、foo(char *ptr1, char *ptr2)という関数があったとして、
mainでchar *ptrを宣言してfoo(ptr, "DOSUKOI")とした場合、
foo関数ではfree(ptr1);free(ptr2)とするということでいいんですか?
615デフォルトの名無しさん:2007/08/08(水) 22:04:54
>>614
malloc()で確保したやつだけでいいよ。
つか、てきとうに入門書でも買ったほうが効率よくね?
616デフォルトの名無しさん:2007/08/08(水) 22:07:45
>>614
freeで開放するのは、malloc や calloc , realloc で確保したもののみです
617デフォルトの名無しさん:2007/08/08(水) 22:08:27
>>614
maloc(), calloc(), realloc()で確保したメモリ以外をfree()に渡してはいけません。
618610:2007/08/08(水) 22:49:36
>>615>>616>>617
わかりました。ありがとうございます。
確保したものだけfreeを使うんですね。
619デフォルトの名無しさん:2007/08/08(水) 23:33:07
内部的にメモリを malloc などで確保して返す関数を使う時もそうやね。
自分で作った関数はその点を把握して使うだろうから問題ないと思うけど、
どっかのライブラリの関数を使う時は注意が必要。
620デフォルトの名無しさん:2007/08/08(水) 23:44:26
Cってどんな場面で使います?

CでGUIなんてかなり面倒だし、まさOSを作ってるなんて人は少ないでしょうし・・・
621デフォルトの名無しさん:2007/08/08(水) 23:52:15
C++と比較してってこと?
CもC++も含めて?
622デフォルトの名無しさん:2007/08/08(水) 23:52:29
OS以外にも組込用途やデバイスドライバなどといった低水準なプログラムはあるし、
プログラミングの入門でも広く使われていると思う。
623デフォルトの名無しさん:2007/08/08(水) 23:56:17
関数の中でグローバル変数のような振る舞いしてくれるものを宣言したいのですが、どうやるんでしょう?
624デフォルトの名無しさん:2007/08/08(水) 23:58:26
たまにC++の仕事をやっても、ベター Cな使い方しかされてないな。
C++なのはIDEが生成した部分だけとか。
625デフォルトの名無しさん:2007/08/08(水) 23:59:16
>>623
何をしたいのかよくわからんがstaticのことか?
626デフォルトの名無しさん:2007/08/08(水) 23:59:37
>>623
グローバル変数のような振る舞いってのがどんなのかわからんが、
グローバル変数を関数内で使うんじゃだめなの?
627デフォルトの名無しさん:2007/08/09(木) 00:38:18
本当はグローバル変数や静的局所変数なんて作らずに、
構造体でも作って渡した方がいい。
628デフォルトの名無しさん:2007/08/09(木) 00:48:09
>>627
???
629デフォルトの名無しさん:2007/08/09(木) 00:54:34
BREW?
630デフォルトの名無しさん:2007/08/09(木) 01:07:19
>>628
おまいはグローバル変数まみれのプログラム作ってんのか?
最悪だな。
631623:2007/08/09(木) 01:11:20
説明多分下手なのでソースの一部を・・

int Count = 0;
func()
{
switch(Count) {処理}
if(Count==600)Count=0;
Count++;
}
このCountをfuncの中で宣言したいんですが
普通に宣言すると駄目なので何か特殊な宣言方法ってありませんか?
632デフォルトの名無しさん:2007/08/09(木) 01:13:56
static int count = 0;
633623:2007/08/09(木) 01:20:58
>>632
まじですか・・・出来ました
ありがとうございます
staticすごいですね
634デフォルトの名無しさん:2007/08/09(木) 01:22:00
>>631
ちょっと気になったんだけど、switchの処理の時
Countの値の変遷は0〜600→1〜600→1〜600・・・でいいの?
635デフォルトの名無しさん:2007/08/09(木) 01:22:56
>>631みないなことを実現したい場合、ほぼ迷わずstaticなんだが・・・
これを上流で定義して、下流に引数として渡していくのを推奨?
場合によっちゃその方がいいのもあるような気もするがパッとは思い浮かばんな。
ってか、構造体なんて絡む内容か?
636623:2007/08/09(木) 01:32:55
>>634
なんだかデバッグしてくれてありがとうございますw
あれじゃまずいです
まだ作ってる段階のソースだから適当に書いてました
637デフォルトの名無しさん:2007/08/09(木) 01:35:32
便乗してエスパーデバック
count=(count+1)%600; // 0-599 の数値でループ
638623:2007/08/09(木) 01:45:07
>>637
質問しにきてここまでしてもらえるなんて
本当にありがとうございます・・・
大切に使わせて貰います
639デフォルトの名無しさん:2007/08/09(木) 01:46:49
自分ならインクリメントしてからifを書くかな
Count++;
if(Count==600)Count=0;//0-599でループ
あとこれは使わないだろうけど思いついた奴
Count = ++Count==600 ? 0 : Count;
640デフォルトの名無しさん:2007/08/09(木) 01:50:41
>>635
本当に1つしか要らないのなら static でもいいのかもしれんがね。
641デフォルトの名無しさん:2007/08/09(木) 01:54:21
よく型名の後ろについている_tってなんですか
642デフォルトの名無しさん:2007/08/09(木) 01:56:01
typeの意味
643デフォルトの名無しさん:2007/08/09(木) 01:57:37
>>641
type の略
一般的な単語のままだと名前が衝突しやすいので _t をつけてる (size_t とか)
644デフォルトの名無しさん:2007/08/09(木) 01:59:17
>>640
いくつあっても引数で渡す必要がでてくるわけじゃないよね?
数が増えたなら構造体をstaticにしない?

なんか、煽りみたいになってごめん。
645デフォルトの名無しさん:2007/08/09(木) 02:46:48
func()をマルチスレッドで呼び出すと問題がおきるんぢゃ中田家? > static
646デフォルトの名無しさん:2007/08/09(木) 03:22:45
>>644
同じ処理を2つ同時に扱いたい場合、これじゃできないっしょ。
両者でカウンタが共有されるから。
647デフォルトの名無しさん:2007/08/09(木) 07:54:15
>>646
>644にはマルチスレッドと言う発想がないだけだと思われ。
まぁ、標準関数限定だとマルチスレッドを考慮する必要がないからね。
648デフォルトの名無しさん:2007/08/09(木) 08:33:12
別にマルチスレッドじゃなくても問題になるさ。
strtok を2種類の文字列の同時解析に使うのが少しややこしいのと同じことさ。
649デフォルトの名無しさん:2007/08/09(木) 10:20:12
GUIの場合は、意識していないけど実際にはマルチスレッドだから、そのうちはまるよ。
650デフォルトの名無しさん:2007/08/09(木) 10:34:47
質問です。
入力されたデータを読み込み、その数字の分だけchar配列を宣言することってできるの?
2と入力すれば*str[2]が宣言できて、5と入力すれば*str[5]が宣言できるみたいなことをしたいんですが。
651デフォルトの名無しさん:2007/08/09(木) 10:43:20
>>650
*str[2]かstr[2]かはっきりして欲しい。
恐らく後者とすると、

size_t = 入力された値
str* = (char*)malloc( size_t );
でいいんでないの。
652650:2007/08/09(木) 10:47:38
>>651
回答どうもです。
説明不足ですみません。*str[2]です。データを入れられるところが入力された個数ほしいので。
2と入力された場合、*str[2]を宣言して、2個の文字列データを扱いたいです。
653デフォルトの名無しさん:2007/08/09(木) 11:10:28
>>652
char ** foo = calloc(sizeof(char *), 2)
654デフォルトの名無しさん:2007/08/09(木) 11:54:19
char*にそのまま文字列を突っ込みそうな予感
655デフォルトの名無しさん:2007/08/09(木) 12:12:57
まあ痛い目にあって覚える、でもいいじゃん
656デフォルトの名無しさん:2007/08/09(木) 12:34:27
そんなこともあろうかと思ってcalloc()でクリアしておいたのだよ。
657デフォルトの名無しさん:2007/08/09(木) 13:33:06
callocなんて使ったことないな・・・
658デフォルトの名無しさん:2007/08/09(木) 20:36:58
http://www.tannertech.net/sqlite3vb/index.htm
ここに書いてあるやり方でSQLite v3.4.1のソースに手を加えて
さらに、icu.cをプロジェクトから外してコンパイルすると
1>main.obj : error LNK2001: 外部シンボル "__imp__SysAllocStringByteLen@8" は未解決です。
1>VBSQL.obj : error LNK2001: 外部シンボル "__imp__SysAllocString@4" は未解決です。
1>VBSQL.obj : error LNK2001: 外部シンボル "__imp__VariantClear@4" は未解決です。
1>VBSQL.obj : error LNK2001: 外部シンボル "__imp__SafeArrayCreate@12" は未解決です。
1>VBSQL.obj : error LNK2001: 外部シンボル "__imp__VariantInit@4" は未解決です。
1>VBSQL.obj : error LNK2001: 外部シンボル "__imp__SafeArrayPutElement@12" は未解決です。
1>VBSQL.obj : error LNK2001: 外部シンボル "__imp__CoTaskMemFree@4" は未解決です。
1>VBSQL.obj : error LNK2001: 外部シンボル "__imp__CoTaskMemAlloc@4" は未解決です。
1>VBSQL.obj : error LNK2001: 外部シンボル "__imp__SysFreeString@4" は未解決です。
こんなんが出ます。
何を修正したらコンパイル通るか、教えて(;;
659デフォルトの名無しさん:2007/08/09(木) 20:38:37
あ、コンパイル環境はvc2005exp+PSDKです
660デフォルトの名無しさん:2007/08/09(木) 20:46:48
661デフォルトの名無しさん:2007/08/09(木) 20:47:27
>>659
リンクするライブラリが足りない
662デフォルトの名無しさん:2007/08/09(木) 20:50:05
663デフォルトの名無しさん:2007/08/09(木) 20:52:35
たとえば SafeArrayCreate だったら
oleauto.hに WINOLEAUTAPI_(SAFEARRAY *) SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND * rgsabound); こうあるんだけど

リンク足りないは
どこでかくにんすればいいですか?
664デフォルトの名無しさん:2007/08/09(木) 20:55:37
665デフォルトの名無しさん:2007/08/09(木) 21:14:55
むずい・・・色々な原因が考えられるの?
俺の場合は何が一番可能性高いんだ??
666デフォルトの名無しさん:2007/08/09(木) 21:21:19
誰?
667デフォルトの名無しさん:2007/08/09(木) 21:27:25
>>663
ある関数のためにどのライブラリが必要かは1個ずつリファレンスでも見ないと判らない。

http://msdn2.microsoft.com/en-us/library/ms221234.aspx
>Library: Use oleaut32.lib

次からは自分で調べれ。
668デフォルトの名無しさん:2007/08/09(木) 21:37:18
>>667
d ただ、それはhからあたりつけて調べてました
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/
を見て環境を設定したので
oleaut32.libのある場所はパス通してあるんだけど・・・
なんでcはこんなに分かり憎いんだろ
669デフォルトの名無しさん:2007/08/09(木) 21:47:42
#pragma comment(lib, "oleaut32.lib")
670デフォルトの名無しさん:2007/08/09(木) 21:56:56
>>668
プロジェクトのプロパティのリンカの入力の依存ファイルにoleaut32.libを追加するか
ソースの適当なとこに>>669を入れる

Cで不便なとこを見てそれ以降の言語が直してきたからな、あきらめろ
671デフォルトの名無しさん:2007/08/09(木) 22:14:57
>>670

1>VBSQL.obj : error LNK2001: 外部シンボル "__imp__CoTaskMemFree@4" は未解決です。
1>VBSQL.obj : error LNK2001: 外部シンボル "__imp__CoTaskMemAlloc@4" は未解決です。

へった!減ったよ!!ありがとう!

もいっこか・・・しらべる
672デフォルトの名無しさん:2007/08/09(木) 22:18:08
できt!!!!!!
とてもとても助かりました。ありがとう
6731/2:2007/08/10(金) 22:01:34
はじめまして。構造体について質問です。

typedef struct
{
float x,y,z;
}STR_A;

という3つの要素を持つ構造体をメンバの一部に使用した構造体

typedef struct
{
STR_A P1_POS;
STR_A P1_MOV[8];
int keyin;
}PLAYER;

を作成しました。
6742/2:2007/08/10(金) 22:02:30
次に、この構造体のグローバル配列

PLAYER g_friends[];

を作成し、中身を順次初期化しようとして

PLAYER g_friends[2] =
{
{
 {
  { .0f, .0f, .0f }
 },

 {
  { .1f, .1f, .2f }, 〜中略〜 { .8f, .8f, .8f }
 },

 10,
},

{
(もう一度別の要素を入れて繰り返す)
}

};

のように組んだところ、「要素が多い」とエラーが出ました。
要素数を何度も見直しているのですが、うまくいきません。

情報不足の感もありますが、どなたか教えていただけますでしょうか。
よろしくお願いいたします。
675デフォルトの名無しさん:2007/08/10(金) 22:07:52
そのようなものなんの役に立つんだ?
676デフォルトの名無しさん:2007/08/10(金) 22:09:08
>>674
カッコが多すぎるな。
こうじゃね?

PLAYER g_friends[2] =
{
{
 { .0f, .0f, .0f },

 {
  { .1f, .1f, .2f }, 〜中略〜 { .8f, .8f, .8f }
 },

 10,
},

{
(もう一度別の要素を入れて繰り返す)
}

};
677デフォルトの名無しさん:2007/08/10(金) 22:24:49
来年から専門学校に通うプログラミング未経験者です
本当に初歩的な質問なんですがプログラミングに最低限必要な算術ってなんですか?

初歩的過ぎてすいません
678デフォルトの名無しさん:2007/08/10(金) 22:33:21
算術って何だ?
ついでに言うと、何のプログラム組むかによって違うわ。
679デフォルトの名無しさん:2007/08/10(金) 22:37:55
>>677
四則演算(足し算、引き算、掛け算、割り算)で十分。

プログラミングを始める人で「数学に自信がないけど大丈夫?」と心配する人が多いけど
まったく無問題。

極端に言うと小学校の算数レベルでおk
680デフォルトの名無しさん:2007/08/10(金) 22:39:57
逆に数学を必要とするプログラミングは大学理工系卒でないと無理。
でもそういうプログラムを書いている人は100人にひとり。特殊なプロジェクトだけ。
681デフォルトの名無しさん:2007/08/10(金) 22:40:15
CのCUIプログラミングをそこそこ勉強したのでGUIに手を出そうとしても高いハードルが・・・
人によってはJAVAかC# C++に乗り換えちまえと言う人が居るのですが
実際のところどうなのでしょうか?
雑誌などでもJAVAやC#を推す声も増えてるみたいですが
682デフォルトの名無しさん:2007/08/10(金) 22:43:15
>>677
今からでも進路を考え直したほうが良いと思う
今後職業プログラマの数はそんなに必要とされない(だろう)から
683デフォルトの名無しさん:2007/08/10(金) 22:43:24
java(笑)はメリットないだろwww
684デフォルトの名無しさん:2007/08/10(金) 22:46:06
>>681
やってみてからでもいいんじゃない?
無理そうだと思ったら、乗り換えることはいつでも出来る
685デフォルトの名無しさん:2007/08/10(金) 22:48:55
>>681
GUIを書くためにはGUIライブラリーの知識が必要だね

WindowsだとCではWindowsAPIになるのかな?C++ならMFC?
まあ、どちらも大変だ。C++/MFCのほうが若干楽かな。
仕事でやるならC/WindowsAPI、C++/MFCもありだけど、そうでなければJavaかな?
C#はよく知らん。
686デフォルトの名無しさん:2007/08/10(金) 22:55:49
なんでも良くて、そんなにトリッキー(というか、.netで出来ないこと)をしないなら、
MFCよりC#の方が楽だよ。
ただし、C#とC/C++は何の関係もない似ても似つかない全く別の言語。
687デフォルトの名無しさん:2007/08/10(金) 22:56:59
thx
CしかやってないのでWindowsAPIですね
とりあえずもっとがんばってみます。
構造体とかを復習しとくと良いって聞いても
いざ最初の空ウィンドウ作るソースみると
完全に意味不明orz
これはCUIの時みたいにおまじないと思ってウィンドウプロージャだけいじってくのは無理ですかねぇ?

(オススメのサイトあったら教えてください!)
688デフォルトの名無しさん:2007/08/10(金) 23:00:18
>>687
ttp://wisdom.sakura.ne.jp/system/winapi/
たいして学ばないで理解出来る方が異常
689デフォルトの名無しさん:2007/08/10(金) 23:02:09
GUIならTk使えばラクチンだよ!もっさもさだよ!
690デフォルトの名無しさん:2007/08/10(金) 23:02:12
>>677です

>>679
ありがとうございます。数学に自信なかったので安心しました

>>682
AO試験に受かって入学金はらってますorz
今のところグラフィック専攻とプログラム専攻を選べるという状態なんですが‥
個人的にはCG専攻希望なんですがやはりPGは避けるべきなんでしょうか?
691デフォルトの名無しさん:2007/08/10(金) 23:04:24
>>687
C++Builder

おこられるだろうな
でも、C/C++でGUIを作るなら最強なんだがね
692デフォルトの名無しさん:2007/08/10(金) 23:04:25
進路相談は他所でやってくれ。
693デフォルトの名無しさん:2007/08/10(金) 23:15:39
>>687
Cしか知らないから生APIでGUIをやるってことなら、0からC#をやったほうが楽だと思われ。
694デフォルトの名無しさん:2007/08/10(金) 23:23:01
>>687
>>693
何がしたいかによるんじゃないかな?
簡単にGUIの趣味ツール作りたいならC#で間違えてないと思うけど、
細かいことやろうと思うと、C#(とかそれ以外)でも結局Win32API叩くハメになるから
CでWindowsのGUI作れるようになっとくのも悪くないと思うよ。
695デフォルトの名無しさん:2007/08/10(金) 23:54:14
以前ちょっとWin32API触ったが発狂するかと思った
なんなんだあれは
696デフォルトの名無しさん:2007/08/10(金) 23:59:43
bit演算で最後の桁(00001の1)
だけ変更するにはどうしたらいいですか
697デフォルトの名無しさん:2007/08/11(土) 00:01:08
WIN32APIだけでもちょっとしたアプリケーションなら書けるようにならないと
VC#やVC++を使っても人に自慢できるようなものはつくれないと思うよ

698デフォルトの名無しさん:2007/08/11(土) 00:01:39
10^1000程度の数字を扱うにはどうすれば良いんでしょうか
longでも足りませんし困ってます。
char型配列で1バイトに1桁だけ入れるという馬鹿っぽい実装はできましたが使う気にはならないので・・・
699デフォルトの名無しさん:2007/08/11(土) 00:02:50
>>690
やっぱ学校の勉強や宿題以外に趣味とかでもプログラミングをやるような人が伸びてる
好きでやれるってのは一つの才能だと思うよ
自分はCG詳しくないけどこの点は同じでしょう
700デフォルトの名無しさん:2007/08/11(土) 00:05:18
>>698
C言語 多倍長整数 とかでググれば幸せになれるかも
701デフォルトの名無しさん:2007/08/11(土) 00:05:55
>>696
1とXOR
702デフォルトの名無しさん:2007/08/11(土) 00:09:47
>>690
現在専門2年の俺がアドバイスをしてやろう。
まず最善の選択は入学金も諦めて今すぐ辞退、一年浪人して大学へ行く事
もちろんその辺の私立はやめろよ。
次善としては入学までに専門のカリキュラムでやる事を全て終わらせ、
専門に入ってからは大学への編入試験の勉強だけをする。
編入試験はほとんど裏口入学で、馬鹿みたいな試験でBランク国立(広島〜神戸etc)に入れる。
ただし大学で1年留年する可能性がある(つまり1年浪人したほうがまし)
もし人生をぶち壊しにしたいなら専門学校で楽しく過ごすべし

俺は2つ目を選択した。
703デフォルトの名無しさん:2007/08/11(土) 00:25:34
C#は次VSから外される可能性が高くなったんでやるだけ、無駄になる

C++でGUIライブラリ程度自作できるようにしておけ
704デフォルトの名無しさん:2007/08/11(土) 00:27:14
>>703
そんなわけないだろ。
705デフォルトの名無しさん:2007/08/11(土) 01:49:48
>>698
有効桁数が問題だな
数値をxxxxxxxx*10^1000の形にしてxxxxxxxxだけlongに入れるとか。
固定小数点とは小数点の位置が固定というだけだから、こういうもちかたも理にかなっている。
有効桁数がすべてというならお手上げだ。
706デフォルトの名無しさん:2007/08/11(土) 04:03:16
>>703
それはありえない
707デフォルトの名無しさん:2007/08/11(土) 09:16:32
>>698
もしかしたらlong doubleで表現できる範囲かもしれない。
708デフォルトの名無しさん:2007/08/11(土) 09:32:05
COBOLはソース内にSQLがかけるらしいが、C言語の場合どうなんでしょう。
本読んでも見つからないのだが。
709デフォルトの名無しさん:2007/08/11(土) 10:31:22
言語自体にそんな機能はねぇ。
SQLなライブラリ使っとけ。
710デフォルトの名無しさん:2007/08/11(土) 11:42:36
文字列ポインタ配列の個別要素のアクセス方法を教えてください。

char *s[]={"nullpo","hoge","hello"};
711デフォルトの名無しさん:2007/08/11(土) 11:44:08
s[0], s[1], s[2], ...
712デフォルトの名無しさん:2007/08/11(土) 11:45:30
>>711
ごめんなさい。言葉足らずでした。
nullpoだったら一文字づつputcharで印字したい時
とかはどのようにするんでしょうか。
713デフォルトの名無しさん:2007/08/11(土) 11:51:32
訂正します。*s[]のnullpoとかをですね。
714デフォルトの名無しさん:2007/08/11(土) 11:53:32
>>713
for(i=0;i<3;i++)
for(j=0;s[i][j]!='\0';j++)
putchar(s[i][j]);
715デフォルトの名無しさん:2007/08/11(土) 11:56:43
mallocに失敗してプログラムから抜けるときって今まで確保した領域をfreeしてから抜けないとだめ?
struct x *p;
if((p = (struct x)malloc(sizeof(struct x))) == NULL){
 //ここに今までのをfreeするコードは必要?
 exit(1);
}
716デフォルトの名無しさん:2007/08/11(土) 11:58:23
>>714
おかげさまで出来ました。
*は不必要だったのですね・・。

*(buf+i)(j)とか意味不明な事していました。
717デフォルトの名無しさん:2007/08/11(土) 12:04:24
>>715
行儀良く書くなら必要。
でも、最近のOSならプロセスが終了すると勝手に開放されるから、
要らないって考え方もあるが・・・

http://www.ne.jp/asahi/hishidama/home/tech/c/c.html
↑の「free()を実行しなくても、プログラムの終了時に・・・」あたりを嫁。
718デフォルトの名無しさん:2007/08/11(土) 12:07:42
>>717
なるほどありがとうございます
719デフォルトの名無しさん:2007/08/11(土) 12:13:55
>>716
*使うんなら*(*(s+i)+j)だな
720デフォルトの名無しさん:2007/08/11(土) 12:18:32
>>716
714が一般的な書き方だけど、
*(s[i]+j)
(*(s+i))[j]
*(*(s+i)+j)
も試してみたら?
721デフォルトの名無しさん:2007/08/11(土) 12:48:00
>>719-720
勉強になります。軽くググったんですが
触れてないサイトが多くて。
722デフォルトの名無しさん:2007/08/11(土) 12:50:32
複数ファイルのソースがあったときに
関数のプロトタイプ宣言はヘッダにまとめて書いとくのが一般的ですか?
それともそのファイルで使っているものだけをファイルごとに書くほうが一般的ですか?
723デフォルトの名無しさん:2007/08/11(土) 12:51:34
ポインタの仕様を理解してれば誰でも書ける。だから触れてないんだろ
724デフォルトの名無しさん:2007/08/11(土) 12:53:20
stdio.h を include するのが一般的ですか?
それとも使う関数のプロトタイプ宣言だけをファイルごとに書くほうが一般的ですか?
725デフォルトの名無しさん:2007/08/11(土) 12:54:46
>>722
好み次第だと思うけど、個人的にはヘッダファイルにまとめるのが一般的だと思ってる
726722:2007/08/11(土) 12:55:34
>>724
なるほどそう考えれば確かにそうですね
727デフォルトの名無しさん:2007/08/11(土) 13:07:00
>>720
どうせなら j[i[s]] とかも試そうぜー
まず使わんが。
728デフォルトの名無しさん:2007/08/11(土) 13:29:52
>>721
C言語修得のコツは、ポインタ変数、配列、[]演算子の関係を理解することなんだが、
最初のうちはわかないと思う。間違って解説してる入門本・サイトも多いし。
http://www.amazon.co.jp/%E7%A7%98%E4%BC%9DC%E8%A8%80%E8%AA%9E%E5%95%8F%E7%AD%94-%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E7%B7%A8-%E6%9F%B4%E7%94%B0-%E6%9C%9B%E6%B4%8B/dp/4797318260
でも読んでみると理解できると思う。
729デフォルトの名無しさん:2007/08/11(土) 15:28:24
>>721
http://www.amazon.co.jp/dp/4774111422
ポインタ本はこれも有名
http://kmaebashi.com/programmer/pointer.html
作者のサイトにあるポインタの解説
730デフォルトの名無しさん:2007/08/11(土) 15:41:05
お金に余裕が無いのでとりあえず>>729のサイト見てきます。
本4冊持ってるのにポインタ理解出来てなかったとはorz
731デフォルトの名無しさん:2007/08/11(土) 15:43:19
ちなみにその4冊とは?
732デフォルトの名無しさん:2007/08/11(土) 15:51:50
>>729
>ポインタに1足したら、2byteとか4byteとか進む、ということを 習った時から ? が点灯する。

たしかにオレが大昔読んだ本にも、こんなことが書いてあったけど、今でもこんな教え方してるやついるのかね?
733デフォルトの名無しさん:2007/08/11(土) 15:53:43
>>731
やさしいC
独習C
あと、学校で貰った富士通が出してる本(上下刊)
734デフォルトの名無しさん:2007/08/11(土) 16:10:42
そんだけ読めば、ポインタと配列は理解できそうなもんだが。
735デフォルトの名無しさん:2007/08/11(土) 16:40:57
>>732
君の教え方は?
736デフォルトの名無しさん:2007/08/11(土) 16:42:47
sizeof('type')の分だけ進む、位しか思いつかない
737デフォルトの名無しさん:2007/08/11(土) 16:48:41
そもそもアドレスじゃなくて、hoge型のポインタだから1単位はhoge型のサイズ分なのは当然
738デフォルトの名無しさん:2007/08/11(土) 16:49:38
>>735
人に教えたことはないけど「次の要素を指す」でいいんじゃね?
おれがCを勉強し始めたときは、PC出身のPGは、BASICかアセンブラかって感じだったから、
ポインタに1足すと1バイト進むって勘違いするやつもいた可能性もあるかなって思うけど。
739デフォルトの名無しさん:2007/08/11(土) 16:53:38
同じ記号でも、宣言文・左辺値・右辺値で意味が変わるんだよな。
その辺を整理して説明してる入門本は少ない。
740デフォルトの名無しさん:2007/08/11(土) 16:54:27
C言語だと、アドレスと参照が分かれてないから理解しづらいのは理解しづらいと思うよ。
741デフォルトの名無しさん:2007/08/11(土) 19:30:30
>>708
> COBOLはソース内にSQLがかけるらしいが、C言語の場合どうなんでしょう。
> 本読んでも見つからないのだが。
埋め込み型SQLのことか?Cでもかけるよ。
ただしコンパイルの前にDBのプリプロセッサーを介することが必要。

Cソースコード+埋め込み型SQL

(プリプロセッサー) ※DBによって違う

Cソースコード ※SQLの部分はライブラリー関数の置き換えられる

(コンパイル)

COBOLも基本的には同じ。
ただしCOBOLコンパイラとDBが同じメーカー製の場合、
COBOLコンパイラに埋め込み型SQLの処理が実装されている可能性もある。
742741:2007/08/11(土) 19:33:32
Oracle Pro*C参照
743質問:2007/08/11(土) 23:25:30
Cのライブラリってどこにあるんですか?

OSはFedoraCore6です
たぶんここら辺じゃないとう情報だけでもいいので知っていたら教えてください
744743:2007/08/11(土) 23:27:43
コンパイラはgccです
745デフォルトの名無しさん:2007/08/11(土) 23:29:41
コンパイラインストールしたあたりを調べてみるといいかもしれない。
746デフォルトの名無しさん:2007/08/11(土) 23:30:38
ヘッダファイル名で検索すれば出るだろうに
747デフォルトの名無しさん:2007/08/11(土) 23:30:45
だいたいlibってディレクトリにある
748デフォルトの名無しさん:2007/08/11(土) 23:32:19
/usr/include あたりじゃない?
749デフォルトの名無しさん:2007/08/11(土) 23:32:19
>>743
/usr/lib @ vine linux
750デフォルトの名無しさん:2007/08/11(土) 23:32:50
らいぶらりかorz
751743:2007/08/12(日) 00:02:38
/usr/includeにありました
情報ありがとうございます
752デフォルトの名無しさん:2007/08/12(日) 00:27:47
>>748
惚れそうなほどのエスパーっぷり
753デフォルトの名無しさん:2007/08/12(日) 09:29:58
ワロタ
754デフォルトの名無しさん:2007/08/12(日) 13:12:21
FedoraCore6はmakeファイルしか置いてなくて
ソースは自分で取ってこないといけないんじゃなかったっけ?
(間違ってるかもしれん)
755デフォルトの名無しさん:2007/08/12(日) 17:46:42
ん?カーネルでも再構築すんの?
756質問:2007/08/12(日) 19:29:57
OS: Ubuntu

googleの検索キーワードだけでも教えてください

コマンドを実行したあと、カーソル位置から左側の文字列をガブガブと取り込んでいきたい

どんなしたらいいの?
757デフォルトの名無しさん:2007/08/12(日) 19:47:31
void myfree(void *ptr) {
if (ptr != NULL) {
free(ptr);
ptr = NULL;
}
return;
}

int main(void) {
char *hoge = calloc(sizeof(int), 1);

myfree(hoge);
printf("%p\n", hoge);

hoge = NULL;
printf("%p\n", hoge);

return 0;
}

$gcc -std=c99 -Wall -pedantic -o test test.c
$./test
0x804a008
(nil)

myfree()内での ptr = NULL が有効にならないのは、仕様なのでしょうか。
なんとなく「やっちゃダメなのかな…危険かも」という気もするのですが、
根本的にポインタの考え方が間違っているのかとも…。。
myfree(hoge) 後にもう一度 free(hoge) を呼ぶと、実行時にものすごい勢いで
"double free" と怒られるため、解放はされているようです。
タブーなのか間違いなのか…そのあたりを御教示願います。
758757:2007/08/12(日) 19:50:01
ん? **かも…。
759デフォルトの名無しさん:2007/08/12(日) 19:53:45
>>757
void func(int x)
{
x=10;
}

func内でxを変更しても呼び出し側には影響しないのと同じ


void myfree(void **ptr) {
if (*ptr != NULL) {
free(*ptr);
*ptr = NULL;
}
return;
}

main内 myfree()呼び出し側
myfree(&hoge);
にする
760デフォルトの名無しさん:2007/08/12(日) 20:12:32
>>757
マクロでやるって手もあるね。

でも、そういうポインタをNULLにするfree()は、悪影響が大きいからやめたほうがいいと思うけど。
761デフォルトの名無しさん:2007/08/12(日) 20:19:39
>>756
何を聞きたいのかよーわからんが、エスケープシーケンス、とか?
762756:2007/08/12(日) 20:44:18
>>761
エスケープシーケンス、ぽいですね。ありがとうございました

abcdefg■

とあったら

a[1]=g
a[2]=f
a[3]=e

みたいに取得したかったので

エスケープシーケンスでがんがってみます
763デフォルトの名無しさん:2007/08/12(日) 21:11:20
>>759
ありがとうございます。

passing argument 1 of 'myfree' from incompatible pointer type.

となってしまったのですが、

myfree((void **)&hoge);

で通すことができました。
NULLを代入するのは「アドレスが入っている場所のポインタ」なので
"**" ですね…お騒がせしました。

void ** にキャストが必要ってのは、"void *" じゃないので
汎用ポインタとして受けることができないってことでしょうか…

>>760
再利用の有無にかかわらず、free したポインタは NULL 入れといた方が安全かな、
とか思ってましたが、そうでもないのでしょうか?

…もっとも、void** にキャストとかアヤシゲなことするぐらいなら、
2行使って素直に main()内で hoge=NULL した方がいいような気がしてますが…。
764デフォルトの名無しさん:2007/08/12(日) 21:30:32
>>763
> 再利用の有無にかかわらず、free したポインタは NULL 入れといた方が安全かな、 
> とか思ってましたが、そうでもないのでしょうか? 

基本的にロジック系で「バグっても動く」工夫ってよくないよね。
ヘンな入力があったり、OSのリソース確保に失敗しても、落ちないように頑丈に組むってのとはちょっと違う。
765デフォルトの名無しさん:2007/08/12(日) 21:43:30
>>763
myfree()はvoid * だったのか.見てなかった

私的にも main()内に free(hoge); hoge=NULL; の方がいいと思いますけどね

myfree()が必要になるってことは同じポインタ変数に確保と開放を繰り返すわけだし処理方法によっては危なかったり
この関数で安全性を高めようとするより、そうならないように組むべきだと思うんだけどね

どうしてもというならmyfree(char **) にしとくとか
766デフォルトの名無しさん:2007/08/12(日) 21:49:29
なぜ char
767757:2007/08/12(日) 21:49:52
>>764
え〜…超意訳で

「サボるんじゃねぃ」
「freeしたとこ見るようなコード書くんじゃねぃ」

ということで良いですか?
仰せの通りですね。精進します。(_ _;
768757:2007/08/12(日) 21:54:32
あっと、行き違いました。連投失礼します。

>>765
えと…上の超意訳に相当ですね。
心に留めます。(^^;

>>766
char なのは検証用に作ったコードなので
void * に渡す適当なポインタが欲しかっただけで…。


769デフォルトの名無しさん:2007/08/12(日) 22:01:08
いや、たぶん 「free したポインタは NULL になってるはずだ」 みたいな変な仮定をしがちになって、そういう思い込みは色々危ないよということじゃないだろうか。
770デフォルトの名無しさん:2007/08/12(日) 22:17:05
たとえば、新人君にデバッグするように指示して、その新人君がロジックは追わずに、
カンで、適当な場所に変数をクリアしたりするコードを入れて、表面上はバグの
現象が出なくなりました。
それで「デバッグ完了しました」と言って来たら「おいおい」って話になるでしょ。

(ロジックに関係なく) free()したポインタに必ずNULLを入れるってスタイルは、バグが発生する
前にこの新人君と同じことをしてるわけで。
コードにバグがあっても、それを表面化させないって点ではよけい悪いし。
ま、表面化しないバグはバグではないって考えもあるかもしれないけど。
771デフォルトの名無しさん:2007/08/12(日) 22:47:27
それは手法の問題であって、その手法を取り入れると決めた時点で
要件どおりの挙動を示すなら仕様。不具合ではない

開発メンバが個人の裁量で手法を選択できるなら、
それは個人の知識と経験や文化によって決まってくるんだから

ケチ付けたいなら設計段階のレビューで落とすなり、開発規約で決めておくもの
あとからこのやり方はおかしいとか、それはただの難癖
最初から自分色に教育しておけばいいじゃん


※必ずしも「バグを表面化させない」のが是って訳ではないよ?要はケースバイケース。
コストとクオリティを秤にかけた仕事をするのが良いのではないかと思うが、どうか?

772757:2007/08/12(日) 23:18:07
ん〜、自分はまだ修練中の身なので、そも「危険」の意味合いが
よくわかってないんだと思いますが…
もうちょっとお付き合いいただいてよいですか?

>>769
「freeしたポインタはNULL」という仮定を持って…
2重free について頓着しないコードを書いてしまう。
「色々危ない」というのは、例えばそういう「心構え」的な危険性…というか
「発想」の危険性でよいのでしょうか?

>>770
free()したポインタを参照するようなコードを書いた場合、
それはともすれば動いてしまうこともあると思っています。
なので、NULLを入れておけばそこでバグを発見できるかな…と、
そういう発想(と、どこかのWebページの記載)で「必ずNULL」という発想に至りました。

この関数を使う使わない以前の問題として、「危険」の概念とかについて、
なにかすごくタメになりそうな気がするので、もう少し具体的な動きを
御教示いただいても良いですか?
773757:2007/08/12(日) 23:35:11
すみません、また連投です…。
更新してから書き込むようにします。(T^T

>>771
今回の free()して必ずNULL で発生し得る「表面化しないバグ」というのが
具体的にどんなものかわかっていないので、コメントつけられません…。
もっとも、対象レベルが自分よりももっと上の話のようですが…。

>>770
ちょっと補足です。
「もう少し具体的な動き」は、
「"free() して必ずNULL"で発生しうる表面化しない具体的なバグ」です…。


ちょっとテンパり気味です。(^^;
774デフォルトの名無しさん:2007/08/12(日) 23:37:45
私ゃNULLにしておくのも悪くないと思うがね。
それに頼ると言うことでなく、予防措置的にね。

つーか、とっととC++に移行してmalloc()/free(), new/delete禁止にしてしまうのが一番w
775デフォルトの名無しさん:2007/08/12(日) 23:38:13
ポインタが無効か有効化を示すのにNULLは便利なんだよね。
開放の時に、

if (p != NULL) free(p);

みたいにチェックを入れなくて、

free(p);

で済むから。

でも、NULLクリアが必要な場合もあるけど、習慣として free()のあとにNULLクリアするより、
必要な場所だけでクリアするようにしたほうが読むほうにはやさしいよね。
776デフォルトの名無しさん:2007/08/12(日) 23:47:08
ちょっと流れと違うかもしれないが、バッファ確保用のポインタにNULL入れるのは違和感あるんだよね。
free()してないと、その領域が確保されたままになっちゃうから。
まあ、free()を絶対忘れないという担保があるならいいけど。

あと、直接関係ないけど、昔はNULLポインタ関連のバグがいろいろあって、
NULL(0)周辺の値をポインタ操作するとOSごと死んだりとかしてた。
そういうのもあるから、ポインタ変数にNULL(0)周辺の値を人為的に入れるのに抵抗のあるプログラマは多いかもね。
777デフォルトの名無しさん:2007/08/12(日) 23:47:08
>>773
> 「"free() して必ずNULL"で発生しうる表面化しない具体的なバグ」です…。 

free()だと二重開放。
>>770 のたとえ話は、一般論として、ロジックに関係なく、初期化やクリアをするのはよくない癖だと。

同じような話に、memset()での文字列クリア。
memset(s, 0, sizeof s);
これも、安全性を高くすると固く信じてる人が多いね。
文字列の最後の0を付け忘れたり、潰したりするバグをフォローしてくれるって考えなんだろうけど、
それはフォーローではなくて、隠しているだけという話。
778774:2007/08/12(日) 23:54:16
>>777
あ、漏れもmemset()には無条件に反対。
特に構造体をmemset()する馬鹿や構造体の代入にmemcpy()使う馬鹿。
その挙句にそのままC++でコンパイルしてるから困る。
779デフォルトの名無しさん:2007/08/13(月) 00:15:12
>>772
>なので、NULLを入れておけばそこでバグを発見できるかな…と、 

開放したポインタにアクセスするバグを見つけるなら、NULLじゃなくて、0xCC・・・で埋めるって手もあるね。
780デフォルトの名無しさん:2007/08/13(月) 00:25:55
CではなくてJavaだけど、文字列の比較は定数を左に置くという流儀があるね。

○ if ("hoge".Equals(str)) ・・・

× if (str.Equals("hoge")) ・・・

str が null でも、上の書き方ならヌルポが発生しないという考え。

これも典型的なバグを隠す書き方。

バグでstrにnullが入っていたら、ifでヌルポを防げても、どのみち、どこかでバグが表面化するのは目に見えてるのに。

むしろバグの原因の箇所と、バグが表面化する箇所の距離を遠くするだけだっちゅーの。
781デフォルトの名無しさん:2007/08/13(月) 00:28:58
memsetでのゼロクリア、そんなに悪いことかな。
気分的に、もらってきたメモリはまっさらにクリアしてから使いたいんだけど。安全性とか関係なく。
782デフォルトの名無しさん:2007/08/13(月) 00:40:10
どっちかというと悪い。
float や double やポインタはゼロクリアで 0.0f や 0.0 や NULL になるとは限らない。
移植性を気にするコードではやってはいけない。
783デフォルトの名無しさん:2007/08/13(月) 00:40:51
>>781
・潜在的バグを隠す。
・C++への移植性を落とす。

>気分的に、もらってきたメモリはまっさらにクリアしてから使いたいんだけど。安全性とか関係なく。
一々 FILE * fp = NULL とするくらい無意味だ。
そういう香具師に限ってcalloc()を使わないと言う矛盾。
784デフォルトの名無しさん:2007/08/13(月) 00:44:43
>>783
あとコードの読みやすさも。

意味のあるクリアか、意味の無いクリアか、いちいち意識して読まないといけない。
785デフォルトの名無しさん:2007/08/13(月) 00:54:03
ああ、そういえばcallocがあったね。じゃあmemsetいらないや。
786デフォルトの名無しさん:2007/08/13(月) 00:55:40
ローカル変数は?
787757:2007/08/13(月) 01:01:30
しまった…メシ食って帰ってきたら大変なことに。
皆様お付き合いありがとうございます。

根本的なバグ…というか間違いを
隠蔽してしまうようなコードを書くべきではないと、
保険となり得るかもしれないけれど、その保険で救われても
バグはバグであり、正しい動作をしているわけではない…と、
そういう風に認識しました。

実は自分的には、文字列の memset() 0 Fill も、好きな部類です。
潔癖症というか…保険的な意味合いを無視しても、
「ポインタが解放された領域を持っている」
「文字列の \0 以降に、ワケのわからないデータが入っている」
っていうのが、ちょっとイヤなんですよね…初期化厨とでも言いますか。
なので、そこに頼るつもりがなくても、意味を持ったものでなくても
やってしまうのですが、これは悪癖ですね。考えを改めます。

勉強になりました。
たくさんのレスありがとうございます。


ちょっと個別レスは厳しそうだったので…でも1つだけ失礼します。

>>780
ガッ ガッ
788デフォルトの名無しさん:2007/08/13(月) 01:08:36
>>787
You! C++に移行しちゃいなよ。
全ての構造体にコンストラクタで0フィルコードを書いておけば安心だぜw
789デフォルトの名無しさん:2007/08/13(月) 01:35:32
Hey you dance with me!
790デフォルトの名無しさん:2007/08/13(月) 03:50:48
free でポインタを NULL にするのって、
むしろバグがあった時にエラーを出しやすくする工夫じゃないのかなあ。
NULL の脱参照したら大抵の環境ではエラーになるけど、
NULL じゃないまま放っておいたら脱参照してもエラーが出ないかもしれない。
それに、NULL 入れておけば assert でチェックすることもできる。
791デフォルトの名無しさん:2007/08/13(月) 08:17:46
そもそも善悪で判断するような話じゃないよね
バグっていうのは要件を満足させない挙動を指すんだから
移植性や可読性、プログラマの手抜きとは論点が全然違う

いろんな流儀があることを理解できず、
また、自分の流儀がもっとも優れていると他人に押し付けるのは如何なものかと
趣味プログラマ多すぎ
792デフォルトの名無しさん:2007/08/13(月) 08:34:40
理解はしているが、譲らない
793デフォルトの名無しさん:2007/08/13(月) 11:36:16
>>790
それが目的の場合はNULL以外の値が好ましい。
0xCC・・・みたいなやつ。

NULLは意思を持って、ポインタを無効にする場合に使う。
794デフォルトの名無しさん:2007/08/13(月) 11:41:22
無効な値といったらフフフに決まっておろう
795デフォルトの名無しさん:2007/08/13(月) 11:43:26
こういう話題をしてると、趣味の問題とか、宗教論争ってことにされがちだけど、
文字列のmemset()クリアとか、free()後にNULLを入れるとかは、世間で評価されてるような
プロダクツのソースではほとんど見たことないし。
796デフォルトの名無しさん:2007/08/13(月) 12:04:15
NULL 以外だと移植性が・・・
797デフォルトの名無しさん:2007/08/13(月) 12:09:37
そのようなことは移植する必要があるプログラムが書けるようになって
から考えろ
798デフォルトの名無しさん:2007/08/13(月) 12:14:17
>>795
残念、某社のプロジェクトでは後者がコーディング規約で規定されている。
そのプロジェクト自体が評価されているかは微妙ではあるがw
799デフォルトの名無しさん:2007/08/13(月) 12:25:04
>>796
移植性がなくなるってのは、偶然有効なポインタになってしまう可能性があるとか?
そもそもNULLで、無効なポインタのアクセスを発見するってのも、どの環境でも使えるって方法じゃないし。
800デフォルトの名無しさん:2007/08/13(月) 12:32:58
>>798
プロっていうか、職業プログラマが使っているってことなら、おれも何度も見てるけど・・・
801デフォルトの名無しさん:2007/08/13(月) 12:34:28
>>799
どういう意味?
NULLは無効なポインタじゃないっけ?
802デフォルトの名無しさん:2007/08/13(月) 12:53:47
>>800
そりゃソースなめてバグを確認したら

そこ1行にコード追加する1の労力と
該当ロジック全修正+全テストの100の労力なら
比較対照にすらならないだろ
803デフォルトの名無しさん:2007/08/13(月) 12:58:16
>>801
NULL以外の値の話。

>>802
意味がわからないけど、対処療法的にバグをつぶすってこと?
804デフォルトの名無しさん:2007/08/13(月) 13:08:46
× 対処療法
○ 対症療法
805デフォルトの名無しさん:2007/08/13(月) 13:22:09
>>802
逆だよ。
NULLチェックを入れて、バグを見つけやすくするためにNULLでクリア。
なにもバグフィクスのためにNULL入れる訳じゃない。
806デフォルトの名無しさん:2007/08/13(月) 13:49:49
× 比較対照
○ 比較対象
807デフォルトの名無しさん:2007/08/13(月) 14:10:25
デバッグご苦労様ですw
808デフォルトの名無しさん:2007/08/13(月) 16:18:22
最近C言語の勉強を始めてDOS窓上で動く初歩的な計算機?は書けるようになりました。
何をやりたいなど具体的な事はまだ決まっておらずとりあえずC言語を使いこなせるようになりたいと考えています。
これから先はどのように勉強していけばよいのでしょうか?
GUIのプログラムが書けるようになりたいとは考えているのですが・・・。
809デフォルトの名無しさん:2007/08/13(月) 16:19:31
テーマが無いのなら、いきなりGUIに行ってみそ
目に見えるほうがモチベーション続いていいかも
810デフォルトの名無しさん:2007/08/13(月) 16:35:55
今ざっと調べてみたのですがC言語でGUIプログラムを作るというのはもしかしてかなり難しいものなのでしょうか?
811デフォルトの名無しさん:2007/08/13(月) 16:46:04
難しいからどうしたと言うのだ!お前のやる気はその程度か?
812デフォルトの名無しさん:2007/08/13(月) 16:48:57
VisualC++使った方が楽
813デフォルトの名無しさん:2007/08/13(月) 17:30:32
計算機ができたのなら、パズルを解くプログラムを作ってみるのはどうだろう。
今話題の数独は大変お勧め。
素人が総当りバックトラックで作っても1秒もしないで解けるものができあがる。
814デフォルトの名無しさん:2007/08/13(月) 19:36:38
>>810
WinMain直書きは結構しんどいよ。
まあボタン並べて計算機作る適度なら割と簡単だしやってみれば?
815デフォルトの名無しさん:2007/08/13(月) 20:01:19
ウィンドウモードのゲームのようにウィンドウ+メニュー+ダイアログ以上のことをやりたいならまったくお勧めしないな。
難しいというかひたすら面倒。
816デフォルトの名無しさん:2007/08/13(月) 20:30:29
そのとおり。難しいというかひたすら面倒。

ただただ、マイクロソフトの開発側の事情に無理やりつき合わされているという感じ。
817デフォルトの名無しさん:2007/08/13(月) 20:51:38
WindowsのGUIはサンプル集がないと書けない
だけど、サンプル集があればそれで十分
あまり頭を使わない
818デフォルトの名無しさん:2007/08/13(月) 20:57:18
CとWIN32APIでウィンドウズプログラムを書く勉強したら
人に見せれるようなものがかけるまでに2年はかかるとおもう。
正直やめたほうがいい
819デフォルトの名無しさん:2007/08/13(月) 21:14:15
だが趣味としては良い
820デフォルトの名無しさん:2007/08/13(月) 21:15:41
やっとWindowの作る次に(わからん所は飛ばしてますが)行くときにorz
企業は何の言語を使ってるんですか?
821デフォルトの名無しさん:2007/08/13(月) 21:16:21
>>820
Windowって何やねんw
ウィンドウ
822デフォルトの名無しさん:2007/08/13(月) 21:23:44
企業とだけ言われても困る
823デフォルトの名無しさん:2007/08/13(月) 21:32:41
>>822

ゲーム系と
GUI系(画像処理関係)と
ネットワーク関係
が知りたいです。
824デフォルトの名無しさん:2007/08/13(月) 21:41:39
お前はもっと根本的なことを学んだほうがいい
825デフォルトの名無しさん:2007/08/13(月) 21:48:40
GTKとかどーなんだろ。
826デフォルトの名無しさん:2007/08/13(月) 21:49:42
俺はJAVA派+C(コンソール)派だからこの流れあんまし関係ないかもしれないが
>>824
が意味不
こんだけC+APIの組み合わせが叩かれりゃ やってる初心者はあせるだろうから
答えれないならスルーしてやれよ(JAVAかわいいよJAVA^^)
827デフォルトの名無しさん:2007/08/13(月) 22:23:54
Win32APIの本ポチってwktkしてる俺に水指すなよ貴様ら^^;
828デフォルトの名無しさん:2007/08/13(月) 22:35:21
>>823
ゲームは DirectX

画像処理はそれ自体は GUI とまったく関係ない純粋なデータ構造とアルゴリズムの世界
ただ、ゲームみたいなリアルタイム 3D グラフィックスの話をしたいなら、また別

ネットワークはソケット API かね
829デフォルトの名無しさん:2007/08/13(月) 22:39:17
>>823
横からだがサンクス
830デフォルトの名無しさん:2007/08/13(月) 22:40:38
安価ミス
>>828
831デフォルトの名無しさん:2007/08/14(火) 00:03:43
えっと、ファイル上のテキストを読む方法に関する質問です。

良く書式管理されたテキスト(数値計算用のデータファイルです)を
読む場合、fscanf()を使うと何かマズいことが起こるのでしょうか?
先輩は、『fgets()とsscanf()を使え! ヴォケ!』と言うのですが、
書式が保障されているのなら、別に構わないと思うのですが。

環境は、Windowsのコンソール、unix(AIX)です。
832デフォルトの名無しさん:2007/08/14(火) 00:12:57
構わないと思うよ。 数値読むくらいなら。
%s は地雷。
833831:2007/08/14(火) 00:31:42
>>832
>%s は地雷。

即レスありがとうございます。
空白や \n に気をつけてコーディングしたいと思います。
834デフォルトの名無しさん:2007/08/14(火) 00:36:41
>>831
1行1データならいいけど、1行に複数データがあるならfscanf()だと若干難がある。
835831:2007/08/14(火) 01:18:14
>>834
レスどうもです。

----------------
This is a test data
3
1 1.23 4.56
2 7.89 1.23
3 4.56 7.89
----------------

私の場合、こんなファイルを読む場合は次レスのようにしています。
みっともないのですが、書式文が複雑にならないので、疲れている
ときでも読み間違いにくいのですw

先輩氏には酷評されていますが・・・
836831:2007/08/14(火) 01:18:56
#include <stdio.h>

int main(void)
{
char buf[256];
int i, ite, id;
float dx, dy;
FILE * fp;

if ( (fp = fopen("test.dat", "r")) == NULL) {
return 1;
}

fgets(buf, sizeof(buf), fp); printf("%s", buf);
fscanf(fp, "%d", &ite); printf("%d \n", ite);
for (i = 1; i <= ite; i++) {
fscanf(fp, "%d", &id);
fscanf(fp, "%f", &dx);
fscanf(fp, "%f", &dy);
printf("%d %f %f \n", id, dx, dy);
}

fclose(fp);
return 0;
}
837デフォルトの名無しさん:2007/08/14(火) 01:21:23
酷評する先輩に見本見せてもらって、それにあわせりゃいいじゃん。
838デフォルトの名無しさん:2007/08/14(火) 01:22:02
>>836
みたいなプログラムがなんの役に立つんだ?
839デフォルトの名無しさん:2007/08/14(火) 01:25:53
>>838
演習か何かじゃないの?
840デフォルトの名無しさん:2007/08/14(火) 01:32:53
>先輩は、『fgets()とsscanf()を使え! ヴォケ!』と言うのですが

っ コスト対効果
841831:2007/08/14(火) 01:34:37
>>837
先輩は fgets()とsscanf()を使うのですが、数値データのみを読む場合
でも必ずバッファ変数が必要なこと、1行当たりの変数の数が不定のときの
処理方法を私が知らないことから、余り使いたくないのです。

>>838
ホントはこの後に数値解析のコードが続きます。
モノホンは変数の数も多いので、即興で作りました。

>>840
教えてクンですいません。
fgets()方式の方が低コストなのでしょうか?
842840:2007/08/14(火) 01:42:19
説明不足すまそ
その先輩だかなんだかに、わざわざ fgets 使う手間に見合った良い効果がなにかある?って訊いてみたらと言いたかった
843831:2007/08/14(火) 01:46:02
>>842
レスどうもです。

そうですよね。今度聞いてみます。
先輩が正しくなる場面もあるのでしょうが、
ケースバイケースと考えています。
844デフォルトの名無しさん:2007/08/14(火) 01:46:28
>>841
strtokは?
845デフォルトの名無しさん:2007/08/14(火) 01:56:07
>>844
んなもん使うな。

>>843
データ欠落の可能性は考慮しなくていいの?
>836だとたった一個欠落しただけで大騒ぎになりそうだが。
#fgets()+sscanf()ならエラー処理できる。
行辺りのデータ数が可変の場合、%nが使えばいい。
或いは、sscanf()の代わりにstrtol(), strtod()を適宜使い分ける手もある。
この場合も、どこまで変換に使ったかは知り得るから問題ない。
846831:2007/08/14(火) 02:17:22
>>844
こんな関数があったのですね。知らなかった・・・

>>845
この場合は、データファイルはプリプロセッサが生成するので、
基本的にはファイル書式が厳守されます。

ただ、エラー処理を要求されるケースも考えておいた方が良いですよね。
実は次のようなユーティリティを考えているのですが・・・

 ・fgetc()で1文字ずつ読んで行く。文字列はスタックに積み上げる
 ・設定したデリミタが現れたら、strtol() 等で変換して返す
 ・スタックをクリアして繰り返し

こんなのを別ファイルにしておくと、バッファや型変換は隠蔽
できるかな、等と想像しています。ただ、いろいろな局面に対応しようと
すると、結構面倒くさそうで、腰が引けていました。

お陰でコーディングへのモチベーションが上がりました。
ありがとうございました。
847デフォルトの名無しさん:2007/08/14(火) 02:31:43
ttp://itpro.nikkeibp.co.jp/article/MAG/20070720/277977/
この問題の解答をCで書き換えるとしたらどんな風になりますか?
2次元座標の表現とか、進められるかどうかの判定の部分で範囲外にアクセスしてるっぽい所がよくわからないのです。
848デフォルトの名無しさん:2007/08/14(火) 03:35:47
バカだ俺、範囲チェックしてますね。動ナビ見てたら気づいた。
明日自分で解いてみよう。
849デフォルトの名無しさん:2007/08/14(火) 03:36:09
>>847
2次元座標は多次元配列でやってるだけ。
Dim a(101, 101)のとこはCではchar a[101][101];とでもすればいい。
Cでは■とかはcharに入れられないから、wchar_t使うなり、
他の文字入れるなりする必要があるけどね。

範囲外アクセスはしてないようにおもうけど。
範囲チェックしてる箇所あるし。
850デフォルトの名無しさん:2007/08/14(火) 08:44:01
>>446
strtok()ってANSI関数だよね。それぐらいは全部知っておかないと。
851デフォルトの名無しさん:2007/08/14(火) 08:47:31
まあ、strtok には少しクセがあるけどね。
852デフォルトの名無しさん:2007/08/14(火) 08:49:57
strtokについて知っておくべきことは二つ
1.使うな
2.使うな
853デフォルトの名無しさん:2007/08/14(火) 09:02:18
>>852
理由は?
854デフォルトの名無しさん:2007/08/14(火) 09:06:39
>>852が想定している理由とは違うかもしれないけど、
strtokってマルチスレッド環境では使えないし、勝手に元の文字列を書き換えるのがイヤンな感じ。
855デフォルトの名無しさん:2007/08/14(火) 09:09:24
元の文字列を書き換えるのは、書き換えていい場合には利点にもなる。
それが嫌ならコピーして使えばいいわけだし。
マルチスレッドだの、シングルスレッドでも2つ同時解析だのが
できない点の問題の方が格が上だな。
856デフォルトの名無しさん:2007/08/14(火) 09:29:02
>>846
自分もstrtokしらなかった頃があって学校の課題(の一部)でほとんど同じ関数を作ったことがある
857デフォルトの名無しさん:2007/08/14(火) 12:54:17
>>854-855
strtok_rならOK?

まぁPOSIXであってCの規格では無かったとは思うけど。
858デフォルトの名無しさん:2007/08/14(火) 13:22:45
>>857
そこまでしてstrtok()
859デフォルトの名無しさん:2007/08/14(火) 13:23:49
途中で切れちった。

>>857
そこまでしてstrtok()を使う理由がないような。
sscanf()かstrto*()で充分。
860デフォルトの名無しさん:2007/08/14(火) 14:13:13
strto* = strtok
861デフォルトの名無しさん:2007/08/14(火) 14:15:14
感動した
862859:2007/08/14(火) 14:23:50
ちくしょ〜〜w

strto{f,d,ld,l,ul,ll,ull}()だよ。
863デフォルトの名無しさん:2007/08/14(火) 14:26:31
860の着眼点に脱帽
864デフォルトの名無しさん:2007/08/14(火) 18:03:18
Cのコンパイラでビスタ対応の物教えて下さい。
865デフォルトの名無しさん:2007/08/14(火) 18:08:27
>>864
Visual C++ 2005 Express Edition
ってvista無理なん?
866デフォルトの名無しさん:2007/08/14(火) 18:45:22
いまどき、DOS窓で動くようなもの作ってどうなるの?
間違いなく売れない
867デフォルトの名無しさん:2007/08/14(火) 18:54:45
売るために作ってる人ばかりじゃないし、
コンシューマ向けのものばかりが売りものというわけでもない。
GUIがなくても売れるものは売れる。
868デフォルトの名無しさん:2007/08/14(火) 18:56:30
なんか練習したいからかなり初歩的な課題だしてくれ
869デフォルトの名無しさん:2007/08/14(火) 18:56:46
>>864
ベンダの正式対応版は年末とかにならないと出てこないだろ。
逆に既存のコンパイラがVistaで動かないって話は聞いたことがないな。
870デフォルトの名無しさん:2007/08/14(火) 19:00:06
>>867
はいはい
そうやっていつまでも、CUIで文字を逆に表示したり、並べ替えたりと
なんの意味もないプログラムを書いててください
871デフォルトの名無しさん:2007/08/14(火) 19:04:09
CUI を何だと思ってるんだろう、こいつ。
872デフォルトの名無しさん:2007/08/14(火) 19:05:24
>>870
サーバ系、Windowsのサービス系はGUIじゃないが
873デフォルトの名無しさん:2007/08/14(火) 19:06:59
>>870
はいはい
そうやっていつまでも、GUIで見た目だけ作って
なんの意味もないプログラムをウィザードで生成してください
874デフォルトの名無しさん:2007/08/14(火) 19:09:33
なかなか有意義な暇の潰し方だな
875デフォルトの名無しさん:2007/08/14(火) 20:37:09
int型の2次元配列a[5][3]に対して、0で
初期化を行うプログラムなんですが、
回答例の★の部分に関しての書き方が
理解できません。

int main(void)
{
int a[5][3];
int *p;
int i,m;

for(i=0;i<5;i++)
{
p = *(a+i); <-------★この書き方じゃアドレスの中身を渡してない??
for(m=0;m<3;m++)
{
*(p++)=0;
}
}
return 0;
}

★の箇所に関してはa[5][3]の2次元配列の
アドレスをint型のポインタ変数pに対して
代入する必要があると思っているのですが、
上の書き方ではアドレスではなく、アドレスの
中身を渡しているように思えるのですが、
C言語に詳しい方どなたかご教授お願い致します。
876デフォルトの名無しさん:2007/08/14(火) 20:44:12
int main()
int a[5][3];
for (int i = 0; i < sizeof(a) / sizeof(*a); ++i)
for (int m = 0; m < sizeof(*a) / sizeof(**a); ++m)
a[i][m] = 0;
}
}
return 0;
}
877デフォルトの名無しさん:2007/08/14(火) 20:45:31
なにそれ、ふざけてるの?
878デフォルトの名無しさん:2007/08/14(火) 20:46:10
int a[5];
p = a;

int a[5][3];
p = *a;

って感じかな
879デフォルトの名無しさん:2007/08/14(火) 20:46:24
おっと877は875へのレスね
880デフォルトの名無しさん:2007/08/14(火) 20:48:01
>876がふざけているのがばれたのかと思った。
881デフォルトの名無しさん:2007/08/14(火) 21:10:36
>int a[5][3];
>p = *a;

なんか違和感あるけど、コレってあってんの?
882デフォルトの名無しさん:2007/08/14(火) 21:19:15
上からつなげて読んでもわからないんじゃやばいな
883デフォルトの名無しさん:2007/08/14(火) 21:29:12
>>878
p = *a;
すみません、これがわかりません。

これじゃアドレスの中身をさしてる
ことになりませんでしょうか。
色々と本なんか読んでみたのですが
理解できません。
884正確には少し違うけど:2007/08/14(火) 21:59:27
二重ポインタだと思えばいいだろ
885デフォルトの名無しさん:2007/08/14(火) 22:04:16
x[5]を考える
xは&x[0]と同じアドレス

ここでa[3][5]を考える
まずa[i]をpに置き換えて考えてみると
a[i][5]はp[5]になる
pは&p[0]と同じアドレス
ということはp=a[i]なので
a[i]と&a[i][0]は同じアドレス

*(a+i)はa[i]を書き換えた形
つまりpにはa[i]、すなわち&a[i][0]を代入している
886デフォルトの名無しさん:2007/08/14(火) 22:18:26
>>875
たとえば配列として定義した a[10]の
配列名 a は配列の先頭アドレスを意味します。
a は &a[0]と同じ、a+i は &a[i] と同じ意味になります(はず)。
したがって、*(a+i)== a[i] です。

>>875 は 二次元配列ですから、
*(a+i) == a[i]ならば *(a+i)==&a[i][0]と同じ意味ではないでしょうか?
887デフォルトの名無しさん:2007/08/14(火) 22:19:02
>>885
あー、すげー。
なるほどー。
すごい理解しました。
ありがとうございます。

888デフォルトの名無しさん:2007/08/14(火) 22:31:24
あのー、あともう一つ、理解できないのがreturn文に
関してなんですが、戻り値としてセットした値は
メモリ上のどこに保持されているのでしょうか?
スタック上では関数を抜けたタイミングで値は消去されて
しまうと思うのですが。
これも本なんかで色々調べてみたのですがどうも
良く分かりません。
889デフォルトの名無しさん:2007/08/14(火) 22:35:29
>>888
基本の型であれば、レジスタに入ると思います。
大きいのは、呼出元でリターン用にスタック領域を確保するのかな?(憶測)
890デフォルトの名無しさん:2007/08/14(火) 22:39:30
>>889
やっぱり基本的にはレジスタに入ると考えて
良いんですね。

色々とありがとうございました。
すっきりしました。
891デフォルトの名無しさん:2007/08/14(火) 22:42:09
>>888
コンパイラのアセンブリ言語出力のオプションやってみればいい。
892デフォルトの名無しさん:2007/08/14(火) 23:39:06
入門するにあたり、
オススメの参考書ありますか?
893デフォルトの名無しさん:2007/08/14(火) 23:44:48
ありません。
894デフォルトの名無しさん:2007/08/14(火) 23:50:28
>>892
片っ端から読みなさい
895デフォルトの名無しさん:2007/08/15(水) 00:39:27
C言語初心者です。
さっき猫でもわかるC言語って本を買ってきて読んでるんですが、
付属のCD-ROMのコンパイラーが動きません。
何が何だかわかんないんですが、誰かアドバイス願います。
896デフォルトの名無しさん:2007/08/15(水) 00:44:26
C言語初心者ってだけじゃないだろ?
897デフォルトの名無しさん:2007/08/15(水) 00:53:28
じゃあアドバイス。
症状すら説明できないPC初心者にはプログラムは出来ません。
898デフォルトの名無しさん:2007/08/15(水) 00:58:18
コマンドプロンプトらしきアイコンをクリックしても表示されないのです。
899デフォルトの名無しさん:2007/08/15(水) 01:02:26
一応、本の通りにインストールしたんですけど・・
1. freecommandlinetools.exe を実行します。無料の C++Builder 5
コマンドラインツール開発システムをインストールしたいドライブと
フォルダを選択します。

2. インストール先の bin ディレクトリで次の手順を実行します。
a. 既存のパスに "c:\Borland\Bcc55\bin" を追加します。
b. bcc32.cfg ファイルを作成します。このファイルは,Include
および Lib パスのコンパイラオプション(コンパイラの -I
および -L スイッチ)を設定するものです。ファイルには次の
行を含めてください。
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
c. ilink32.cfg ファイルを作成します。このファイルは,Lib
パスのリンカオプションを設定するものです。ファイルには
次の行を含めてください。
-L"c:\Borland\Bcc55\lib"

2の「既存のパス」ってとこが分からないのですよ。。

900デフォルトの名無しさん:2007/08/15(水) 01:12:21
>>899
環境変数PATHの事です。
901デフォルトの名無しさん:2007/08/15(水) 01:13:43
mallocに失敗した場合もそのポインタはfreeしたほうがいいのですか?
exitする気はありません。
902デフォルトの名無しさん:2007/08/15(水) 01:15:27
mallocに失敗したらNULLが帰るからfreeに突っ込んでも無意味。
903デフォルトの名無しさん:2007/08/15(水) 01:19:16
mallocに失敗した場合はちょビットも領域は確保されないんですか?
904デフォルトの名無しさん:2007/08/15(水) 01:34:08
ちょびっつも確保されない
905デフォルトの名無しさん:2007/08/15(水) 01:53:32
>>901
失敗した場合は全く確保されませんが、そもそも失敗することは先ずありません。
寧ろ、失敗したときには安全に動作できるかどうかさえ怪しい状況になっていることも多いので、
メモリ確保に失敗したときは素直にexit()する方が無難です。
906デフォルトの名無しさん:2007/08/15(水) 02:01:02
>>905
malloc(1<<30)
を実行すると安全に動作するかどうか怪しくなるの?
907デフォルトの名無しさん:2007/08/15(水) 02:06:44
んにゃ、Linuxで際限なくmalloc()を繰り返してみればすぐに判るけど、
スワップしだすと途端に色々怪しくなる。
つーか、1GBを確保するくらい、何の問題もないでしょ。
908906:2007/08/15(水) 02:21:01
>>907
malloc が成功した時と失敗した時とでアルゴリズムを変化させるなど
malloc が失敗したからといって必ずしも exit する必要はないと思います

ちなみに次のコードは確保した領域にアクセスしないので、
スワップはしないと思いますが、malloc は失敗します

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

int main(void){
void *ptr;
int i;
for(i=1;;i++){
printf("%d th malloc\n", i);
ptr=malloc(1<<30);
if(ptr==NULL){
printf("Memory allocation failed.\n");
exit(1);
}
}
return 0;
}
909デフォルトの名無しさん:2007/08/15(水) 03:16:11
>>907
OSに設定されてるプロセスで使えるメモリ空間のサイズによるんじゃ?
Fedoraとかのデフォルトってunlimitedじゃ無かった気もする。
Windowsは2Gだっけ?
詳しいサイズは忘れちまったい。
910デフォルトの名無しさん:2007/08/15(水) 06:54:33
そんなに連続した仮想メモリ空間がないかもしれない
911デフォルトの名無しさん:2007/08/15(水) 07:56:13
>>908
1GB単位で何回も確保しようとしたらそりゃ失敗するだろ。
そんな馬鹿な使い方なんか普通しないって。
912デフォルトの名無しさん:2007/08/15(水) 08:19:32
>>907
Linux じゃないからよく分かんないんだが、
「スワップしだすと途端に色々怪しくなる。」 って、
具体的にどうなるんだ?
913デフォルトの名無しさん:2007/08/15(水) 08:23:18
>>912
・スワップ始めると処理速度が途端にがた落ちになる。
・GUIを使っていると、レスポンスが低下する。
・スワップ解決のために更にスワップ解決が必要な状態になる。
・GUIどころかCUIでさえ反応しなくなり始める。
・I/Oでさえ滞りだす。
・この辺りで観測ができなくなる。
914デフォルトの名無しさん:2007/08/15(水) 08:25:40
なるほど。そりゃひどいな。
915デフォルトの名無しさん:2007/08/15(水) 08:31:01
スワップすら使い尽くした時、各アプリでメモリ・リソース確保に失敗しまくる、
プロセスが切られるとかそういう話かと思ったよ。
916デフォルトの名無しさん:2007/08/15(水) 08:39:40
コンパイルできないのですが、
エラー E2141 list0103.c 7: 宣言の構文エラーって何が原因なのでしょうか?
ソース↓

#include <stdio.h>

int main <void>
{
printf("15と37の和は%dです\n", 15+37);

return (0);
}
917デフォルトの名無しさん:2007/08/15(水) 08:41:07
>>915
GUIならたとえばダイアログを表示しようとすればリソース再確保でエラー起こすだろうけれど、
そうでなければスワップ合戦になるだろ。
918デフォルトの名無しさん:2007/08/15(水) 08:42:02
>>916
>int main <void>
これはない。
919デフォルトの名無しさん:2007/08/15(水) 08:44:22
>>916
ワロタwwwその発想は無かったwwww数学の関数と同じで、int main(void)のように
あと、returnは関数じゃないから( )は要らない
920916:2007/08/15(水) 09:10:00

>>918
>>919

Cの入門書に載ってたソースなんですけど。間違ってるんですか?
どうすればいいのか詳しく教えてください


今日からc始めた初心者です。
921デフォルトの名無しさん:2007/08/15(水) 09:12:13
>int main <void>

>int main (void)
922デフォルトの名無しさん:2007/08/15(水) 09:32:14
std::vector<int> vec;
std::main<void> mai;
923デフォルトの名無しさん:2007/08/15(水) 09:39:40
int main <void>なんて書いてある入門書kwsk
924デフォルトの名無しさん:2007/08/15(水) 09:51:49
() と <> の区別がつかないフォントなんだろうw
925デフォルトの名無しさん:2007/08/15(水) 10:12:53
>>919
>あと、returnは関数じゃないから( )は要らない
宗教論争の始まり
926デフォルトの名無しさん:2007/08/15(水) 10:16:55
retrun (0);
927デフォルトの名無しさん:2007/08/15(水) 10:21:43
別に return の後ろに、値や数式に () をつけてもつけなくてもおk
まぁ、演算子の優先順位によって必要に応じてつけるべきところにはつけるべし
928デフォルトの名無しさん:2007/08/15(水) 10:24:56
どうせ解放されるんだから return の前の free() は不y(ry
929デフォルトの名無しさん:2007/08/15(水) 10:29:30
曖昧な仕様ってこと?
930デフォルトの名無しさん:2007/08/15(水) 10:29:56
なんというツール思考
931デフォルトの名無しさん:2007/08/15(水) 10:44:45
>>929
なにが?
returnの件なら、括弧をつけても問題がないのはreturnとは関係ない話。
# 例えば、printf((((("foo:%d\n")), ((3)))))と書いても問題ないのと同じ事。
932デフォルトの名無しさん:2007/08/15(水) 10:53:46
>>931
> printf((((("foo:%d\n")), ((3)))))
いや、さすがにこれは無理。
933デフォルトの名無しさん:2007/08/15(水) 10:56:10
>>931 >>931 >>931 >>931 >>931 
934デフォルトの名無しさん:2007/08/15(水) 11:00:34
>>931
例えば、exitには括弧が必要でreturnには要らないのはどうして?
逆に言えばreturn以外にも要らないのってどんなものがありますか?
935デフォルトの名無しさん:2007/08/15(水) 11:04:47
型以外に対するsizeofは括弧いらないのにつける人多いな。
936デフォルトの名無しさん:2007/08/15(水) 11:07:31
>>934
exit()は関数。returnは関数ではない。
case のパラメータには括弧はいらない。
937デフォルトの名無しさん:2007/08/15(水) 11:07:53
別に問題のないスタイルにいちいち物申す奴の方が理解力がないと思われるぞ
938デフォルトの名無しさん:2007/08/15(水) 11:11:15
>>936
ただそれだけのことなんですね、分かりました
939デフォルトの名無しさん:2007/08/15(水) 11:19:35
>>935
つけたところで優先順位が変わるわけでもないのにね。
940デフォルトの名無しさん:2007/08/15(水) 11:51:52
>>931
せめてこうしないと。
>((printf))((("foo:%d\n")), ((3)))

>>935>>939
型名の場合と見た目を揃えたいのでしょ。
941デフォルトの名無しさん:2007/08/15(水) 11:57:59
()をつける奴ほど、なぜか型名使わないでsizeof(a) / sizeof(a[0]) なんて書くけどな。
942デフォルトの名無しさん:2007/08/15(水) 12:02:30
それマクロだったりしない?
943デフォルトの名無しさん:2007/08/15(水) 12:15:06
>>941
それはそれで、型名を使わないと言うことは配列であるaの型に囚われないで済むという意義がある。
この場合も同様。
SumType * foo = calloc(sizeof(foo), size);
944デフォルトの名無しさん:2007/08/15(水) 12:16:52
アホほど、どーでもいいネタ引っ張り続けるけどな。
945デフォルトの名無しさん:2007/08/15(水) 12:22:09
>943
いや sizeof a / sizeof a[0] でいいじゃんって話なんだが
946デフォルトの名無しさん:2007/08/15(水) 12:38:47
>>945
別にどっちでもいい
947デフォルトの名無しさん:2007/08/15(水) 12:58:59
sizeofは式中に用いるから()要らなくても付けた方が見た目がしっくりくる。
return、caseは単独で用いるから()無いほうが分かりやすい
948デフォルトの名無しさん:2007/08/15(水) 13:15:28
>>945
なんでそんな話で型の話を出すんだ????
949デフォルトの名無しさん:2007/08/15(水) 13:40:33
>>948
読解力なさすぎじゃね?
950デフォルトの名無しさん:2007/08/15(水) 13:59:56
明らかに >>941 の書き方は変
951デフォルトの名無しさん:2007/08/15(水) 14:38:42
>>949
はぁ?なんで型の話を持ち出して配列の要素数を求める式を持ち出して
型を使わないなら >>945 にすりゃ良いとか、主観的な話を進めてんだ?
型には使わなきゃいけないから括弧を使うなら型名を入れた式にしろって
強制でもしたいんか?きめぇ
952デフォルトの名無しさん:2007/08/15(水) 14:40:23
別に sizeof(a) / sizeof(a[0]) でも問題ないじゃん、型にはつけなきゃいけないって話を
なに直接関係のない式を用いて話をしてんだ????
理解力のない奴が、いかに自分勝手なことしか言わないか分かるね
953デフォルトの名無しさん:2007/08/15(水) 14:43:20
940の
>型名の場合と見た目を揃えたいのでしょ。
に対して型名使ってなくても()をつける奴がいるって意味での941だろ?
それが読めてないんなら読解力なさすぎって言われても仕方ないんじゃね。
954デフォルトの名無しさん:2007/08/15(水) 14:53:32
>953の読解力のなさに笑えた。
955デフォルトの名無しさん:2007/08/15(水) 15:01:27
あんたらさー、読解力がないってより話題が微妙にずれてるんだよ
わかんない?
956デフォルトの名無しさん:2007/08/15(水) 15:03:16
949 名前:デフォルトの名無しさん 投稿日:2007/08/15(水) 13:40:33
>>948
読解力なさすぎじゃね?

945 名前:デフォルトの名無しさん 投稿日:2007/08/15(水) 12:22:09
>943
いや sizeof a / sizeof a[0] でいいじゃんって話なんだが

941 名前:デフォルトの名無しさん 投稿日:2007/08/15(水) 11:57:59
()をつける奴ほど、なぜか型名使わないでsizeof(a) / sizeof(a[0]) なんて書くけどな。
957デフォルトの名無しさん:2007/08/15(水) 15:05:22
型名以外にsizeofの()がいらないことを知らなかった奴がいファビョってんのか。
958デフォルトの名無しさん:2007/08/15(水) 15:46:49
見易さだろ
959デフォルトの名無しさん:2007/08/15(水) 15:55:15
かっこつけてるだけだよ
960デフォルトの名無しさん:2007/08/15(水) 15:59:01
PCなんかイジル暇があるのなら
外に出て異性いじれば良いのに・・・・・・
961デフォルトの名無しさん:2007/08/15(水) 16:01:09
C言語は俺の女房みたいなもんだぜ
962デフォルトの名無しさん:2007/08/15(水) 16:01:45
さすがに野外プレイはちょっと…
963デフォルトの名無しさん:2007/08/15(水) 16:32:13
>>957 < こういう勘違いバカがいるとうざいよな。()つけるなら型を使えよぉ〜みたいなきめぇ
964デフォルトの名無しさん:2007/08/15(水) 16:33:21
勘違いバカが自分がバカだと気づくまで何年掛かるか知らんが、発言内容に責任を持てよ

945 名前:デフォルトの名無しさん 投稿日:2007/08/15(水) 12:22:09
>943
いや sizeof a / sizeof a[0] でいいじゃんって話なんだが

941 名前:デフォルトの名無しさん 投稿日:2007/08/15(水) 11:57:59
()をつける奴ほど、なぜか型名使わないでsizeof(a) / sizeof(a[0]) なんて書くけどな。
965デフォルトの名無しさん:2007/08/15(水) 16:37:03
型名でもないのに()つけんなよであって、()つけたいなら型名使えとは意味がちがうんじゃね?
966デフォルトの名無しさん:2007/08/15(水) 16:44:36
うん
967デフォルトの名無しさん:2007/08/15(水) 16:45:17
size_t (*fp)(...) = sizeof;
968デフォルトの名無しさん:2007/08/15(水) 16:50:31
結局こいつは括弧なしでも通用する例を持ち出して、括弧なしでも
使えることを主張したかっただけだろ。そんなの知ってるわ、初心者夏厨かてめぇは?
日ごろから来ている人からしてみりゃ、何今更なこと言ってんだ?って思ってんだが?
969デフォルトの名無しさん:2007/08/15(水) 16:52:40
CでGUIプログラムを作りたいと思うのですが、
Borland C++ CompilerでGUI表示のプログラムを
ビルドする方法が分かりません。
何かいいツールはありませんか?
970デフォルトの名無しさん:2007/08/15(水) 16:54:22
>>968
別にお前に対して言ってるわけじゃないだろう
971デフォルトの名無しさん:2007/08/15(水) 16:56:54
括弧をつけてもつけなくても良いようなところで、個人的なスタイルの話を
主張して相手のスタイルを批判、否定している奴は、自分が理解されないぞ
972デフォルトの名無しさん:2007/08/15(水) 16:56:55
>>969
-W オプション付けてみな
973デフォルトの名無しさん:2007/08/15(水) 16:57:36
>>969
GUI のプログラムを C で書く方法が知りたいのか、
すでに書いたプログラムをビルドする方法だけが知りたいのか、
何かいいツールを知りたいのか、
どれなんだ。
だいたいツールってどんなツールが欲しいんだ。
974デフォルトの名無しさん:2007/08/15(水) 16:58:33
夏厨ファビョリーーーンw
975デフォルトの名無しさん:2007/08/15(水) 17:00:37
速攻のレスありがとうございます!
>>973
GUIのプログラムを書く方法が知りたいです。
あと、すでに書いたプログラムをビルドする方法があるなら、教えてほしいです。
976デフォルトの名無しさん:2007/08/15(水) 17:33:11
 〇∧〃 括弧をつけなくても使えるスタイルがある
 / >  でもそんなの関係ねぇ!
 < \  そんなの関係ねぇ!


  〇/ はい!
 /|    オッパッピー!!
 />
977デフォルトの名無しさん:2007/08/15(水) 17:40:27
GUI のプログラムねぇ。
Windows API でぐぐってみたら?
978デフォルトの名無しさん:2007/08/15(水) 18:26:36
>>975
ttp://wisdom.sakura.ne.jp/system/winapi/
これ読みながら、環境整えてコンパイラのヘルプを読め
979デフォルトの名無しさん:2007/08/15(水) 18:26:50
>>976
オッパッピーの意味分かって言ってるのか?
980デフォルトの名無しさん:2007/08/15(水) 19:05:06
>>975
Borland C++ Compiler 5.5 - FAQ
http://dn.codegear.com/jp/article/33545

> Q. C++BuilderやVisual C++で作成するようなグラフィカルユーザーインターフェース(GUI)
> を持つアプリケーションは、どのように開発すればよいのでしょうか。

これ参照
981デフォルトの名無しさん:2007/08/15(水) 19:52:49
環境:
Cygwin(gcc version 3.4.4)
WindowsXP x64
物理メモリは2GB

こんな環境なんですが、
mmapで作成出来る領域が1G程度までなんです。
OSは64bitですがCygwinは32bitなので、確かに32bitの壁は理解出来るのですが
それだったら2G程度の壁のはずです。なのに何故1G程度しか確保出来ないのでしょうか?


尚、perror()でエラーを標準出力に出力すると、Cannot allocate memoryと出ますが
更に大きな値を指定すると、Invalid argumentと出ます。
これも、メモリが確保出来なかったと言う事なのでしょうか?
それとも、サイズを指定する所のスタックをオーバーして、隣のアーギュメントの領域を破壊して、
その結果、引数がおかしいと言うエラーを出しているのでしょうか?

よろしくお願いします。
982デフォルトの名無しさん:2007/08/15(水) 19:58:04
>>981
そういう仕様なんじゃないの?
983デフォルトの名無しさん:2007/08/15(水) 20:07:03
exe や DLL がロードされる領域とか、ヒープやスタックにもアドレス空間を割かなきゃいかんだろうし、2GB は確保できんだろうと思うが。
実際のところアドレス空間がどう使われてるか Process Walker でも使って調べてみたら?
984デフォルトの名無しさん:2007/08/15(水) 20:17:02
2.4. Cygwin の最大メモリを変更する
ttp://www.sixnine.net/cygwin/translation/cygwin-ug-net/setup-maxmem.html
985デフォルトの名無しさん:2007/08/15(水) 21:02:21
(sizeof(a) / sizeof((a)[0]))
986デフォルトの名無しさん:2007/08/15(水) 21:18:25
((sizeof(a)) / (sizeof((a)[0])))
987デフォルトの名無しさん:2007/08/15(水) 21:20:11
(sizeof(a)/sizeof(*(a)))
988デフォルトの名無しさん:2007/08/15(水) 21:30:44
MinGW でコンパイルするといいよ。
989デフォルトの名無しさん:2007/08/15(水) 21:44:54
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((0))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
990デフォルトの名無しさん:2007/08/15(水) 23:05:19
int main()・void main()論争の時もそうだけど、こういうネタは盛り上がるな。
991デフォルトの名無しさん:2007/08/15(水) 23:15:48
質問を盾に持論をかざす場でもあるからね
スレも終わりに近いし
992デフォルトの名無しさん:2007/08/15(水) 23:21:04
好みの問題だから正誤が決まるわけじゃないし、誰でも参加できる
よっぽどのことが無い限り論破されることも無い

どうでもいいことをグダグダ言いながら交流する手段、これを雑談という
993デフォルトの名無しさん:2007/08/15(水) 23:32:16
どっちかというと、
「bikeshed discussion」
ってやつだな
994デフォルトの名無しさん:2007/08/16(木) 00:44:22
メモリの確保ですが、bcc32でやってみたら、1.2Gbyte位でした(大体)。

ちなみに、size_tは4byteで、SIZE_MAX の定義は見当たらず。古いのかな・・・
995デフォルトの名無しさん:2007/08/16(木) 01:03:37
>>988
MinGWって、Windowsネイティブでmmap使えるの?
すげぇ・・・。
996デフォルトの名無しさん:2007/08/16(木) 02:15:31
別にすごくないと思うけど
CreateFileMapping と MapViewOfFile 使えばいいだけじゃないの?
997デフォルトの名無しさん:2007/08/16(木) 05:35:32
質問なんですが、Visualの設定でファイルの中身を書き換えて
上書き保存しようとしたんですが保存することができませんでした。
保存する権限がありません、システムの管理者に問い合わせてみてください、みたいなことがかかれて
保存できませんでした、どうしたらええでしょうか?
998デフォルトの名無しさん:2007/08/16(木) 06:17:41
そのファイルに書き込み不可属性ついてない?
999デフォルトの名無しさん:2007/08/16(木) 06:23:41
>>979
 〇∧〃 オッパッピーの意味分かって言ってるのか?
 / >  でもそんなの関係ねぇ!
 < \  そんなの関係ねぇ!


  〇/ はい!
 /|    オッパッピー!!
 />
1000デフォルトの名無しさん:2007/08/16(木) 06:26:16
http://ja.wikipedia.org/wiki/%E5%B0%8F%E5%B3%B6%E3%82%88%E3%81%97%E3%81%8A
> 元々「オッパッピー」は卑猥な言葉の略語だったらしいが、他の芸人にダメ出しを受けて
> 「オーシャンパシフィックピース」に変更した。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。