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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

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

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレッド
C言語なら俺に聞け! Part 115
http://pc8.2ch.net/test/read.cgi/tech/1127737437/
2デフォルトの名無しさん:2005/10/18(火) 14:29:00
-----
#include <stdio.h>
int main() {
  int var, *po;
  po = &var;
  var = 100;
  printf("%d\n" , po);
  return 0;
}
-----
だと変数varのアドレスが表示されるのに、
-----
#include <stdio.h>
struct {
  int var;
}obj , *po;
int main() {
  po = &obj;
  obj.var = 100;
  printf("%d" , po->var);
  return 0;
}
-----
だと構造体objメンバvarのアドレスではなく中身が表示されるというのが
理解できません。
アドレスを表示させたい場合はどのように書けば良いのでしょうか。
3デフォルトの名無しさん:2005/10/18(火) 14:29:49
&po->var
4デフォルトの名無しさん:2005/10/18(火) 14:43:09
前スレ>>993です。同じ質問になってしまうんですが
typedef struct test{
union{
struct{ int a,b,c;};
int field[3];
};
}sTEST;

typedef union test{
struct{ int a,b,c; };
int field[3];
}uTEST;
とするのでは何が違うんでしょうか?
5デフォルトの名無しさん:2005/10/18(火) 14:54:18
>>2
#include <stdio.h>
int main() {
  int var, *po;
  po = &var;
  var = 100;
  printf("%d\n" , *po);
  return 0;
}
↑でなぜpoのアドレスが表示されないのがわかりません。

と聞いてるのと同じ事。
6デフォルトの名無しさん:2005/10/18(火) 14:57:56
>>3
ポインタ変数*poは、

構造体以外の場合:
po…アドレス
*po…アドレスが指している内容

構造体の場合:
&po…アドレス
po…アドレスが指している内容

になるということでしょうか。
7デフォルトの名無しさん:2005/10/18(火) 14:59:30
>>4
union(共用体)になってるかどうか。
8デフォルトの名無しさん:2005/10/18(火) 15:00:44
>構造体objメンバvarのアドレス
& obj.var
or
& po->var
9デフォルトの名無しさん:2005/10/18(火) 15:00:53
>>5
ポインタ変数は*がついていなければアドレスを保持する、と理解しているのですが。
10デフォルトの名無しさん:2005/10/18(火) 15:01:35
>>7
構造体になってるか共用体になってるかの違いはあるけど
確保してる変数(a,b,c,field[3])は同じ状態になるってことでいいのかな?
11デフォルトの名無しさん:2005/10/18(火) 15:02:10
int i = 10
int *p;
p = &i;
printf("pのアドレス[%p]\n", &p);
printf("pの内容(内容は変数iのアドレス)[%p][%p]\n", p, &i);
printf("pの指し示す先(内容は変数iの値)[%d][%d]\n", *p, i);

これが理解できん奴はCを扱う能力がないんでVBでもやってろ
12デフォルトの名無しさん:2005/10/18(火) 15:07:57
>>9
"->"はポインタの指し示す場所にある構造体からメンバーの値を取り出す演算子
13デフォルトの名無しさん:2005/10/18(火) 15:12:17
>>11
構造体でないケースは理解できているつもりです。

>>12
"->"を使った時点で変数ではなく演算になるということですか。
納得しました。

皆さんありがとうございました。
14デフォルトの名無しさん:2005/10/18(火) 15:15:35
L-Valueが判ればどうって事ないんだがな
15デフォルトの名無しさん:2005/10/18(火) 15:24:43
>8が>13にスルーされた件について。
16デフォルトの名無しさん:2005/10/18(火) 16:19:10
>>前スレ997
無名構造体だからおかしくない。
17デフォルトの名無しさん:2005/10/18(火) 16:26:16
>>15
>>3とかぶってたもんで。すみませんでした。
18デフォルトの名無しさん:2005/10/18(火) 16:29:54
質問させてください。

char moji="あいうえお";
char mozi="たちつてと";

char a;

aに、mojiとmoziの中身を代入して
a="あいうえおかきくけこ"のようにする関数はありますか?
よろしくお願いします。
19デフォルトの名無しさん:2005/10/18(火) 16:33:10
>>18
色々無理です。
20デフォルトの名無しさん:2005/10/18(火) 16:34:34
char s[256];
strcpy(s, "foo");
strcat(s, "bar");
puts(s);
21デフォルトの名無しさん:2005/10/18(火) 16:34:44
>>18
そもそも文字列について相当な思い違いをしているようだが。
Cの文字列はcharの配列だぞ?それに日本語をcharで扱うのはよくない。
            ~~~~~~
22デフォルトの名無しさん:2005/10/18(火) 16:44:23
すいません。違う言語ばっかりやってたのですっかり忘れてしまってましたorz
>>20
さっそく取り組んでみます。本当にありがとうございました。
23デフォルトの名無しさん:2005/10/18(火) 16:46:00
一言いい忘れました。

>>19,21
死ね糞根性悪。

では失礼します。
24デフォルトの名無しさん:2005/10/18(火) 16:51:13
ちょww
>>23
は偽ですよ…
25デフォルトの名無しさん:2005/10/18(火) 16:51:41
>>23
え?そんなこと言っちゃダメじゃね?君は、質問してる側だよ?
26デフォルトの名無しさん:2005/10/18(火) 16:52:11
ここ、IDでないからある意味使いづらいな
27糞根性悪その2:2005/10/18(火) 16:53:33
ネタだと思えば腹も立たん。
28デフォルトの名無しさん:2005/10/18(火) 17:33:33
日本語をchar配列で扱ってしまっている場合には
何に気をつけるべきでしょうか?
29デフォルトの名無しさん:2005/10/18(火) 17:36:05
>>28
1バイト文字とのコードの競合や、文字の泣き別れが発生しないように気をつける必要がある。
30デフォルトの名無しさん:2005/10/18(火) 17:37:58
>>28
あと文字列は出来ればunsigned charにした方がいい。
31デフォルトの名無しさん:2005/10/18(火) 17:45:15
>>29, >>30
ありがとうございました。
32デフォルトの名無しさん:2005/10/18(火) 17:48:01
実際に unsigned にすると標準関数に渡す時にキャストがいる・・・
とか思ってたけど、C だと大丈夫なのね。
C++ だとエラーになるけど。
33デフォルトの名無しさん:2005/10/18(火) 17:48:49
>>32
Cはそこらへんが甘い。
34デフォルトの名無しさん:2005/10/18(火) 18:00:12
>>32
出来ればキャストした方がいいけどな。
35デフォルトの名無しさん:2005/10/19(水) 06:25:17
gets(a);
f1=fopen(a,"r");
でaにディレクトリからファイル名を入れたいんですが
どうすればいいんでしょうか?
環境はUNIXです
禿素人で申し訳ないですが教えて下さい
36デフォルトの名無しさん:2005/10/19(水) 07:48:46
↓fgets厨登場
37デフォルトの名無しさん:2005/10/19(水) 08:58:35
>>36
fgets厨かどうかは兎も角、gets()は使用禁止。

>>35
「ディレクトリからファイル名を入れる」とはどういう概念ですか?

もしや、ディレクトリ内のファイル一覧を得たいとか?
それならば、環境依存になるので該当環境スレか初心者スレへ。
38デフォルトの名無しさん:2005/10/19(水) 10:14:56
c#でwindowsのプログラムを組んだのですが、バックグランドとフォアグランドで実行速度が異なります。
何が原因かわかりません。どなたか、ご教授ください。
計算プログラムはFFT変換をしています。
39デフォルトの名無しさん:2005/10/19(水) 10:15:26
すげえ。
40デフォルトの名無しさん:2005/10/19(水) 10:23:12
>>38
OSがフォアグラウンドタスクに処理を優先させるからだ。
コンパネシステムパフォーマンスでバックグラウンドを優先させて回線切手首吊ってスレ違いを悔いて市ね。
41デフォルトの名無しさん:2005/10/19(水) 11:18:48
>>40
ツンデレか?

>>38
スレタイ百回音読な
42デフォルトの名無しさん:2005/10/19(水) 14:53:36
質問です。
reallocしたら、前にmallocした分で使っていたデータが変わってしまう現象にでくわしました。
流れとしてはこんな感じです。

char**ptr = (char**) malloc(size1 * sizeof(char*)); /* size1個の(char*)確保 */
for (i = 0; i < size1; i ++)
  ptr[i] = NULL; /* NULLで初期化 */
/*
・・・ある程度使用して、もっとたくさん必要になってから・・・
*/
ptr = (char**) realloc(ptr, size2 * sizeof(char*)); /* size2個の(char*)確保 */
for (i = size1; i < size2; i ++)
  ptr[i] = NULL; /* 新しく確保されたであろう部分だけNULLで初期化 */

このとき、上記の「ある程度使用」したときに代入した非NULLの値たちは無事でしたが、NULLであるべきところにはいくつか変な値が入ってしまいます。
(値としては0x15とか0x18などの小さな数字が入っています。一方でちゃんとNULLな部分もあります。)
この状況を打破して、reallocを正しく使用する方法はありますでしょうか?
43デフォルトの名無しさん:2005/10/19(水) 14:58:40
reallocする直前のヒープの状態が壊れてないことは確認したんか?
4442:2005/10/19(水) 15:08:14
>>43
なるほど。それは確認すべきでした。
今すぐ確認してみます。
4542:2005/10/19(水) 15:16:26
realloc前も調べてみたら、少しだけ勘違いに気づきましたorz
もっと不規則なデータの壊れ方をしています・・・。
壊れている部分と壊れていない部分がまばらです。
4642:2005/10/19(水) 15:17:56
何度もすみません。
ちなみにrealloc直前のデータは全て正常です。
47デフォルトの名無しさん:2005/10/19(水) 15:25:14
>>42
もっと単純なモデルでテストすることを進める。
ダブルポインタに起因する複合的なバグの可能性もあるから。

とりあえず
int* ptr = (int*) malloc(size1 * sizeof(int));
for (i = 0; i < size1; i ++)
ptr[i] = 0;
ptr = (int*) realloc(ptr, size2 * sizeof(int)); /* size2個の(int)確保 */
for (i = size1; i < size2; i ++)
ptr[i] = 0;
で試してみぃ。
48デフォルトの名無しさん:2005/10/19(水) 15:31:49
realloc直前では壊れていないということは、
あとは、size1 > size2になってるとかくらいかねぇ。
ライブラリのバグの可能性もあるけど。
4942:2005/10/19(水) 15:59:40
>>47
単純なテストをmainの中でやる分には不可思議な現象は一切起こらないみたいです。
int を char や char * にしても問題はおきませんでした。

>>48
サイズはreallocの直前に更新しているので大丈夫そうです。
ライブラリのバグだとしたら怖いですね。

ハッシュテーブルのサイズ更新なので、サイズが素数なのが問題なのかと思ったり思わなかったりです。
2回目のサイズを23にしたり29にしたりで、壊れ方が違ったり、全く壊れなかったり、色々です。
2回目のサイズが同じなら問題は完全に毎回再現されます。

やはり、原因は全く別のところにあるのかもしれません。(おそらくポカミス?)
>>47の通りダブルポインタに起因する複合的なバグというやつかもしれません。
とりあえずreallocの代わりに、別口にmalloc→コピー→元のやつfreeでうまくいくのでそちらにしますが、他にバグがある可能性も頭に入れつつ色々探って見ます。

どうもありがとうございました。
50デフォルトの名無しさん:2005/10/19(水) 16:07:15
ああ、もう1個。
プログラム中でmallocなどで用いてる管理領域をぶっ壊してる可能性があった。
51デフォルトの名無しさん:2005/10/19(水) 16:21:52
デバッグ版のライブラリリンクしてreallocのソース追っかけてみりゃいいんじゃないの。
52デフォルトの名無しさん:2005/10/19(水) 17:31:44
独学でC言語を始めようと思ってC言語を始めよう!とVisual C++ Toolkit をダウンロードしたんですが
うまくいきません。

#include<studio.h>
void main(void){
printf("hello,world");
}
とりあえずこのプログラムを打ってみてコンパイラ→実行をやってみたんですが


C:Documents and Settinds.....
続行するには何かキーを押してください・・・

と出るだけでした。アドバイスお願いします。

53デフォルトの名無しさん:2005/10/19(水) 17:47:31
#include <stdio.h>

int main(void) {
printf("hello,world");
return 0;
}
54デフォルトの名無しさん:2005/10/19(水) 17:48:27
エラーメッセージは出てないのか?
exeはちゃんとできてるか?
55デフォルトの名無しさん:2005/10/19(水) 17:55:20
>>54
エラーメッセージは出てません。

"untitiled.exe"
っていうのは出てます。
56デフォルトの名無しさん:2005/10/19(水) 18:35:07
untitled.exeの作成時刻は?
以前に同じファイル名で作成したものを実行してたりしないか?
5752:2005/10/19(水) 18:36:11
なんか色々やってたらできました。

整数を入力して10以下か以上かを答えさせる
プログラムを作っただけなんですが異様に感動した。

プログラマーが小学生のなりたい職業上位に入るのも頷けますね。
58デフォルトの名無しさん:2005/10/19(水) 18:41:00
stdioとstudioを間違える人多いよな・・・漏れも始めた頃間違えた一人だけど
STanDard Input/Outputの略・・・で合ってるよね
59デフォルトの名無しさん:2005/10/19(水) 19:08:06
ずっと<stdio.h>

スタジオエイチって読んでました
以後気をつけます。(´・ω・`)
60おば:2005/10/19(水) 19:45:03
3次元配列を動的確保したいのですがどうやればよいでしょうか?たとえば
サイズが不定のビットマップ画像を読み込む場合の処理を教えていただけないでしょうか?
61デフォルトの名無しさん:2005/10/19(水) 19:48:29
>>60
malloc
62おば:2005/10/19(水) 19:50:24
RGBは決まって3バイトあればよいのですが、幅と高さを一気に確保するのは無理ですかね?
63デフォルトの名無しさん:2005/10/19(水) 19:51:09
できます
64デフォルトの名無しさん:2005/10/19(水) 20:00:31
どうしてgetsがいけないんですか?
scanfが悪いのはわかるんですが
テンプレみても今いち分かりません
セグメンテーションエラーとかコアダンプの原因とかなんとか…
エロイ人教えて下さい
65デフォルトの名無しさん:2005/10/19(水) 20:07:41
>>64
char s[5];
gets(s);
で5文字以上入力があった場合配列を超えてデータが書き込まれるのはわかるだろ?
ユーザーが何文字入れるのかわからないのに、
前もって決まったサイズのバッファしか用意できないのが問題。
66デフォルトの名無しさん:2005/10/19(水) 20:10:02
>>64
65が答えてくれてるが、それぐらい自分で調べろ
manみりゃ書いてあるだろうが
67デフォルトの名無しさん:2005/10/19(水) 20:50:29
structをglobal変数にできますか?
68デフォルトの名無しさん:2005/10/19(水) 20:51:53
できます
69デフォルトの名無しさん:2005/10/19(水) 20:57:28
getcがダメって書いてあるのかと思った。
getsなんて使わないから存在すら忘れてた。
70デフォルトの名無しさん:2005/10/19(水) 21:57:33
>>65
thx
猫でもで勉強してるので知らなかったとです
71デフォルトの名無しさん:2005/10/19(水) 22:43:53
>>70
なんだ猫って読んだこと無いが、そんなことすら説明せずにgets使ってるのか
悪いことは言わんからとっととそんなのは梵書してK&R嫁
72デフォルトの名無しさん:2005/10/19(水) 22:45:05
あんなもん売ると勘違いネコ以下野郎が増殖するからなぁ。
73デフォルトの名無しさん:2005/10/19(水) 22:57:53
「梵書」の使い方間違えてるよ
74デフォルトの名無しさん:2005/10/19(水) 23:07:08
使い方が間違ってるの?
焚書じゃないの?
75デフォルトの名無しさん:2005/10/19(水) 23:08:15
焚書だ、素で間違った(;´Д`)
76デフォルトの名無しさん:2005/10/19(水) 23:09:12
俺も釣られたorz
77デフォルトの名無しさん:2005/10/19(水) 23:11:41
盆所って出られないよね。
78デフォルトの名無しさん:2005/10/19(水) 23:20:14
どう読んだら梵書になるんだ・・・

「ふんしょ」な?
79デフォルトの名無しさん:2005/10/19(水) 23:38:30
>42
まず、size1 と size2 が、
それぞれどんな値の時に問題が起こっているのか調査したか?
していないなら、まずそこを調査スレ。

次に、

> /*
> ・・・ある程度使用して、もっとたくさん必要になってから・・・
> */

の処理を無処理にして問題が出るか?
出るなら、realloc()が悪いのではなく、
無処理にした処理の中で、どこかのデータを壊している可能性が非常に高い。

最後に、realloc()の戻り値は確認したか?
NULLが返ってきているにも関わらず、アクセスしていないか?


ついでに、

> ptr = (char**) realloc(ptr, size2 * sizeof(char*)); /* size2個の(char*)確保 */

realloc()はエラーの時、元の領域を開放せずにNULLを返す。
元領域のポインタに上書きするなどもってのほかだ。
80デフォルトの名無しさん:2005/10/19(水) 23:58:52
#include <stdio.h>
main()
{
int i;
typedef struct file{
FILE *fp;
char *filename;
}sFILE;

sFILE fp[5];
char *name[5]={"1.txt","2.txt","3.txt","4.txt","5.txt"};

for(i=0;i<5;i++){
fp[i].fp=NULL;
fp[i].filename=name[i];
}

for(i=0;i<5;i++){
fp[i].fp=fopen(fp[i].filename,"w");
fclose(fp[i].fp);
}
}

char *name[5]={"1.txt","2.txt","3.txt","4.txt","5.txt"};の宣言のところでエラーになるんだけど
どう直したらいいんだろう?
間違ってるのは分かるんだけどどうしたらいいかわからんよ。
81デフォルトの名無しさん:2005/10/20(木) 00:04:28
*と[]の宣言時の優先順位はどっちだ?
82デフォルトの名無しさん:2005/10/20(木) 00:07:18
てゆーか、エラーになりませんけど。
83デフォルトの名無しさん:2005/10/20(木) 00:07:21
後置演算子は優先度が高い。
84デフォルトの名無しさん:2005/10/20(木) 00:08:16
まあ、連番のファイル名程度は動作中に作成しろよ、って思うけど。
85デフォルトの名無しさん:2005/10/20(木) 00:09:34
当方C++でGSLを使っておりまして、GSL_blasを使って、行列計算をしてみたのですが、
500×500の正方行列同士の積にかかる演算時間が1回当たり1.5〜1.7秒と芳しくありません。

何か問題があるのでしょうか?
もし、C++でGSLを利用している方がいらっしゃいましたら、↑の試行でどれくらいの時間を要しているのでしょうか?
86デフォルトの名無しさん:2005/10/20(木) 00:18:37
おいおい、優先順位云々言ってる奴、おまえら
char *literals[] = {
 "abc",
 "def",
 "ghi",
};
みたいなコード、見たこと無いのかよ。
87デフォルトの名無しさん:2005/10/20(木) 00:20:08
literals is an array of pointer to character
88デフォルトの名無しさん:2005/10/20(木) 00:20:13
最初に
char** argv
でやる人も多いっぽいからしょうがないんじゃない?
89デフォルトの名無しさん:2005/10/20(木) 00:26:20
>>86
なにがまずいのでしょう?
90デフォルトの名無しさん:2005/10/20(木) 00:28:34
一応、知識も経験も不足している>>81(と>>83)のために解説しておく。

確かに*と[]を比較すると、[]の方が優先度が高い。
だから、char *literals[]; という宣言は、
まず、「literalsというのは配列である」というのが最初。
そして、「何の配列か?」の答えとして、「char *の配列」となる。

だから>>80
char *name[5]={"1.txt","2.txt","3.txt","4.txt","5.txt"};
は、構文上は全く問題の無いコードで、
実際、コンパイルエラーにはならない。
91デフォルトの名無しさん:2005/10/20(木) 00:30:55
>>89
おまえは80か?
>>80がエラーになると言うのなら
まずそのエラーメッセージになんと書いてあるか読む。
それでわからないときでも「エラーメッセージ」くらい、書き込めよ。
92デフォルトの名無しさん:2005/10/20(木) 00:39:37
こんばんは。
ちと仕事で詰まってるところがあって質問させてくれないか?
ポリゴンを書くためのデータ構造体で作っているんだがどうもそれがパディングを起こしているらしく、
そのデータで描画すると表示がおかしくなるんだ。
パディングを起こさないような構造体のメンバと其れに合わせたポリゴンのフォーマットにすればうまくいく。
で、#pragma packをつかってみたら元は64だったのが56になった。でも表示は違う壊れかたをしてしまう……。
アライメントは8。linuxでgccがコンパイラ。
けど、データの内容を変えるわけにも行かず、描画のためのストリームなので決まった順序で連続してないとだめだし。
先輩に聞いたら簡単に治せるらしいんだけど……1日考えても#pragma以外の解決案がわからない……。
まとめると
・#pragma pack(1)でやると64から54になる。だが表示がpackするまえとは別の壊れかたをする
・構造体のメンバをパディングしないようにbyte数の小さい変数に変え、それにあったフォーマットにすると思ったとおり表示される。
・描画用のストリームなので連続してないとだめ
・先輩いわく、簡単・即効で直せるらしい
何か思い当たることがあったら教えてくださいな……orz
アライメントの問題なんてVCとかでオプションで解決してたんだけどやっぱりちゃんと勉強しないとだめだね…。
93デフォルトの名無しさん:2005/10/20(木) 00:41:14
94デフォルトの名無しさん:2005/10/20(木) 00:52:31
>>92
まず、問題になっている構造体と、
問題なく表示できる構造体の定義を晒してみろ。
9592:2005/10/20(木) 00:58:22
struct VERTES{
short_vec2 uv;
int color;
short_vec3 pos;
};
上だとパディングしているようでカラーをshortにして16bitで表現した
struct VERTES{
short_vec2 uv;
short color;
short_vec3 pos;
};
なら問題なく表示されます。
96デフォルトの名無しさん:2005/10/20(木) 00:59:58
short_vec2とかshort_vec3ってなに?
97デフォルトの名無しさん:2005/10/20(木) 01:02:36
「パディングする」って言葉の使い方するか?

ってのはともかく
手動でダミーの詰め物を入れて
確実にアラインメントを揃えろって話じゃないかね。
98デフォルトの名無しさん:2005/10/20(木) 01:04:42
colorがちゃんとshortで表現し切れるなら
後者の書き方ではいけない理由がわからない。
99デフォルトの名無しさん:2005/10/20(木) 01:06:51
>>95
つか、intが32bitの環境なら、そもそも詰め物サイズの問題じゃなくて
下の書き方じゃないとダメじゃないの?
100デフォルトの名無しさん:2005/10/20(木) 01:12:05
つ#define int short
これ以外に字面はintのままshort版とバイナリイメージを同一にする術はない。
10192:2005/10/20(木) 01:14:40
>>96
説明不足すいません
short_vec2=shortのxとyがメンバの構造体
short_vec3=shortのxとyとzがメンバの構造体
です。
>>97
posのあとに2byte(short)のデータをいれて8バイトで切れるようにしたら表示されたのですが
なぜ連続したデータなのにshortが無視されるのか解らず……先輩も無視してくれる保証がないならだめ、と。
>>98
表現しきれないので……orz
それに32bitでやれるらしく・・・うーん。

其れとより正確に書くと
struct VERTES{
short_vec2 uv1;
int color1;
short_vec3 pos1;

short_vec2 uv2;
int color2;
short_vec3 pos2;

short_vec2 uv3;
int color3;
short_vec3 pos3;

short_vec2 uv4;
int color4;
short_vec3 pos4;
};
という風に構造体一つに4つの頂点のデータが入ってます・・・。
102デフォルトの名無しさん:2005/10/20(木) 01:21:25
で、最終的に希望しているバイナリの配置は?
uv1:2+2
color1:4
pos1:2+2+2
dummy:2
uv2:2+2
...
て感じ?
10392:2005/10/20(木) 01:28:09
>>102
うーん、描画の関数的にそのダミーが無視されるのかどうか……
それこそ、使ってる関数調べなきゃあいけないんですけど全然書いてねぇっす……。
それについてはもっぺん調べてみます。

でも先輩の口ぶりから察すると連続したデータに出来るとかあるいは無視できるような指示が出来るのかと…。
うーん、俺の察しがそもそも勘違いなのじゃorz
10480:2005/10/20(木) 01:28:55
さっきのやつは問題なく動作したね。激しく勘違いだったみたい。
んで今度は

#include <stdio.h>
main()
{
int i;

typedef struct file{
FILE *fp;
char *filename;
}sFILE;

sFILE fp[5];

for(i=0;i<5;i++){
fp[i].fp=NULL;
sprintf(fp[i].filename,"file(%d).txt",i);
}

for(i=0;i<5;i++){
fp[i].fp=fopen(fp[i].filename,"w");
fclose(fp[i].fp);
}
}
こんな感じにsprintfで名前を取ってきたいんだけど、コンパイルは通るんだけど実行するとエラーになります。
お願いします。
105デフォルトの名無しさん:2005/10/20(木) 01:29:09
話しの流れぶち壊し&スレ違いかも知れないけどとりあえず質問
大学でプログラミング演習の講義があるんだけど
その講義で決まった教科書がないわけ
で、先生が「何でもいいから参考書を買え」
言ったから買おうと思ったんだが
どれがいいか分からないからアドバイスくれないか?

ちなみにまだ始めて1ヶ月未満のド初心者です
106デフォルトの名無しさん:2005/10/20(木) 01:30:50
参考図書スレ池
107デフォルトの名無しさん:2005/10/20(木) 01:42:07
>>92
必要としているデータがパディングが必要なのかどうかがわからんとどうしようもないな。

パディングされてはいけないのなら__attribute__((packed))使えばいいだろう。
各頂点データが8bytesの境界に揃っていないといけないのなら、頂点一つ分の構造体を作って、
それに__attribute__((aligned (8)))を指定すればいけるか?
あと、変数自体が8bytesアラインされていないといけないという可能性もあるが、
その場合も__attribute__でなんとかなったと思うが。
108デフォルトの名無しさん:2005/10/20(木) 01:42:35
>>104
「配列とポインタ」について勉強し直せ
10980:2005/10/20(木) 01:48:52
>>108
勉強不足なのは分かってるんだがどうにも納得いかなくて落ち着かないんだ
どうしたらこれがうまくいくのか教えてクレヨン
110デフォルトの名無しさん:2005/10/20(木) 02:07:05
>>104
sFILE.filename には何文字入ると思う?
11192:2005/10/20(木) 02:09:12
>>107
うーん。頂点一つがshort*2、32bit*1,short*3なんで14バイト
……これに2バイトいれると思ったとおり読み込まれるんで16バイトずつよみこまれてるみたい……。

__attribute__((packed))は#pragma packとおなじでなぜか壊れる。
色々調べたり聞いた情報をまとめるとおっしゃられるとおり、__attribute__をつかって((aligned (16)))で宣言して頂点4つを
一つの構造体に宣言するんじゃなく、一つの頂点のデータにして4つ配列にして先頭アドレス渡してみようって感じになりました。
とりあえず明日試してみます。

答えてくださった皆さん、ありがとうございましたm(__)m
112デフォルトの名無しさん:2005/10/20(木) 02:18:34
113104:2005/10/20(木) 02:42:08
#include <stdio.h>
typedef struct file{
FILE *fp;
char *filename;
}sFILE;

main()
{
int i;
sFILE fp[5];
char name[5][255];

for(i=0;i<5;i++){
fp[i].fp=NULL;
sprintf(name[i],"file(%d).txt",i);
fp[i].filename=name[i];
}

for(i=0;i<5;i++){
fp[i].fp=fopen(fp[i].filename,"w");
fclose(fp[i].fp);
}
}

俺がんばってみたよ。
fp[i].filenameは、char型のアドレスを持てるだけだから直接文字列入れようとしちゃダメだったんだね

てかほんとにこれでいいのかな?
114デフォルトの名無しさん:2005/10/20(木) 02:47:37
>>113
何のためにポインタ使ってるの
115104:2005/10/20(木) 02:54:05
>>114
全部sprintfでファイル名つけるんじゃなくて
fp[i].filename="1.txt";
みたいにしたいところもあるから?

ていうか今度は
char name[255];
name="1.txt";
ってやるとコンパイル通らないのが何でかわからないよ
教えてほしいよ
116デフォルトの名無しさん:2005/10/20(木) 02:54:21
>113
いまこそmallocをつかうときだ
117デフォルトの名無しさん:2005/10/20(木) 02:56:06
だれかホントお願いします。アセンブラ?らしいんですけど・・・

[8050h] ← [8051h] + [8052h] を計算し、符号付2進数加算としてのオーバーフローを判定する。
(オーバーフローのとき Cy ← 1、オーバーフローでないとき Cy ← 0 とする)
オーバーフローの判定方法を付け加えること。
118デフォルトの名無しさん:2005/10/20(木) 02:56:36
>115
name[0]='1';
name[1]='.';
name[2]='t';
name[3]='x';
name[4]='t';
name[5]='\0';

もしくは

strcpy(name,"1.txt"); or sprintf(name,"1.txt");
119デフォルトの名無しさん:2005/10/20(木) 02:57:58
>>117
マルチするならせめて場所を選べよ。
120117:2005/10/20(木) 03:00:10
>>119
ごめんなさい。。。
121104:2005/10/20(木) 03:11:53
お前らついにやりたいことができたよ
レスくれた人ありがとねありがとね

#include <stdio.h>
typedef struct file{
FILE *fp;
char name[255];
}sFILE;

main()
{
int i;
sFILE fp[10];
char *buf[5]={"moe.txt","vip.txt","zone.txt","ten.txt","neet.txt"};

for(i=0;i<5;i++){//sprintで連番
fp[i].fp=NULL;
sprintf(fp[i].name,"file(%d).txt",i);
}
for(i=0;i<5;i++)//自分で適当に名前付け
strcpy(fp[5+i].name,buf[i]);

for(i=0;i<10;i++){
fp[i].fp=fopen(fp[i].name,"w");
fclose(fp[i].fp);
}
}
122デフォルトの名無しさん:2005/10/20(木) 03:14:59
ちなみに stdio.h で FILENAME_MAX というのが定義される(はず)。

typedef struct file{
FILE *fp;
char name[FILENAME_MAX];
}sFILE;
123104:2005/10/20(木) 03:35:51
>>122
FILENAME_MAX見てみたら260260260とかアフォみたいに大きいから使うのやめとくよ。。
124デフォルトの名無しさん:2005/10/20(木) 03:41:07
>>115
で、なんで配列に文字列リテラルを代入できないか分かってる?
125デフォルトの名無しさん:2005/10/20(木) 03:43:34
Cで代入ができるのは、ポインタを含む基本型と構造体のみ。
126115:2005/10/20(木) 04:11:11
>>124
なんでだろう・・・
>>118の人が書いてるみたいに配列の要素1個に対して1文字しか入らないのは分かるけど
char a[15];
a="aaaaa";
ってやっちゃえば入るもんだと思ってたんだけどね・・。

でも考えて見ると
a=のaって配列の先頭アドレス指してるんだから入れれなくて当然なのかな?

でもchar a[15]="aaaaaa";ってやると入れれちゃうのはなんで・・?
127デフォルトの名無しさん:2005/10/20(木) 04:27:49
代入と初期化は違う。
で、初期化にリテラルを使う形式は
なにか別の表記法の代わりと書いてなかったかね。
128デフォルトの名無しさん:2005/10/20(木) 09:16:17

フリーで使えるプリプロセッサ単体って無いの?
(VC++はないのでオプションは使えないです・・・)
129デフォルトの名無しさん:2005/10/20(木) 09:19:29
>>126
> でもchar a[15]="aaaaaa";ってやると入れれちゃうのはなんで・・?

それは、

 char a[15] = { 'a','a','a','a','a','a','\0' };

の略記だから。
130デフォルトの名無しさん:2005/10/20(木) 09:55:47
皆、よっぽどヒマなんだろうけど
>>126 みたいなの相手にしてると
こんなのばっかり集まって来るんで
適当に放置汁。
131教えてください:2005/10/20(木) 11:52:46
問題
データの個数nとデータa1,a2.....anの値をファイルdate1.dから読みこみ、データと平均値の標準偏差を計算し結果をファイルdate2.dに出力するプログラムを作りなさい。
10個のデータは適当な数字を入れなさい。
132デフォルトの名無しさん:2005/10/20(木) 11:57:57
宿題スレへ。
133デフォルトの名無しさん:2005/10/20(木) 11:59:48
>>131
宿題は宿題スレへ。
ソフト作成依頼ならフリーソフトリクエストスレへ。
その他必要なら初心者スレなどへ。
134デフォルトの名無しさん:2005/10/20(木) 13:11:15
>>128
殆どのコンパイラにプリプロセッサは付いているはずだが?
例えばborland bccにはcpp32がある。
135デフォルトの名無しさん:2005/10/20(木) 19:12:29
標準入力から入力された文字列をポインタbufferが指すメモリ領域に保存し,その文字列中のアルファベット小文字を大文字に変換して、
ポインタresultが指すメモリ領域にコピーするプログラムをつっくたのですが、エラーが出てしまうのですがどこが間違ってるのか教えてください!!


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

#define BUFFER_SIZE 100
void capitalizeCopy(char*, char*);

int main(void)
{
char *buffer, *result;
  buffer = (*char)malloc(sizeof(char));
result = (*char)malloc(sizeof(char));
printf("input string: ");
fgets(buffer, BUFFER_SIZE, stdin);
capitalizeCopy(result, buffer);
printf("buffer: %s", buffer);
printf("result: %s", result);
exit(0);
}
void capitalizeCopy(char *dest, char *src)
{ while (src != '\0')
if (islower(*src)) { *dest = *src - 32; }
else { *dest = *src; }
src++;
}
}
136デフォルトの名無しさん:2005/10/20(木) 19:15:31
>>135
エラーの内容と場所くらい書けないのか?このボケは
137デフォルトの名無しさん:2005/10/20(木) 19:17:14
>>136
ネタだろ
138デフォルトの名無しさん:2005/10/20(木) 19:28:45
全角のアスタリスクがお茶目ね
139デフォルトの名無しさん:2005/10/20(木) 20:50:04
>>136
>どこが間違ってるのか教えてください!!
場所も訊いてるじゃないか。
140デフォルトの名無しさん:2005/10/20(木) 20:57:12
全角のアスタリスク
mallocするサイズがcharの1文字分のみ
while (src != '\0')アドレスと比較してどうする!
src++; destは++しなくていいのか?
141デフォルトの名無しさん:2005/10/20(木) 20:57:19
定数の定義にconst修飾子ではなく#defineを使う理由はありますか。
constの方が型を明示できるし、constのキーワードだけで定数と想像がつきやすいので
ベターと思うのですが。
142デフォルトの名無しさん:2005/10/20(木) 20:58:08
つーか、質問する奴ら最初に>>1読めよ。
毎回毎回似たようなやりとりで飽きてきたぞ。
143デフォルトの名無しさん:2005/10/20(木) 21:02:04
>>141
#defineの利点
・#defineで文字列を定義した場合だと連結ができる
・#defineで定義した定数が未使用の場合はメモリ確保されない(#defineは単なる置換だから)

constの利点
・型チェックをしてくれる
・複数箇所で定数を参照する場合、#defineに比べてメモリ節約になるかも
144デフォルトの名無しさん:2005/10/20(木) 21:12:52
>>141
constに代入してもコンパイルエラーにならないことがある。
145デフォルトの名無しさん:2005/10/20(木) 21:35:36
#define だと配列のサイズに直接指定できるって話が出ないのは何でじゃ?
146デフォルトの名無しさん:2005/10/20(木) 21:38:02
>>145
みんなC++のつもりで話をしているに違いない。
147デフォルトの名無しさん:2005/10/20(木) 21:39:47
そんな当たり前すぎることには誰も興味を持ってないから
148デフォルトの名無しさん:2005/10/20(木) 22:46:32
オレは、むしろenumがいいと思う
149デフォルトの名無しさん:2005/10/20(木) 23:21:57
>>128
プリプロセッサ単体のコードなら見たことあるよ
150デフォルトの名無しさん:2005/10/20(木) 23:25:11
>>128
Visual C++ ToolkitとかBorland C++みたいな無料のコンパイラを手に入れてその付属を使うしかないと思う。
151デフォルトの名無しさん:2005/10/20(木) 23:30:50
152デフォルトの名無しさん:2005/10/21(金) 02:14:09
プリプロセッサ作ってみたら?
153デフォルトの名無しさん:2005/10/21(金) 03:41:21
プリンセスプロセッサ?
154デフォルトの名無しさん:2005/10/21(金) 03:56:37
アリスプロセッサ
略してアリ(ry
155デフォルトの名無しさん:2005/10/21(金) 04:42:08
ジャンクなのだわ
156デフォルトの名無しさん:2005/10/21(金) 07:01:26
#define SUIGINTOU JUNK
157デフォルトの名無しさん:2005/10/21(金) 18:06:47
C言語初心者なのですが、とりあえずコンソールアプリケーションで何か作ってみたいと思うんですが、
とりあえず何を作るのがいいでしょうか?

なにか、こういうプログラムを作るといった目標を作ったほうがいいかなと思いまして。
158デフォルトの名無しさん:2005/10/21(金) 18:13:12
>>157
テキストエディタ
159デフォルトの名無しさん:2005/10/21(金) 18:18:09
>>157
ヒットアンドブロー
160デフォルトの名無しさん:2005/10/21(金) 18:19:03
Brainfuckインタプリタ
161デフォルトの名無しさん:2005/10/21(金) 18:24:34
Rogue
162157:2005/10/21(金) 18:36:30
>>158
作ってみたいのですが、ソースコード何行くらいになるんでしょうか?

>>159
ググって見ました。
これはなんか面白そうですね!
Cの学習に向いてそうです。

>>160
ググって見ました!
・・・・・・・なんだか、これは、、、、、すごそうですね。
C言語なんですか?

>>161
ググって見ました。
これも面白そうです。作ってみようと思います。
163デフォルトの名無しさん:2005/10/21(金) 18:37:32
(続)関数ポインタ編です。
void *な配列と関数は無敵ですよね?
なんでも有るがままに受け入れます。
但し下記プログラム中の:
pfary=(void(*((*)[2]))())mutekiVPA[0];
ppf=(void (**)())mutekiVPA[1];
このキャストがなんとも…。
何かスッキリした方法あればご教示願います。

#include <stdio.h>

void tigersfun(){printf("タイガーズが勝ったら,金なんかどうでもエエんや!\n");}
void murakami(){printf("世の中金やで、タイガーズで一儲けせんかい!\n");}

void kiyohara(){
printf("ワイは河内生まれや、最後はタイガーズで一花咲かせたらんかい!\n");
}
void nabeketu(){
printf("阪神とかロッテとか、これまで「極端に」弱いところが勝ちおって…\n");
}
void (*(*paryf())[2])(){//関数ポインタ配列を返す配列関数
static void (*pfary[2])()={tigersfun,murakami};
return &pfary;
}
void (**ppaf())(){//関数ポインタ配列を返すダブルポインタ関数
static void (*pfary[2])()={kiyohara,nabeketu};
return pfary;
}
164デフォルトの名無しさん:2005/10/21(金) 18:38:24
int main(void){
int i;
void (*((*pfary)[2])) ();
void (**ppf)();
void * mutekiVPA[2];//無敵のvoidポインタ配列
void (*poi_zatuon)();//無敵のvoid関数ポインタ

//無敵のvoidポインタ配列と関数を使う。
mutekiVPA[0]=paryf();
mutekiVPA[1]=ppaf();
pfary=(void(*((*)[2]))())mutekiVPA[0];
ppf=(void (**)())mutekiVPA[1];
for(i=0;i<2;i++){
poi_zatuon=(*pfary)[i];
poi_zatuon();
poi_zatuon=ppf[i];
poi_zatuon();
}
return 0;
}
165デフォルトの名無しさん:2005/10/21(金) 18:40:22
typedef すれば?
166デフォルトの名無しさん:2005/10/21(金) 19:10:03
Cはそのキャストいらないんじゃないの
167デフォルトの名無しさん:2005/10/21(金) 21:45:20
scanf文に\nはいるんですか?
168デフォルトの名無しさん:2005/10/21(金) 21:48:56
区切り文字に改行を明示したいんなら使うんじゃない?
169デフォルトの名無しさん:2005/10/21(金) 22:02:04
scanfの書式指定の\nはホワイトスペースを読み飛ばす指定。すなわち " " と同じ意味。
170デフォルトの名無しさん:2005/10/21(金) 22:14:42
>>163
void *と関数へのポインタとの相互には暗黙の変換はない。(相互のキャストすらできなくても良かった気がする)
つまりvoid *はオブジェクトへのポインタに対してのみ無敵。
171デフォルトの名無しさん:2005/10/21(金) 22:54:39
K&R 記述とANSI規格の記述の差分がわかるようなサイトなど
はご存知でしょうか?
K&Rの記法はなぜいけないのでしょうか?
172デフォルトの名無しさん:2005/10/21(金) 22:57:36
誰がいけないなんて言ってるんだ
173daisuke0475:2005/10/21(金) 22:59:48
はじめますて
私はC言語初めてでまだほとんどわかりません
javaはある程度わかるのですがCはまるっきりわかりません
ちなみに私はゲームを作るのにCを使おうと思っています
なのでどなたかCのコマンド(JAVAでいうタグ)辞典みたいなもの知りませんか?
もしも知っている方がいたら教えてください
174デフォルトの名無しさん:2005/10/21(金) 23:04:16
>>173
そのままずっとわからないでいて下さい。
175デフォルトの名無しさん:2005/10/21(金) 23:04:56
学校でやっている問題なのですが、考えれば考えるほど分からなくなって
ここに助けを求めにきますた…_| ̄|○

問題は、「30人のテストの得点データを読み込む。得点は0点以上10点以下。
 各点数の人数を求め、その人数を点数ごとに*の数で表しなさい。
 また、最も人数の多い得点と、最も人数の少ない得点を示しなさい。」というものです。
一応やりかけのCを張ります。

#include<stdio.h>

int main(void)
{
int i,j;
int tensu[30];
int tmp[11] = {0};

for(i = 0;i < 30; i++){
printf("%d人目:",i + 1);
scanf("%d", &tensu[i]);
}

for(i = 10; i > 0; i--){
printf("%d", i);
for(j = 0; j < tmp[i]; j++){
putchar('*');
putchar('\n');
}
}
return(0);
}
なんとなく流れは分かるんですが、それを形にできないのです…_| ̄|○
超初心者で申し訳ないんですが、教えていただけるとありがたいです(´・ω・`)
176デフォルトの名無しさん:2005/10/21(金) 23:05:54
>>173のどこが面白いのか判らない。年とったせいか?
177デフォルトの名無しさん:2005/10/21(金) 23:06:45
>>175
ここじゃない
>>1読め
178デフォルトの名無しさん:2005/10/21(金) 23:10:33
>>175
C/C++の宿題を片づけます 51代目
http://pc8.2ch.net/test/read.cgi/tech/1128493272/
179デフォルトの名無しさん:2005/10/21(金) 23:11:04
for(i=0; i<30; i++) tmp[tensu[i]] ++;
180デフォルトの名無しさん:2005/10/21(金) 23:19:35
>172
その発言いけないというは取り消します。

181デフォルトの名無しさん:2005/10/21(金) 23:27:08
K&Rは第二版からANSI対応だったと思ったが。
182デフォルトの名無しさん:2005/10/21(金) 23:45:15
>>177
トン!
すまんかった(´・ω・`)
183167:2005/10/22(土) 00:21:36
>>169
d
184デフォルトの名無しさん:2005/10/22(土) 00:24:17
>>181
古いANSIにね
185デフォルトの名無しさん:2005/10/22(土) 03:29:25
% ./a.out < data1.txt
Average score : 62.188

ID : 1234001 , score : 48 (-14.19) , grade : D
ID : 1234002 , score : 99 (+36.81) , grade : A
ID : 1234003 , score : 64 ( +1.81) , grade : C
ID : 1234004 , score : 79 (+16.81) , grade : B
ID : 1234005 , score : 53 ( -9.19) , grade : C
ID : 1234006 , score : 14 (-48.19) , grade : F
ID : 1234007 , score : 63 ( +0.81) , grade : C
ID : 1234008 , score : 92 (+29.81) , grade : A
ID : 1234009 , score : 71 ( +8.81) , grade : B
ID : 1234010 , score : 58 ( -4.19) , grade : C
ID : 1234011 , score : 85 (+22.81) , grade : A
ID : 1234012 , score : 77 (+14.81) , grade : B
ID : 1234013 , score : 60 ( -2.19) , grade : C
ID : 1234014 , score : 52 (-10.19) , grade : C
ID : 1234015 , score : 11 (-51.19) , grade : F
ID : 1234016 , score : 69 ( +6.81) , grade : B

grade : F --> 2 students
grade : D --> 1 students
grade : C --> 6 students
grade : B --> 4 students
grade : A --> 3 students

Highest score : 99
Lowest score : 11
186デフォルトの名無しさん:2005/10/22(土) 05:22:08
187デフォルトの名無しさん:2005/10/22(土) 11:57:02
daisuke0475 の検索結果 約 85 件
188デフォルトの名無しさん:2005/10/22(土) 15:44:02
>164
>166
ホントだ!キャスト無しで動きますねぇ。
>170
>void*と関数へのポインタとの相互には暗黙の変換はない。
先生!
mutekiVPA[0]=(void *)paryf();
mutekiVPA[1]=(void *)ppaf();
pfary=(void(*((*)[2]))())mutekiVPA[0];
ppf=(void (**)())mutekiVPA[1];
こんな煩わしいキャスト無しでスッキリと
mutekiVPA[0]=paryf();
mutekiVPA[1]=ppaf();
pfary=mutekiVPA[0];
ppf=mutekiVPA[1];
こうなことが出来ること自体、(void *)が無敵の証では
ないでしょうか?
189デフォルトの名無しさん:2005/10/22(土) 16:06:52
>>188
無敵ではなく無法なんだよ。
190デフォルトの名無しさん:2005/10/22(土) 16:36:56
188のプログラムはvoid*でしめられ変数名が型をものがたる様になった。
最後にはvoid*にはvoid**,void***も格納されるようになった。
伝説のプログラムの誕生である。
191デフォルトの名無しさん:2005/10/22(土) 16:52:39
またさらに、初歩的なことで先生方諸兄姉のお知恵を
拝借したいのですが、安全にメモリを解放したい
と考えて下記のようなコードを考えました。

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

int main (void){

int * p;
//mallocを使用して動的にメモリを確保する。
if(!(p=(int *)malloc(sizeof(int)*1))){
printf("メモリ確保失敗!\n");
exit(EXIT_FAILURE);
}
//これを安全にfree()したい。
#ifndef FREE
free(p);
printf("メモリは解放されました。\n");
#endif
#define FREE

//もう一度誤ってfree()を呼ぼうとするが、
#ifndef FREE
free(p);
printf("メモリは解放されました。\n");
#endif
#define FREE
//呼ばれない。
return 0;
}
192デフォルトの名無しさん:2005/10/22(土) 16:53:36
どうも
#ifndef FREE
free(p);
#endif
#define FREE
これって結構煩わしいですよね?そこでこの部分を
そっくり
#define SAFEFREE(p)というような形でマクロ化したい
のですがどうしたら良いのか?分かりません。
このマクロ定義方法をご教示下さい。
193デフォルトの名無しさん:2005/10/22(土) 16:55:08
すみません、質問おねがいします。

mallocで確保した二次元配列outに対して、

for( i = 0 ; i < max1 ; i++)
{
for(j = 0 ; j < max2 ; j++)
{
printf("%c\n",out[max1][max2]);
}
if(out[max1] == NULL)
exit(0);
}

以上のようにした時に、

内側にあるfor文をコメントアウトすると下部のif文は成り立たず、exitしませんでした。
しかし、コメントアウトを外すとif文が成り立ち、exitが呼び出されてしまいました。

これはprintfによってメモリにアクセスした際に何かを壊してしまっているのでしょうか?
194デフォルトの名無しさん:2005/10/22(土) 16:56:54
while (なんか) {
if (なんか) {
break;
}}

この場合でbreakまで行ったらどうなるの?
while文も抜け出す?
195デフォルトの名無しさん:2005/10/22(土) 16:57:02
>free() はポインタ ptr が指すメモリ空間を解放する。
>ptr が NULL の場合には、なんの動作も行われない。

これって処理系依存なのかな? 規格だと思ってたんだけど?
>191 は初期化でNULLを入れて、後freeしたらNULLを入れて、ってやればそれですむ
196デフォルトの名無しさん:2005/10/22(土) 17:00:45
>>195に一票
197デフォルトの名無しさん:2005/10/22(土) 17:14:31
>>193
for( i = 0 ; i < max1 ; i++)
{
if(out[max1] == NULL)
exit(0);
for(j = 0 ; j < max2 ; j++)
{
printf("%c\n",out[max1][max2]);
}
if(out[max1] == NULL)
exit(0);
}

こう書いて2度目の分岐でexitしたならば貴方の推測は正しいのでしょう。
以上。
198デフォルトの名無しさん:2005/10/22(土) 17:15:17
> 186 ありがとうございます。
ANSI の書き方はこうで、K&R の書き方はこうでの例が詳しく書い
ているものがあると更に助かります。
(K&RからANSIへ変更しての移植作業で時間掛けずにを修正を簡単に
したい。見直したい。思いがあります。)
199デフォルトの名無しさん:2005/10/22(土) 17:19:53
>>193
なんかout[max1][max2]とかout[max1]って、いかにも確保した領域からはみ出たとこ参照してそうだね。
mallocをどうやったのか知らんけど。
おそらくout[i][j]とかの間違い?

>>194
while文「も」、というかwhile文「を」抜け出す。
ifはbreakと関係ないよ。
200194:2005/10/22(土) 18:26:56
for (なんか) {
for (なんか) {
break;
}}
じゃあこれはどうなんでしょう?
breakに来たとき、「外側のforも抜け出す」か「内側のforのループを
抜け出して外側のforへ行く。終わらせるためにはbreakがもう一つ必要」か。
201デフォルトの名無しさん:2005/10/22(土) 18:33:40
それくらい自分で試せよ
202デフォルトの名無しさん:2005/10/22(土) 19:16:52
#ifndef FREE
free(p);
#endif
#define FREE

激わろたwwww
203193:2005/10/22(土) 19:32:48
ダブルポインタを引数にしていたのですが、
その際に扱いを間違えていたようでした。
お手数かけてすみません。
204デフォルトの名無しさん:2005/10/22(土) 19:59:09
Cのプログラムでものすごい大きな整数を扱いたいのですが、
どのようにするのが一般的でしょうか。

250ビットくらいの整数を扱いたいと思っています。
205デフォルトの名無しさん:2005/10/22(土) 20:01:05
そこらに転がっている多倍長演算ライブラリを使う
206デフォルトの名無しさん:2005/10/22(土) 21:41:33
>>191
そんなに安全にメモリを解放したければC++使え。
207デフォルトの名無しさん:2005/10/22(土) 21:43:05
シングルトン
208デフォルトの名無しさん:2005/10/22(土) 22:32:49
ポインタへのポインタってダブルポインタって言うのは定着してるの?
ここで初めて聞いたんだが
209デフォルトの名無しさん:2005/10/22(土) 22:42:30
じゃぁポインタのポインタのポインタはとりっぽん?
210デフォルトの名無しさん:2005/10/22(土) 22:43:13
ぬるぽんw
211デフォルトの名無しさん:2005/10/22(土) 22:45:45
>>208
新卒の就職希望者がよくそういうのを耳にする。
どうやら専門学校辺りで言うらしい。

ちなみに、「ダブルポインタはばっちりですけどトリプルポインタは自信がありません」と
言っていた香具師は、ポインタをまともに理解していなかった。
212デフォルトの名無しさん:2005/10/22(土) 23:01:32
ダブルでもトリプルでも良いがそんな事はポインタの本質には全く関係ないな
213デフォルトの名無しさん:2005/10/22(土) 23:06:52
ダブルポインタでググると224しかヒットしない。
"double pointer"だと16,300ヒットする。
214デフォルトの名無しさん:2005/10/22(土) 23:12:38
>>213
そりゃdouble*の方が引っかかるからね。
215デフォルトの名無しさん:2005/10/22(土) 23:35:35
**aa;
*a[0];
*a[];

上記の違いを述べよ
216デフォルトの名無しさん:2005/10/22(土) 23:37:19
「ダブルポインタはばっちりですけどトリプルポインタは自信がありません」
なんて言葉が出てくる時点で、ポインタをちゃんと理解できてないと分かるね。
217デフォルトの名無しさん:2005/10/22(土) 23:55:05
>>216
禿同
218デフォルトの名無しさん:2005/10/22(土) 23:56:56
ダブルポインタとかトリプルポインタとかぬかす香具師は、
「int ****」とか「int ****************」とかは何て呼ぶつもりなんだろうね?
219デフォルトの名無しさん:2005/10/22(土) 23:59:47
1:single, 2:double, 3:triple, 4:quadruple, 5:quintuple,
6:sextuple, 7:septuple, 8:octuple, 9:nonuple, 10:decuple
220デフォルトの名無しさん:2005/10/23(日) 00:00:49
クアドループルポインタとヘキサデキュープルポインタ。
221デフォルトの名無しさん:2005/10/23(日) 01:38:45
こういうので4以上は(場合によっては2や3以上も)、普通multipleっていうけどな。
英語だと ** は double pointer ではなく pointer to pointer。
**************** なんかは pointer with 16 stars とか 16 dereferences あたりかな?
4つくらいなら頑張って「pointer-to-pointer-to-pointer-to-pointer-to-int」とか言うかもw
222デフォルトの名無しさん:2005/10/23(日) 01:41:12
その議論に何か意味があるのか?
223デフォルトの名無しさん:2005/10/23(日) 01:44:11
意味がないと思うならスルーして他の話題を振るように。
224デフォルトの名無しさん:2005/10/23(日) 02:37:45
Wallオプションで、
警告:関数’exit’の暗黙の宣言 なるエラーが出るのですが、これは何ですか?
225デフォルトの名無しさん:2005/10/23(日) 02:41:18
>>224
とりあえずstdlib.hインクルード
226デフォルトの名無しさん:2005/10/23(日) 02:49:41
>>225
直りました^^ありがとうございます。

exit()関数は、stdlib.hと ¢(..)メモ しておきます。
227デフォルトの名無しさん:2005/10/23(日) 03:12:06
8byteのバイナリの文字を、一意にハッシングする方法って
どうするのですか?
228デフォルトの名無しさん:2005/10/23(日) 03:13:47
フリーのbcc5.5で警告の表示を抑えるために
#pragma warning(disable:8065)
としても、プロトタイプ宣言がないという警告が全部表示されてしまいます。
ソースの一部分だけを抑制したいので、オプションの-w-8065にはしたくないのです。
(実際には他にも8004と8008も抑制したい部分があります)
どうしたら警告を表示させないようにできるでしょうか?
229デフォルトの名無しさん:2005/10/23(日) 03:20:20
>>227
標準Cにはそのような関数はありません
自作してください
230デフォルトの名無しさん:2005/10/23(日) 03:22:44
>>228
その pragma は VC++ のでは。
231デフォルトの名無しさん:2005/10/23(日) 03:27:22
>>230
なんと、そうなのですか。
bccで同様のこと(部分的に警告抑制)をするのは無理ということでしょうか?
232デフォルトの名無しさん:2005/10/23(日) 05:42:11
うーん。
bcc のマニュアルの #pragma のところを見るか、
Borland C++ スレで聞いてくれ。
233デフォルトの名無しさん:2005/10/23(日) 05:50:25
>>171
でもK&R第1版の頃、つまりANSI規格化前の書式で書かれたソースは
読みにくいぞ。ANSI 以降に覚えたヤツにとっては。
234228:2005/10/23(日) 06:18:36
>>232
どうやらBCCに付属してきたヘルプには、プリプロセッサのディレクティブの説明は見当たらないので、専用のスレで聞いてみたいと思います。
レスどうもでした。
235228:2005/10/23(日) 06:27:14
>>232
タダで使えるBorland C++ Part4

をROMっていたら#pragma optionというのを見かけたので、ためしに
#pragma option -w-8065
としたらできました!
コマンドラインオプションをそのままソース中に書く感じみたいです。
助言のおかげで助かりました。ありがとうございます。
恥ずかしながらpragmaは標準みたいなものだと勘違いしていたので、>>230のレスにも感謝です。
236デフォルトの名無しさん:2005/10/23(日) 07:10:57
printfで 0x05のように16進数で2桁まで表示するには引数をどう指定したらいいですか?
$#xでは 0x5になってしまって困ってます
237デフォルトの名無しさん:2005/10/23(日) 07:11:56
%#xの間違いでした
238デフォルトの名無しさん:2005/10/23(日) 07:19:35
自己解決しましたorz
239デフォルトの名無しさん:2005/10/23(日) 07:57:58
%#02xでいいと思ってたときが漏れにもありました。
なんで0のときに0xがつかないんでしょうか。
240デフォルトの名無しさん:2005/10/23(日) 10:20:19
>x と X 変換の場合、数値が 0 でないときには文字列 `0x'
>(X 変換の場合には `0X') が前に付与される。
241239:2005/10/23(日) 10:27:03
>>240
いやさ、0のときにカラム数が変わってしまうのが不便だって話なんだが。
242デフォルトの名無しさん:2005/10/23(日) 10:45:53
基本は、自分で0xつける方向で。
243デフォルトの名無しさん:2005/10/23(日) 10:51:04
そんな瑣末なことは疑問に思ったこともないな。
244デフォルトの名無しさん:2005/10/23(日) 13:13:49
>195
御意。
ただ、初期化のNULLを入れっぱなしで、
後それを使えますかね?
245デフォルトの名無しさん:2005/10/23(日) 13:18:04
>>244
意味がわからん。
246デフォルトの名無しさん:2005/10/23(日) 13:24:38
>191
>244
例えばこんなマクロは考えられますよね?
#define SAFEFREE(n) free(n); \
n = NULL
とか
#define SAFEPTR(type,n) type __temp; \
type *n; \
n =&__temp; \
*n=(type)NULL
こんなのとか。
後者の場合
SAFEPTR(int,p);
でいきなり
*p=15;
数値を代入出来ます。
私が言いたいことはそうではなくて、むしろ
だれかが激しくWされた
#ifndef FREE
free(p);
printf("メモリは解放されました。\n");
#endif
#define FREE
これ自体をマクロ化する方法は無いでしょうか?
と問うておる訳です。マクロのネストは可能
なんでしょうかねぇ。
247デフォルトの名無しさん:2005/10/23(日) 13:28:18
>>246
酔っているのか?

もう一回聞きたいことをまとめてみろ
248デフォルトの名無しさん:2005/10/23(日) 13:31:07
自分でまともにメモリー管理が出来ないんならCやめれば?
マクロなんかで解決しようとしている時点で終わってるよ。
249デフォルトの名無しさん:2005/10/23(日) 13:32:07
>>246
はいはい。Javaが貴方を待っているよ。
250デフォルトの名無しさん:2005/10/23(日) 13:32:37
>>246

できない。 あきらめろ。
251デフォルトの名無しさん:2005/10/23(日) 13:34:02

void f() {
char* p = malloc(SIZE);

if (foo()) {
SAFEFREE(p);
return;
} else {
bar();
}
SAFEFREE(p);
}

252デフォルトの名無しさん:2005/10/23(日) 13:37:52
たとえマクロに出来たとしても、以下のような場合はどうするつもりなんだろう?
そもそも、freeされたかどうかの情報をプログラム中にグローバルで静的に
持とうという考えが間違ってる気がする。

if(なんかの条件){
#ifndef FREE
free(p);
printf("メモリは解放されました。\n");
#endif
#define FREE
}

// ここでfreeを呼ぼうとするが
#ifndef FREE
free(p);
printf("メモリは解放されました。\n");
#endif
#define FREE
//呼ばれない。
253デフォルトの名無しさん:2005/10/23(日) 13:55:39
あーあ、安直なこと書かなきゃいいのに…
254デフォルトの名無しさん:2005/10/23(日) 14:02:02
int i;
int *p = NULL;
for (i = 1; i <= 3; ++i) {
switch (i) {
case 4:
#ifndef FREE
free(p);
printf("memory released.\n");
#endif
#define FREE
break;
case 2:
*p = 5;
break;
case 1:
p = malloc(sizeof(int));
break;
case 3:
printf("%d\n", *p);
#ifndef FREE
free(p);
printf("memory released.\n");
#endif
#define FREE
break;
}
}
255デフォルトの名無しさん:2005/10/23(日) 14:19:09
学生番号とその学生の試験の成績のデータ(data1.txt) がある
(これはファイルからリダイレクトで読み込む)
平均点
学生毎の学生番号、得点、平均との差、評価(A、B、C、D、F)
・平均との差の符合付き表現は 「 %+6.2f 」 の書式を使えばできる。
・点数から評価への変換は、 第一回演習の問題3の、 関数evalが再利用出来る
各評価(A、B、C、D、F)の人数
最低得点と最高得点
% ./a.out < data1.txt
Average score : 62.188
ID : 1234001 , score : 48 (-14.19) , grade : D
ID : 1234002 , score : 99 (+36.81) , grade : A
ID : 1234003 , score : 64 ( +1.81) , grade : C
ID : 1234004 , score : 79 (+16.81) , grade : B
ID : 1234016 , score : 69 ( +6.81) , grade : B
grade : F --> 2 students
grade : D --> 1 students
grade : C --> 6 students
grade : B --> 4 students
grade : A --> 3 students
Highest score : 99
Lowest score : 11
256デフォルトの名無しさん:2005/10/23(日) 14:22:32
はぁ?
257デフォルトの名無しさん:2005/10/23(日) 14:24:44
>>185と同じでよくわからんがとりあえず氏ね
258デフォルトの名無しさん:2005/10/23(日) 15:22:01
Cの魅力って何?
259デフォルトの名無しさん:2005/10/23(日) 15:25:03
>>258
お前の魅力と同じだよ
260デフォルトの名無しさん:2005/10/23(日) 17:20:00
UNIXのそーすがよめること
261デフォルトの名無しさん:2005/10/23(日) 18:46:32
>252
マクロはコードを制御出来ますよね。即ち無敵です。
そのマクロ自体を制御するにはどうしたら良いのか?
一連の発言における目的はかなり射程が大きいのです。
例えば
#define xxx #define yyy zzz
とか、単なるコード上の文字置換えであれば可能ですよね?
それが出来ないのです。
では、もっとプリミティブなマクロです。
#include <stdio.h>
#define KOE(n) zatuon##n ()

void zatuon1(){
printf("虎キチ:タイガーズが勝ったら,金なんかどうでもエエんや!\n");
}
void zatuon2(){
printf("村上:世の中金やで、タイガーズで一儲けせんかい!\n");
}
void zatuon3(){
printf("キヨ:ワイは河内生まれや、最後はタイガーズで一花咲かせたらんかい!\n");
}
void zatuon4(){
printf("ナベケツ:阪神とかロッテとか普段は弱いところが勝ちおって…\n");
}
262デフォルトの名無しさん:2005/10/23(日) 18:47:23
int main(void){

#if 1
KOE(1);
KOE(2);
KOE(3);
KOE(4);
//これは動くが意味が無い。
#else
for(i=1;i<=4;i++)
KOE(i);
//と関数配列っぽくやってみたが動かない!
#endif

return 0;
}
この関数マクロ配列が動く方法あればご教示下さい。
#elseを外せってのは無しで…
263デフォルトの名無しさん:2005/10/23(日) 18:50:54
関数テーブルにすればいいだけ。
阿呆すぎ。
264デフォルトの名無しさん:2005/10/23(日) 18:52:01
そういう用途ならboost preprocessor使え。
まぁ自分なら素直に関数テーブル使うけど。

265デフォルトの名無しさん:2005/10/23(日) 18:53:15
> #define xxx #define yyy zzz
> とか、単なるコード上の文字置換えであれば可能ですよね?
> それが出来ないのです。
そんなコンパイラ捨ててしまえ。
266デフォルトの名無しさん:2005/10/23(日) 18:55:55
>>261
> マクロはコードを制御出来ますよね。即ち無敵です。
こんなこといっている奴に未来はない。
267デフォルトの名無しさん:2005/10/23(日) 18:56:35
>>265
defineディレクティブの中にプリプロセッサ命令を入れることは出来ないよ。
268デフォルトの名無しさん:2005/10/23(日) 18:57:43
>>261
射程が大きいのはいいことだが、
せめて定石くらいはマスターした方がいいかと。
269質問です。:2005/10/23(日) 19:15:01
JPEGを読み込んでRGBの値を得るプログラムを教えてください。
270デフォルトの名無しさん:2005/10/23(日) 19:18:36
Photoshop。
271デフォルトの名無しさん:2005/10/23(日) 19:27:45
Cのマクロは単なトークン置き換え処理
コードそのものを制御したいならlispでも使いなさい
272デフォルトの名無しさん:2005/10/23(日) 19:29:17
libjpeg
273デフォルトの名無しさん:2005/10/23(日) 20:15:48
>>262
はぁ?プリプロセッサの役割わかってから出直してきてください
274デフォルトの名無しさん:2005/10/23(日) 20:16:33
>>262
デバグでプリプロセッサ使えるようになってからにしろ
275デフォルトの名無しさん:2005/10/23(日) 20:22:24
無敵厨ウザス。幼稚園児なみの理屈も無いし。もうレスもやめれ。
276デフォルトの名無しさん:2005/10/23(日) 20:24:14
>>261
無敵ではなく無駄とか無謀とか無策(ry
277デフォルトの名無しさん:2005/10/23(日) 21:32:17
>>262
関数ポインタを勉強してきてください。
278質問です。:2005/10/23(日) 21:45:57
libjpeg調べてみます。
279デフォルトの名無しさん:2005/10/23(日) 22:24:02
>>246
とにかくマクロ置き換えの結果に再びプリプロセッサディレクティブが現れても、
プリプロセッサはそいつを認識しない。だからお前が考えていることはできない。
280デフォルトの名無しさん:2005/10/23(日) 22:53:27
バイナリサーチについて調べていて、このサイトをみつけました。
ttp://www1.cts.ne.jp/~clab/hsample/Mem/Mem3.html

ここにソースがありますが、これだと「0番目と1番目の間に当たる単語」をキーとした場合、「見つかりません」という表示がでませんよね?
(ex)この場合attoaのように)
これはどのようにして解決すればよいのでしょう?
281デフォルトの名無しさん:2005/10/23(日) 23:31:13
>if(top == middle + 1)
> BSearch(key, base, middle, top + 1);
> else

この部分を削除。main()から呼ぶときにデータの個数をtopに渡すようにする。
あと再帰からの戻り値を上に返してないし、これ動作確認とってないんじゃないか?
282デフォルトの名無しさん:2005/10/23(日) 23:32:49
これなんだけど、何処がおかしいんでしょうか?
#include<stdio.h>
#define KAZU 10
void bubble_sort(int *a[], int n)
{
int i, j, t;
for (i = 0; i < n - 1; i++)
for (j = n - 1; j > i; j --)
if (*a[j-1] > *a[j]) {
t = *a[j]; *a[j] = *a[j-1]; *a[j-1] = t;
}
}
int main()
{
int i,k;
int va[10]={1,43,42,44,14,2,46,44,5,34};
int vi = 10;
for(i=0;i<10;i++){
k = va[i];
printf("%d\n",k);
};
bubble_sort(&va[0],vi);
puts("sort");
for(i=0;i<10;i++){
k = va[i];
printf("%d\n",k);
};
return 0;
}
警告 W8075 bubble.c 25: 問題のあるポインタの変換(関数 main )
283デフォルトの名無しさん:2005/10/23(日) 23:34:05
> if ((temp = strcmp(key, base[middle])) == 0)
> return (middle);
へんだけど、この部分だけたどって返されているのかとおもた?
284デフォルトの名無しさん:2005/10/23(日) 23:42:34
void bubble_sort(int a[], int n)
こう書くと、パラメータ 'a' は int * 型として定義されている と覚えておいて良いでしょうか?
285デフォルトの名無しさん:2005/10/23(日) 23:44:55
引数に配列定義すると、配列のアドレスが入るんですか?^^
286デフォルトの名無しさん:2005/10/23(日) 23:44:59
>>284
int[]型
287デフォルトの名無しさん:2005/10/23(日) 23:57:51
>>286
名にそれ
288285:2005/10/23(日) 23:58:38
ぬるぽ^^
289デフォルトの名無しさん:2005/10/24(月) 00:01:04
>>284
そこは関数の引数だからそのとおり。

>>286
いや、だからそこは関数の引数だからさ。

>>287
intの配列型

>>289
ガッ
290デフォルトの名無しさん:2005/10/24(月) 00:07:31
>>289
291デフォルトの名無しさん:2005/10/24(月) 00:11:57
>>289
配列とポインタでの参照は相互に変換可能だけど配列を渡したのだから配列と見るべき
と、宗教論争に持ち込んでみる
292デフォルトの名無しさん:2005/10/24(月) 00:14:49
ポインタスレでやれ
293デフォルトの名無しさん:2005/10/24(月) 00:14:58
>>291
pgr
294285:2005/10/24(月) 00:22:51
>>289
トンクスコ^^
295デフォルトの名無しさん:2005/10/24(月) 00:41:27
質問です。
char *a[]と宣言したら、char型ポインタを要素として持つ配列
char (*a)[]と宣言したら、char型配列へのポインタ

という意味でしょうか?
296デフォルトの名無しさん:2005/10/24(月) 00:49:28
>>295アナルの皺の数による
297デフォルトの名無しさん:2005/10/24(月) 00:49:47
わかりました
298デフォルトの名無しさん:2005/10/24(月) 00:53:42
>>295
つーか試した結果はどうだったのかな
299デフォルトの名無しさん:2005/10/24(月) 02:16:13
>>295
言葉の通りの意味。
300デフォルトの名無しさん:2005/10/24(月) 03:28:25
すみませんファイルシークについての質問です。

現在のファイル位置表示子の位置(指定された位置からのオフセットを返すのが望ましい)を調べるには、
どのような関数が提供されていますか?
301デフォルトの名無しさん:2005/10/24(月) 03:34:34
ftell(FILE *stream);
がそれっぽい関数ですね・・お騒がせしました
302デフォルトの名無しさん:2005/10/24(月) 04:13:03
アドレスポインタにいくつか数字を足したい場合には

int i=3;
n=*addres+i;

という形で良いのでしょうか?
nに加算されたアドレスが入るはずと思い↑は書きました。
303デフォルトの名無しさん:2005/10/24(月) 04:18:42
>>302
つ[初心者歓迎スレ]
つ[初心者質問スレ]
304デフォルトの名無しさん:2005/10/24(月) 04:38:40
>302
やりたいこともわからんし、nの型もわからん
305デフォルトの名無しさん:2005/10/24(月) 04:42:39
address のつづりも違う
306デフォルトの名無しさん:2005/10/24(月) 05:07:57
>>302
ポインタに数値を加える = 参照メモリアドレスを変更する
307デフォルトの名無しさん:2005/10/24(月) 13:08:16
libjpegを調べても、よく分かりません。
308デフォルトの名無しさん:2005/10/24(月) 15:25:54
問題:2次方程式ax^2+bx+c=0(a≠0)の実数解の個数を返す関数int solve(double a,double b, double c)を作れ。
注:関数内での方程式の解を外部変数 answer1, answer2へ代入するような関数にすること。

ってあるんだですが、どうやってプログラムを作ればいいんですか?どんなプログラムを作っていいか全くわからないのですが・・・。
309デフォルトの名無しさん:2005/10/24(月) 15:33:55
宿題は宿題スレへ
310デフォルトの名無しさん:2005/10/24(月) 15:37:27
>>308
> 注:関数内での方程式の解を外部変数 answer1, answer2へ代入するような関数にすること。
虚数解はどんな振る舞いをすればわからない関数。
外部変数に値を代入する関数。

そんな糞関数は作れてもここで晒す気にはなれんな。
311デフォルトの名無しさん:2005/10/24(月) 15:51:34
>>309
>>310
わかりました。宿題スレで聞いてみます。
312デフォルトの名無しさん:2005/10/24(月) 15:57:11
gchar や gint のように関数のパラメータの型宣言で g のついてる型って、
どういう意味ですか。
313デフォルトの名無しさん:2005/10/24(月) 15:59:07
glibで定義された型だな
ANSIで定義している型は実装依存で実現できる範囲が厳格に定義されてないけど
実体を持つライブラリとしては厳格に定義したいそれで、gintとかgcharを定義した
314デフォルトの名無しさん:2005/10/24(月) 16:01:17
わかりました。どうもありがとさんです。
315デフォルトの名無しさん:2005/10/24(月) 16:15:06
>>310
そのための戻り値 int だろうに・・・。
316デフォルトの名無しさん:2005/10/24(月) 18:47:06
_beginthreadex()の第六引数ってNULLじゃ駄目?
317デフォルトの名無しさん:2005/10/24(月) 19:19:54
>>316
だめ。というよりすれ違いでここで話するのもだめ。
318デフォルトの名無しさん:2005/10/24(月) 21:06:57
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char card[13][4];
FILE *fp;
int search(char c){
char a;
rewind(fp);
while(fscanf(fp,"%d",&a)!=EOF){ if(c==a) return 1; }
return 0;
}
void shuffle(){
int i,j;
srand((unsigned)time(NULL));
for(i=0;i<13;i++){
 for(j=0;j<4;j++){
 do{ card[i][j]=(((rand()%4)<<4)+((rand%13)+1));
  }while(search(card[i][j]);
 fprintf(fp,"%d",card[i][j]); } }
}
main(){
fp=fopen("check","a+");
shuffle();
fclose(fp);
}
=======================================
Segmentation fault(core dumped)
って出るんですけどどこが間違いですか?
319デフォルトの名無しさん:2005/10/24(月) 21:14:06
>>318
お前の頭
320デフォルトの名無しさん:2005/10/24(月) 21:17:52
while( search(card[i][j]) ) ;
あと、出来るだけデフォルトでintの時でも値を返してください。
321320 :2005/10/24(月) 21:18:55
あげちゃってごめんなさい...
322デフォルトの名無しさん:2005/10/24(月) 21:45:00
>>318
Segmentation faultの直接原因は恐らくfscanf()で"%d"に対してchar *を渡していること。
しかし、それを解決したところで期待したとおりの動きになるかどうかは知らん。
アルゴリズムについても意見を求めたいなら初心者スレなどへ。
323デフォルトの名無しさん:2005/10/24(月) 21:45:39
>>320
なにを指摘しているの?
2行目も意味不明だし。
324デフォルトの名無しさん:2005/10/24(月) 21:49:25
fscanfwww
325デフォルトの名無しさん:2005/10/24(月) 21:51:14
)が足りないだろよく見ろ氏ね
326デフォルトの名無しさん:2005/10/24(月) 22:07:54
>>325
んなもんで Segmentation fault するわけねーだろよく見ろ氏ね
327デフォルトの名無しさん:2005/10/24(月) 22:09:28
326てめーが氏ね酒粕
328デフォルトの名無しさん:2005/10/24(月) 22:12:18
マターリしようよ氏ね
329デフォルトの名無しさん:2005/10/24(月) 22:13:26
2chって本当に怖いですね。
さよなら・さよなら・・さよなら
330デフォルトの名無しさん:2005/10/24(月) 22:22:55
まあ core dump以前に compile error が複数あるソース貼って聞くなよ、と。
突込みどころたくさんすぎなので、初心者スレ逝け。
デバッガの使い方くらい覚えろ。もしくはプログラム書くな。迷惑だ。
>>322
確実にへんな動作だろうな。コード見ただけで激しく凶暴な気分に…
まして fprintf(,"%d",); fscanf(,"%d",) こんな組み合わせで、
書き込んだ数値をまともに読み直せるわけもなし。
fopen(,"a+") でこんなことすんのかよ…
つか、やりたいことはおそらく、ファイルに保存を途中で挟まないで
簡単にできるので、このコード捨て。
331デフォルトの名無しさん:2005/10/24(月) 22:25:04
>>326
char*に対してintアクセスしたらfaultしない?
332デフォルトの名無しさん:2005/10/24(月) 22:39:01
_beginthreadexで生成したスレッドを強制終了させるにはどうすればいいのでしょうか
333デフォルトの名無しさん:2005/10/24(月) 22:43:51
>>332
TerminateThread()ただし、ほぼリークするけど。
つか、強制終了させなきゃならないケースなんてそんなに無いはず。
もしその状況が頻繁に起こるなら、設計を見直すべき。
334デフォルトの名無しさん:2005/10/24(月) 22:43:51
335デフォルトの名無しさん:2005/10/24(月) 22:56:06
そういやスレ違いだよな。誘導するべきだったorz失礼。

>>332
答えは333なんだが、これ以上聞くなら以下に移動してくれ。
ちなみに、_beginthreadexはwin32限定の関数だ。

Win32API質問箱 Build36
http://pc8.2ch.net/test/read.cgi/tech/1128951330/

マルチスレッドプログラミング相談室 その3
http://pc8.2ch.net/test/read.cgi/tech/1098268137/
336デフォルトの名無しさん:2005/10/24(月) 23:24:56
>>333-335
すいませんでした。
337デフォルトの名無しさん:2005/10/25(火) 00:34:49
例1:
charszTmpFile[_MAX_PATH];
strcpy( szTmpFile, "" );

例2:
charszTmpFile[_MAX_PATH];
szTmpFile[0] = '\0';

例1と2は同じ動きだと思うのですが
それぞれ意図するところが違うのでしょうか?
それとも単に好みの問題?
338デフォルトの名無しさん:2005/10/25(火) 00:36:07
例1:
char szTmpFile[_MAX_PATH];
strcpy( szTmpFile, "" );

例2:
char szTmpFile[_MAX_PATH];
szTmpFile[0] = '\0';
339デフォルトの名無しさん:2005/10/25(火) 00:47:28
>>337
意図は書いた本人にしかわからん。
340デフォルトの名無しさん:2005/10/25(火) 00:49:58
4で割り切れるか割り切れないかの判断プログラムってどうなるかわかりますか?
341デフォルトの名無しさん:2005/10/25(火) 00:51:48
if ((value % 4) == 0) {
// 割り切れる
}
else {
// 割り切れない
}
342デフォルトの名無しさん:2005/10/25(火) 00:53:49
i & 3==0
343デフォルトの名無しさん:2005/10/25(火) 00:53:55
>>337
「好みの問題」が結論だと思う。
関数参照のオーバーヘッドが云々という人がいるかも知れないが、
この種のことが問題になる開発は希少だ。
#私は szTmpFile[0] = 0; と書くぞw
344デフォルトの名無しさん:2005/10/25(火) 00:54:32
>>339
どうもありがとう。
345デフォルトの名無しさん:2005/10/25(火) 00:58:22
>>343
どうもありがとう。
szTmpFile[0] = 0; と書くことにします。
346デフォルトの名無しさん:2005/10/25(火) 01:05:23
>>341
ご迷惑をおかけしました!!
347デフォルトの名無しさん:2005/10/25(火) 01:21:33
質問です。
ログインウィンドウを作ってみたいのですが、
外部ファイルの文字列を読み込んで比較とかできるでしょうか?
もし読めたとしてもユーザ名とパス両方を比較となると難しそうです。
このようなプログラムはどのようにかかれているのでしょうか?
348デフォルトの名無しさん:2005/10/25(火) 01:23:33
>>342
それは分かりづらいだろ
349デフォルトの名無しさん:2005/10/25(火) 02:45:54
あれが分かりづらい人間がいったいどうやってCでコード書いてるんだろうか。
350デフォルトの名無しさん:2005/10/25(火) 02:56:10
scanf関数ってなぜ悪名高いんですか?
351デフォルトの名無しさん:2005/10/25(火) 02:57:10
馬鹿が使うととんでもない事になるから。
352デフォルトの名無しさん:2005/10/25(火) 03:01:55
i&3ってなんなの?
353デフォルトの名無しさん:2005/10/25(火) 03:03:28
>>351
そーなのか
例えばどんな・・?
恐ろしい関数だな
354デフォルトの名無しさん:2005/10/25(火) 03:28:13
>>352
i & 3 == 0 なら 4 で割り切れるってこと。
355デフォルトの名無しさん:2005/10/25(火) 08:20:10
typedef struct {
double coef[12;
int degree;
} mpz_poly_t;
typedef mpz_poly_t mpz_poly[1];



int main(int argC, char *args[])
{

mpz_poly_t t;

mpz_poly f;
・・・・

上のプログラムで
typedef mpz_poly_t mpz_poly[1];は
mpz_poly_tの配列にmpz_polyという名前をつけているという意味でしょうか?
typedef 構造体 名前[1];という表現は良く見かけるが、[1]とすると何か便利なことがあるのでしょうか?
あと、mpz_poly f の fの型は構造体の配列へのポインタであっているでしょうか?
356デフォルトの名無しさん:2005/10/25(火) 09:16:41
>何か便利なことがあるのでしょうか?
何も考えなくても参照渡しするようにできるからじゃない?
357デフォルトの名無しさん:2005/10/25(火) 09:49:12
>>349
直感的には判り辛い。
「4の剰余」と「下2ビット」は
結果が同じでも意味が違う。
358デフォルトの名無しさん:2005/10/25(火) 10:16:24
>>355
なにそのtypedef?初めて見たんだけど。
typedef mpz_poly_t * mpz_poly;
とは違うんか?詳しい人、漏れからも解説キボンヌ。
359デフォルトの名無しさん:2005/10/25(火) 10:23:33
>>355
void mpz_poly_show_info(mpz_poly self) {
 int i;
 for(i = 0; i < 12; i++)
  printf("%d : %f\n", self->coef[i]);
 printf("%d\n", self->degree)
}

void foo(void) {
 mpz_poly poly = { 0 };
 poly->degree = 90;
 mpz_poly_show_info(poly);
}

こんな感じで、
& とかつける必要が無くなるし、
そのまま変数定義にも使える、
というトリック。
360名無し:2005/10/25(火) 10:27:34
問題です
Yamada、Yoshizaki、Suzuki、Kato、Kamata、Kuwata、Maeda
をポインタ配列へ登録し、イニシャルを入力するとそのイニシャルを持つ名前のみを表示するプログラムを作成しなさい
なお、イニシャルの入力はmain()関数にて行い、ユーザ関数は、判別表示のみで行なうようにすること。

どなたかオチカラをm(__)m
361デフォルトの名無しさん:2005/10/25(火) 10:33:25
宿題は宿題スレへ
362デフォルトの名無しさん:2005/10/25(火) 10:43:26
多くの初心者って、
どうして「どんな処理をするべきか」を自分で考えないのだろうか?
363デフォルトの名無しさん:2005/10/25(火) 10:47:36
そんな事を考える奴はここに来ないし
364名無し:2005/10/25(火) 10:51:13
>361
すいませんでした。
365デフォルトの名無しさん:2005/10/25(火) 11:30:55
>>362
初心者かどうかに関わらず、>>1 も読まない奴なんてそんなもの。
366デフォルトの名無しさん:2005/10/25(火) 12:30:39
>>353
間違った使い方をすると鼻から悪魔が出てくる可能性がある。
# まだ俺は見たこと無いけどな。

間違った使い方をすると、2度と立ち上がらなくなる
# 一度だけやってしまった...

ま、最近はそこまで悲惨な結果になることはないけどな。
367デフォルトの名無しさん:2005/10/25(火) 12:35:30
>>366
それは、scanf()に限った話じゃなかろう
368デフォルトの名無しさん:2005/10/25(火) 14:30:46
>>367
だが、初心者が一番嵌りやすい関数であることは確かだな。
可変長引数のポインタ渡しなどというCでも上位ランクの凶悪な関数だ。
369デフォルトの名無しさん:2005/10/25(火) 14:49:34
getsと違って正しい使い方が存在するというのもいやらしいなw
370デフォルトの名無しさん:2005/10/25(火) 14:52:28
そういうのは自分でその穴を突けてから言えよw
371デフォルトの名無しさん:2005/10/25(火) 15:50:04
>>359
表記を簡潔にするためのテクニックでしたか。
親切にありがとうございます。

>>358
たぶん、
typedef mpz_poly_t * mpz_poly;
mpz_poly poly;
だと、値などを構造体へ代入する場合に、
初期化 poly = malloc(sizeof(mpz_poly_t));が必要になるのだと思う。
372デフォルトの名無しさん:2005/10/25(火) 16:38:14
>>371
もちろん開放もね。

構造体の代入をする際に * が必要になるというのが
今ひとつといえば今ひとつなところか。
構造体を戻り値にできないという欠点もあるが、
これは引数を通して受け渡したので問題ないだろう。
373デフォルトの名無しさん:2005/10/25(火) 18:07:32
すみません
Visual C++ .net 2003のMFCアプリケーションなんですが
エディタボックスに何も入力していない場合を
判断するにはどうすればよいのですか?
374デフォルトの名無しさん:2005/10/25(火) 18:36:06
>>373
あっはっはっ、>>1 見ろよこいつぅ( ´∀`)つ)Д゚)
375デフォルトの名無しさん:2005/10/25(火) 23:05:57
変数の宣言なのですが、
char buf[8]; などはよく見る光景です。
ですが例えば
char *buf = "012345";
char buf1[strlen(buf)];
とbuf1を宣言しますと"[ ]には定数式を指定してください"などとエラーが発生します。
このような宣言は、Cでは認められていないのでしょうか?
376デフォルトの名無しさん:2005/10/25(火) 23:07:52
C99ならOK。
それより前なら独自拡張してある処理系じゃないと駄目。
377デフォルトの名無しさん:2005/10/25(火) 23:11:41
>>375
その用途だけなら、char buf1[sizeof("012345") - 1];でいける。
378デフォルトの名無しさん:2005/10/25(火) 23:35:15
質問です。関数main()内で
int i;
int n;
short hex;
short char_to_hexstr(char c); /* ASCII文字を16進数2文字に変換 */
char *rindex(const char *s, int c); /* 末尾から文字列検索 */

こういう書き方があるのですが、これは何でしょうか?
関数プロトタイプをmainの中で宣言している ということなのでしょうか?
379デフォルトの名無しさん:2005/10/25(火) 23:38:09
そうみたい
380デフォルトの名無しさん:2005/10/25(火) 23:39:01
>>378
古いスタイル(K&R)に馴れた人がよくそう書くので要注意。
381デフォルトの名無しさん:2005/10/25(火) 23:40:21
>>380
参考になります。
382デフォルトの名無しさん:2005/10/25(火) 23:49:17
いつまで「C99なら〜」とかいい続けにゃならんのだろうな
もう6年も経つのに
383デフォルトの名無しさん:2005/10/25(火) 23:51:57
>>382
まだ基準がANSIだからな・・・・・・
384デフォルトの名無しさん:2005/10/25(火) 23:54:01
>>383
それを言うならC83では・・・
385デフォルトの名無しさん:2005/10/25(火) 23:56:00
普及する前に次の規格の策定始めるからなぁ。
どうにかならんのか。
386デフォルトの名無しさん:2005/10/26(水) 13:18:25
C99使えない環境って具体的に何があるか知ってる?
未だにgcc-2.95な古い環境と、組み込み系あたりがマズそう、というのは予想できるんだけど。
gccについては、こんなんがあった。
ttp://gcc.gnu.org/c99status.html
387デフォルトの名無しさん:2005/10/26(水) 13:22:15
VC、BCBなどWindowsの主要なコンパイラでC99は使えません
使えるようになる予定もございません
388デフォルトの名無しさん:2005/10/26(水) 13:32:57
Cは枯れているのが売りの一つなのにわざわざ新しい規格を作る意味がわからん
389デフォルトの名無しさん:2005/10/26(水) 17:10:53
Cの変数型についてです。
Cで認められるのはlong doubleの80bitなのですが、これよりも大きな値を扱いたい場合どのような
変数を宣言すればよいでしょうか

場合によってはwindows.hを含んでも構いませんので..
390デフォルトの名無しさん:2005/10/26(水) 17:15:53
>>389
多倍長整数でも作る
391デフォルトの名無しさん:2005/10/26(水) 17:21:13
>>389
認められない長さの変数を宣言する??
392デフォルトの名無しさん:2005/10/26(水) 17:47:33
>>389
整数ならまだ(unsigned )long long intがある。
(今のところ大抵の処理系では64bitになっている)
それでも足りなければ>>390
393デフォルトの名無しさん:2005/10/27(木) 00:08:46
質問です。

char 型の変数 a、b があり、b の下位2ビットだけを a にコピーしたいのですが
(上位6ビットの値は変更せず)、綺麗な方法が思いつきません。

a >> 2;
a << 2;
a |= (b & 0x3);

という方法をとっているのですが、
これだと、上から3,4ビット目だけをコピーなどといった場合、複雑になってしまいます。
スマートな方法はないでしょうか。
394デフォルトの名無しさん:2005/10/27(木) 00:14:07
a=(a & 0xfc)|(b & 0x3);綺麗じゃないな・・・
395デフォルトの名無しさん:2005/10/27(木) 00:15:53
>>393

a &= ~(0x3);
a |= b & 0x3;

unsigned bitSet(unsigned a, unsigned b, unsigned window)
{
return a & ~mask | b & window;
}
396393:2005/10/27(木) 00:18:30
>>394-395
あー、十分です! 
即レスありがとうございます。
397デフォルトの名無しさん:2005/10/27(木) 01:24:11
使っている処理系はBCC5.5で、変数型の互換についてです

double function()
{
int a=300,b=400;

return a+b;
}

と定義して。double c = function();、と受け取るのですがcには0が格納されます。
return の部分をreturn (double)a+b;としても結果は同じです。
ただし、aとbをdoubleで宣言した場合cには700と格納されます。
もしかして、doubleとintには互換性がないのでしょうか?
398デフォルトの名無しさん:2005/10/27(木) 01:27:47
少なくともちゃんとした C コンパイラならそんな変なことにならない。
BCC のバグかどうかに関しては知らん。
399デフォルトの名無しさん:2005/10/27(木) 01:34:43
どうやら変換指定子(%d %f etcetc)が間違えてた臭いです・・
%dと%fって互換がないんですね・・
400デフォルトの名無しさん:2005/10/27(木) 01:42:24
BCCだけど普通に700って入ったよ
401デフォルトの名無しさん:2005/10/27(木) 01:43:28
あ、先レスついてたか
402デフォルトの名無しさん:2005/10/27(木) 03:34:49
>>399
互換あるわけねーーーー!!!
403デフォルトの名無しさん:2005/10/27(木) 07:29:34
>>395
>return a & ~mask | b & window;
return a & (0xff-window) | b & window;
でもいいかな。と、ちょっと理解していないんだが。
404395:2005/10/27(木) 07:54:15
あーいけね、maskをwindowに書き換えるの忘れてた。

>>403
それだと、型が変わるたびに書き換えないといけなくなるので、マクロ化やC++のテンプレートに応用することを考えるとちょっと弱い。
405デフォルトの名無しさん:2005/10/27(木) 08:50:02
拡張頼みの処理系依存のコンパイラ任せ

union {
 char a;
 struct {
  unsigned int la : 2
  unsigned int ha : 2
 };
};
char b;

la = b;
406デフォルトの名無しさん:2005/10/27(木) 10:42:49
>>392
long long は「Cで認められ」ているだろうに
407デフォルトの名無しさん:2005/10/27(木) 12:20:22
C99は俺は認めない
408デフォルトの名無しさん:2005/10/27(木) 15:48:29
採用されない規格に価値はない
409default新規:2005/10/27(木) 18:25:54
すみません。。こんな課題なのですが出来ますでしょうか?
急に単元が進んで、結構ピンチです。。
性能比較というのは、どういうことなのでしょうか?
[1] 授業単元: 再帰と木
[2] 環境 Windows VC6.0
[3] 言語:C
[4] 期限: [2005年10月27日23:59提出期限なのですが、出来れば23時ぐらいまでに。。]
[5] その他の制限:標準ライブラリ使用可
★課題★プログラム10 と プログラム11 の性能比較を行え。
【例】
[user@mypc ~] ./a.out 35
f(35)= 9227465
[user@mypc ~] time ./a.out 35
f(35)= 9227465
1.330u 0.032s 0:02.43 55.9% 0+0k 0+0io 0pf+0w

★再帰呼出し版 (プログラム10)
int F(int i){
if (i < 1) return 0;
if (i == 1) return 1;
return F(i-1) + F(i-2);}

★トップダウン動的計画法(プログラム11)
int F(int i){
int t;
if (knownF[i] != unknown) return knownF[i];
if (i == 0) t = 0;
if (i == 1) t = 1;
if (i > 1) t = F(i-1) + F(i-2);
return knownF[i] = t; }
宜しくお願いします(M_M)
410デフォルトの名無しさん:2005/10/27(木) 18:26:15
>>409
宿題スレ
411デフォルトの名無しさん:2005/10/27(木) 18:43:39
>>409
マルチすんな糞が
412デフォルトの名無しさん:2005/10/27(木) 18:59:33
ただ単にTIME関数を入れれば、カウントできるんじゃないの?
413デフォルトの名無しさん:2005/10/27(木) 19:08:13
入力した文字列をポインタで指し示したいんですけどどうすればいいでしょうか?
ただ、スペースで区切ってひとつひとつを構造体(スタックの仕組みで)に入れていきたいんです。
簡単にでもいいので是非教えてください
414デフォルトの名無しさん:2005/10/27(木) 19:08:58
その顔文字が激しくうざい。
415413:2005/10/27(木) 19:12:57
例えば
「I am a student」と入力したら
「I」というポインタを指し示した構造体があり、
その構造体が次の構造体を指し示して「am」というポインタを指し示している。
というような流れのプログラムです。
416デフォルトの名無しさん:2005/10/27(木) 19:26:56
(M_M)←この顔に免じて教えてやってくれ。
417デフォルトの名無しさん:2005/10/27(木) 19:29:43
>「I」というポインタを指し示した構造体があり、
>その構造体が次の構造体を指し示して「am」というポインタを指し示している。

意味不明wwww
出直して来い
418デフォルトの名無しさん:2005/10/27(木) 19:33:53
本当は構造体ではないとか
419デフォルトの名無しさん:2005/10/27(木) 19:35:50
>>412
>TIME関数
>TIME関数
>TIME関数

そもそもスレ違いな質問に、それで答えたつもりか。
420デフォルトの名無しさん:2005/10/27(木) 20:22:27
>「I」というポインタを指し示した構造体があり、
>その構造体が次の構造体を指し示して「am」というポインタを指し示している。

struct list
{
list* next;
char* str;
};

list start;
start.str=calloc(strlen("I"),sizeof(char));
start.next=malloc(sizeof(list));
start.next.str=calloc(strlen("am"),sizeof(char));
start.next.next=malloc(sizeof(list));

...たぶんこういうのだろうけど、C言語やめてC++のSTL使え。
421デフォルトの名無しさん:2005/10/27(木) 20:29:44
テキストファイルの読み込みについての質問です
コメントは無視して数字だけ読み込むにはどうしたらいいのでしょうか?

#色々コメント
13,15
#コメント
1,1,1,1
1,1,1,1

な感じです
fscanf(fp, "%s %d,%d", str, &a, &b);
とやれば無理矢理読み込めますが
コメントが2行になったりサイズによっては読み込め無くなります
422デフォルトの名無しさん:2005/10/27(木) 20:31:21
ファイル操作するプログラムを作っているのですがプログラムを
コンパイルすると「fp1,fp2が未定義です」とFILE fp1,fp2の行を
指定してエラーが出るのですが(以下fp1,fp2を使っている所も同様)
なぜでしょうか?
423デフォルトの名無しさん:2005/10/27(木) 20:35:58
>>422
FILE *
424デフォルトの名無しさん:2005/10/27(木) 21:26:00
>>421
まずfgetsでとった後いろいろやればいい。
そのあとscanf使いたいんならsscanf
425デフォルトの名無しさん:2005/10/27(木) 21:37:17
すみません *が抜けてるのは書き間違いです。
426デフォルトの名無しさん:2005/10/27(木) 21:38:12
ソース晒せばいいじゃん
427デフォルトの名無しさん:2005/10/27(木) 21:54:34
#include<stdio.h>
#include<math.h>
main(){
double X,y,t,n,f,Ts;
double pi = 3.14159;
Ts = 1;
t = -5;
FILE *fp1,*fp2;

fp1 = fopen("X_f.txt","w");
if(fp1 == NULL)
{
printf("ファイルオープンできません\n");
return 1;
}
428デフォルトの名無しさん:2005/10/27(木) 21:55:58
if((fp2 = fopen("f.txt","w"))== NULL)
{
printf("ファイルオープンできません\n");
}
else{

for(f=-10;f<=10;f++){
f = f++;
fprintf(fp1,"%f\n",f);
429デフォルトの名無しさん:2005/10/27(木) 21:57:01
for(n=-10;n>=10;n=n+Ts){
if(t<-4){
y = 0;
}
else if(t>=-4&&t<=0){
y = t+4;
}
else if(t>=0&&t<=4){
y = -t+4;
}
else if(t>4){
y = 0;
}
X = y*cos(2*pi*n*Ts*f);
fprintf(fp2,"%d\n",X);
}
}
}
fclose(fp1);
fclose(fp2);

return 0;
}
以上です。
430デフォルトの名無しさん:2005/10/27(木) 22:00:05
Ts = 1;
t = -5;
FILE *fp1,*fp2;



FILE *fp1,*fp2;
Ts = 1;
t = -5;

にしてみ
431デフォルトの名無しさん:2005/10/27(木) 22:06:06
あ、ありがとうございます。いけました。

432デフォルトの名無しさん:2005/10/28(金) 06:25:14
Cで文字列の間に文字列をはさむにはどうすればいいかな
aaaaaaaccccc
      ↑
ここにbbbbをいれる感じ
433デフォルトの名無しさん:2005/10/28(金) 06:34:39
ずらして入れるか、新しく作る。
434デフォルトの名無しさん:2005/10/28(金) 07:16:27
「ずらして入れる」って、なんかえっち。
435デフォルトの名無しさん:2005/10/28(金) 07:18:46
書き込んだ後にすげ〜自分はエッチだと今頃気づいている>>434
436433:2005/10/28(金) 07:29:48
書き込む前からなんかえっちと思ってたがなー
437デフォルトの名無しさん:2005/10/28(金) 08:13:04
はさんで、だす。
438デフォルトの名無しさん:2005/10/28(金) 08:14:42
テキストファイルの先頭に読み込む個数が記入されていて
その数だけ読み込みたい場合はどうすればよろしいでしょうか?

#読み込む個数
10
#読み込むデータ
1,2,3,4,5,6,7,8,9,10
439デフォルトの名無しさん:2005/10/28(金) 08:25:44
>>438
個数読み込んで、forで回せばいいんじゃまいか?
440デフォルトの名無しさん:2005/10/28(金) 11:25:45
>>434
うむ。萌えるシチュエーションだな。大好きだ。

>>432
一時的なバッファを使うなら a、b、c の順にコピー。
使わないなら、c を memmove して (strcpy じゃダメ)
b をコピー。
441デフォルトの名無しさん:2005/10/28(金) 11:48:39
BYTE とか DWORD が既に型として定義されているかどうか、
ってのをチェックする事ってできるんでしょうか。
442デフォルトの名無しさん:2005/10/28(金) 12:16:59
>>441
コンパイルしてみて通ったら定義されている
443デフォルトの名無しさん:2005/10/28(金) 12:23:09
#ifndef BYTE
#define BYTE unsigned char
#endif
444デフォルトの名無しさん:2005/10/28(金) 12:40:26
>>441
プリプロセスの #if で判定したい・・・というのであれば、
基本的にはできない。
そもそもプリプロセスの段階では
typedef とかの意味解析はされないし。

ただ、typedef とは別に目印となるマクロが定義されていれば、
それが定義されてるかどうかでチェックすればいい。
BYTE や DWORD だったら _WINDEF_ でいいとは思うけど、
コンパイラのバージョンが上がった際に変更を受ける危険性はあるかもしれない。
一応 #if でコンパイラのバージョン制限をしといて、
バージョンが違ったら #error 吐くようにして、
_WINDEF_ で判定できるか確認するようなメッセージを書いとくといいと思う。
確認できたら、バージョン制限をいじる、と。

>>443
型として定義されているかどうかって言ってるだろうがよォォォォ!
なんでマクロになってるんだ?! このド低脳がァァァ!!!
445デフォルトの名無しさん:2005/10/28(金) 12:47:21
>>444
やっぱ普通には出来ないですか・・
特定の環境(VCとか)なら_WINDEF_等でもいけるんですけど、それはやっぱり機種ごとに書いてる
のと同じな気がするので。

ありがとうございました。
446デフォルトの名無しさん:2005/10/28(金) 13:01:59
そもそも何が目的で調べたいのかで対処方法が違うと思うのだが?
447デフォルトの名無しさん:2005/10/28(金) 14:30:01
コンパイラごとにマクロが違えば、
コンパイラごとにチェックするマクロを変えるしかないね。
これは正直言って、仕方がない。
448助けてください:2005/10/28(金) 14:39:59
 c言語で、ピタゴラスの三角形を表示するプログラムの作り方を教えてください。
For文を使います。IF文は不可です。
>>448
死ねばいいと思うよ
450デフォルトの名無しさん:2005/10/28(金) 14:50:18
そもそも標準でない環境依存の BYTE,DWORDを想定するのが、
環境依存な書き方にすぎないのだから、何をいまさら。
typedef 等のチェックは(マクロに限らないちゅうに)
configure(GNU autoconf)等みたく、サンプルのコンパイルの
成否を(半自動などで)確認せざるをえない、スレ違い。
451デフォルトの名無しさん:2005/10/28(金) 15:25:57
もう、面倒だから全部Javaで書き直せばいいじゃん。
UnixもアセンブラからCに書き直されたんだ、Javaでできんこともあるまい

とCスレで喧嘩を売ってみる
452デフォルトの名無しさん:2005/10/28(金) 16:06:04
Cとjavaじゃ喧嘩にならないくらいCのほうが優れているよ。
C#を引き合いに出せよ。

と喧嘩を買ってみる
453デフォルトの名無しさん:2005/10/28(金) 16:23:08
コンパイラ依存でコードが変わるのを気にするのなら、
自分でそれに相当するものを定義すればいい。
typedef unsigned char Byte;
typedef unsigned int DWord;
とか。
これが BYTE や DWORD と同じサイズになるように定義する。

まあ、これも short, int, long のサイズによって
定義を変えなきゃいけないという環境依存があるんだが・・・。
プリプロセスでは sizeof は使えないので、
UINT_MAX や CHAR_BIT などの値から
型のバイト数を割り出す必要がある。
454デフォルトの名無しさん:2005/10/28(金) 16:26:44
>>451
ダメだろそんなんじゃ

UnixだってC+アセンブラで書かれてるんだ、Java+JNIで良いじゃないか

と行かないと
455デフォルトの名無しさん:2005/10/28(金) 16:35:11
>>441
環境依存なコードを実装しながら途中で
環境に依存しないコードを作ろうと思い立ったというのが真相ではなかろうか。
456デフォルトの名無しさん:2005/10/28(金) 16:40:33
妄想でスレ伸ばさないように
457デフォルトの名無しさん:2005/10/28(金) 16:42:14
そこで<stdint.h>ですよ。
458デフォルトの名無しさん:2005/10/28(金) 17:00:41
C99 が使えればそれでいいんだけどねぇ・・・
459デフォルトの名無しさん:2005/10/28(金) 17:39:24
ファイルを"ab"モードで開くとします。
ファイル最後のオフセットを0xFFFFとします。

例えば0xFF01〜0xFF02を
0xFF01 DE
0xFF02 0F
から
0xFF01 FF
0xFF02 FF
に変更したい場合まず、fseekでFF01にシークを変更しますよね。
そこでfprintfでFFの値を二回書き込めば、0xFF01と0xFF02にはちゃんとFFFFが格納されます。
しかし困った事に追記なので、ファイル最後のオフセットが0x10001になってしまうのです。
(ファイルはただ書き込んだ分だけずれて、全体として容量が増えてしまう!!)

これを防ぐには全体を一度ずらすか、新しくファイルを作ってトレースするのでしょうか?
またはそのデータをファイルから削除するなどという方法があるのでしょうか?
460デフォルトの名無しさん:2005/10/28(金) 17:43:42
"r+b"
461デフォルトの名無しさん:2005/10/28(金) 17:44:07
yo ちぇけらっちょ
462改行出来ない人:2005/10/28(金) 19:53:03
viエディタを使ってます。
C言語で改行(半角\n)を入力して上書き保存をしようとすると
write error が発生して保存出来ません。
\n がないと上書き保存出来るので原因は\nだと思います。
viで改行を認識させるにはどうしたら良いのでしょう?
お願いします。
463デフォルトの名無しさん:2005/10/28(金) 20:09:18
>>462
×改行出来ない人
○頭がかわいそうな人
464デフォルトの名無しさん:2005/10/28(金) 20:15:10
>>459
スレ違い。初心者スレに行ってくれ。つーか、「シークを変更」ってなにさ。
>>462
鼬害。ソフト板に行ってくれ。つーか、何をしたくて何をしたんだか。
465デフォルトの名無しさん:2005/10/28(金) 21:56:49
何だお前
466デフォルトの名無しさん:2005/10/28(金) 22:45:49
>>462
vi使わなければいいんじゃない?
LINUXは詳しくないけど、viなんかよりずっと使いやすいエディッタは転がってるよ
467デフォルトの名無しさん:2005/10/28(金) 22:51:05
viはviスレ行け
UNIX板にある

>>466
冗談よしこちゃん
468デフォルトの名無しさん:2005/10/28(金) 22:56:25
そうだなVzが一番だ
469デフォルトの名無しさん:2005/10/28(金) 23:06:59
Emacs使ってるとカッコよさそう。
なんか、マウス使う機会がかなり減った気がする。
Cのインデントはちょっと気に入らないけど....
470デフォルトの名無しさん:2005/10/28(金) 23:08:30
Emacsのがviよりエディタっぽくて使いやすいからな
471デフォルトの名無しさん:2005/10/28(金) 23:19:15
質問です!
テキストのスクリプトファイルを読み込んで動作するプログラムを作っているのですが
"1+1*2"みたない文字列の答えを出すライブラリーとか無いですか?
472デフォルトの名無しさん:2005/10/28(金) 23:22:56
1+1*2の答えに満たない文字列?
473デフォルトの名無しさん:2005/10/28(金) 23:52:55
>>471
文字列は文字列であって、答えなどない
474デフォルトの名無しさん:2005/10/29(土) 00:00:34
>>471
自分で作ってみるのはどうですか?
475デフォルトの名無しさん:2005/10/29(土) 00:22:33
>>472-474
レスありがとうです
やはり自分で作るしかないみたいですね。
少し作ってみたけど結構面倒で”(”とかくるとヤバイ
476デフォルトの名無しさん:2005/10/29(土) 00:58:20
>>471
bcでできるけど。そうではなく?
477デフォルトの名無しさん:2005/10/29(土) 01:08:29
その系統でいくなら、perl や awk を使ってもイケる。

自作するなら、bison と flex を使うと幾分か楽かと。
全部自作してもいいけど。
478デフォルトの名無しさん:2005/10/29(土) 01:08:43
>476
ほー!
vcしか使った事ないので知らなかったです
bcではどうやるのですか?
bcでDLL作って呼び出してみようかとおもってます。
479デフォルトの名無しさん:2005/10/29(土) 01:11:11
>477
vcを使わないといけないので使えないです;;
480デフォルトの名無しさん:2005/10/29(土) 01:34:29
>>479
なんでvcだと使えないの?
つーかむしろbison+flexが妥当だろうね
481デフォルトの名無しさん:2005/10/29(土) 02:23:02
exprは?
482デフォルトの名無しさん:2005/10/29(土) 03:08:11
bc って、UNIX/GNU の、単純な計算を行うコマンドのことだよ。
483デフォルトの名無しさん:2005/10/29(土) 03:13:41
インタプリタやコンパイラの作り方を書いた本なりHPなり探したら?
484デフォルトの名無しさん:2005/10/29(土) 03:23:52
本はともかくHPってある?
485デフォルトの名無しさん:2005/10/29(土) 03:31:16
この板を「コンパイラ」で検索。
最近は全然読んでないから、どんな議論が行われているか知らないが。
そこそこリンクも見つかるだろ、たぶん。
486デフォルトの名無しさん:2005/10/29(土) 04:19:25
>>485
ここのことかな。
「コンパイラ・スクリプトエンジン」相談室7
http://pc8.2ch.net/test/read.cgi/tech/1129287390/

>>484
↑の>>2-10に大量にリンク張ってあるからそこそこ見つかると思われ。
487デフォルトの名無しさん:2005/10/29(土) 04:24:29
慣れてきたら、別に bison+flex なしでもほいほいっと作れるようになる。
四則演算+カッコ程度なら、簡単に作れる。
488デフォルトの名無しさん:2005/10/29(土) 04:43:20
>>486
>>485を書き込んだ後、
このスレへのリンクを張るというボケをちょっとだけ期待したのは内緒
http://pc8.2ch.net/test/read.cgi/tech/1111363360/
489デフォルトの名無しさん:2005/10/29(土) 04:53:00
>>488
ワロスwそこのスレ時々のぞくとオモロイ
490デフォルトの名無しさん:2005/10/29(土) 10:39:45
C言語のソースがごろごろ転がってるページはありませんか
491デフォルトの名無しさん:2005/10/29(土) 10:41:53
492デフォルトの名無しさん:2005/10/29(土) 10:43:58
>>490
面倒だからといい加減な説明で質問すると
いい加減な答えしか返ってこないぞ。
493デフォルトの名無しさん:2005/10/29(土) 12:14:06
494デフォルトの名無しさん:2005/10/29(土) 12:25:30
>>493
すげぇ、ありがおつごじます
495デフォルトの名無しさん:2005/10/29(土) 16:03:54
>>494
すげぇタイポだなwwwwwwwww
496デフォルトの名無しさん:2005/10/29(土) 21:43:50
以下のような記述はK&R形式というのでしょうか?
(動きませんけど)

func(path)
char *path;
{
int fd;
 char *a;
return (-1);
}
497デフォルトの名無しさん:2005/10/29(土) 21:50:45
>>496
そうだな。
pathの宣言の仕方が一番の特徴。
あとreturnに括弧をつけるのも今では廃れた。
498デフォルトの名無しさん:2005/10/29(土) 21:56:03
>> 497 ありがとうございます。
ANSI 対応のコンパイラだとエラーや警告ができません。
それは、正しく解釈していると考えてよいでしょうか。
499デフォルトの名無しさん:2005/10/29(土) 21:57:47
>>496
初期のCからいわゆるANSI−Cへの過度的なスタイルだね
500デフォルトの名無しさん:2005/10/29(土) 22:34:52
>>498
一応ANSI CでもK&Rスタイルは認められている。
ただし非推奨で将来的には規格から削除すると書かれている。
501デフォルトの名無しさん:2005/10/29(土) 22:41:56
>> 499 500 ありがとうござます。
なるほど、とりあえずOKだが、おすすめできない
スタイルということですね。
502デフォルトの名無しさん:2005/10/29(土) 22:44:26
>> 499 500
このスタイルもおすすめできない
503デフォルトの名無しさん:2005/10/29(土) 22:59:59
すいません。
char *command_name;

main(int argc, char *argv[])
{
if((command_name = rindex(argv[0],'/')) != NULL)/*コマンド名の獲得*/
command_name++;
else
command_name = argv[0];
//
504デフォルトの名無しさん:2005/10/29(土) 23:07:33
プログラムのわからない部分の抜粋なのですが、ここの'/'とcommand_name++ の部分について教えて下さい。

実行ファイル名は、ctohexです
$ ./ctohex
505デフォルトの名無しさん:2005/10/29(土) 23:10:54
>>504
command_nameのポインタで指している場所を1進めている。
506デフォルトの名無しさん:2005/10/29(土) 23:11:18
>>503
後者はポインタを進めて次の文字を参照
前者は文字「/」、rindexなんてBSDのみの関数しらねーよ
507デフォルトの名無しさん:2005/10/29(土) 23:12:57
>>504
'/' はスラッシュの文字コードを表す int 型の定数(おそらく 47)
command_name++ は外部変数の値を1だけ増加させる
508デフォルトの名無しさん:2005/10/29(土) 23:17:12
>>496
ああ、そういうのもK&Rスタイルというのか
「インデントの仕方に何でコンパイラが文句を付けるんだ?」と一瞬悩んでしまた
ちなみに規格の用語ではそういうのは「プロトタイプスタイルでない定義」といいまつ
509デフォルトの名無しさん:2005/10/29(土) 23:23:21
>>508
よろしければ、どういうのが K&R スタイルとお考えかお聞かせ願えませんか
510デフォルトの名無しさん:2005/10/29(土) 23:25:31
>>509
K&Rで書かれてる奴だろ
511デフォルトの名無しさん:2005/10/29(土) 23:31:12
>>510
K&Rに掲載されているコードのクローン?
512503.504:2005/10/29(土) 23:34:33
>>505-507
有り難うございます。command_nameに ctohexの c のアドレスが、
もしくは 配列argv[0] のアドレス (.のアドレス) が代入されるのですね。
513デフォルトの名無しさん:2005/10/29(土) 23:35:41
>>509
"K&Rスタイル"でぐぐって1番上に来るやつ
if (...) {
のように、{ の前で改行しない書き方
514デフォルトの名無しさん:2005/10/29(土) 23:38:46
いきなり (void) かよ
なまおのノリだなw
515デフォルトの名無しさん:2005/10/29(土) 23:45:48
俺は関数はAllman、他のifやforとかはK&Rだな
516503.504:2005/10/29(土) 23:52:07
文字^^; w
517デフォルトの名無しさん:2005/10/29(土) 23:52:29
関数でautoクラスのポインターを返すのは禁止されてるんでしょうか?
518デフォルトの名無しさん:2005/10/29(土) 23:58:24
>>517
べつにいいけど、期待した動きかどうかは…
519デフォルトの名無しさん:2005/10/29(土) 23:59:50
>>517
コンパイルがエラーにならないかどうかと言うだけなら>>518
520デフォルトの名無しさん:2005/10/30(日) 00:04:20
>>517
ポインタ変数自体がautoって意味なら別にそれ自体は問題ではないよ。
521デフォルトの名無しさん:2005/10/30(日) 00:04:50
>>517
質問が曖昧だが
1.autoオブジェクトを指すポインタを返す
2.autoクラスのポインタオブジェクト(が格納している値)を返す
どっち?

1なら>>518
2ならそれ自体は別に問題ない
522デフォルトの名無しさん:2005/10/30(日) 00:15:31
>>517-521
すいません、質問の仕方が悪かったです。
以下の違いがわかりません。

char *test(void){
char buffer[]="test";
return buffer;
}

int main(void){
printf("%s",test());
return 0;
}

では警告が出るのですが、

char test(void){
char buffer=1;
return buffer;
}

int main(void){
printf("%d",test());
return 0;
}

だと警告はでません。
コンパイラはBCCで、警告の内容は
警告 W8075 test62.c 6: 問題のあるポインタの変換(関数 test )
です。
523デフォルトの名無しさん:2005/10/30(日) 00:18:02
           ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ <こいつら最高にアホ
 彡、   |∪|  /
/ __  ヽノ /
(___ ̄\ /
    (_ノノノ│
       ∪
524デフォルトの名無しさん:2005/10/30(日) 00:21:03
そりゃ局所変数へのポインタ返そうとすりゃエラーも出るよな
525デフォルトの名無しさん:2005/10/30(日) 00:21:31
pthreadをC++(UNIX系)で使ってるんですが、

void func(MyClass *myclass)

pthread_t t[10];
int res,i;
MyClass myclass[10];
for(i=0;i<10;i++)
res = pthread_create(&t[i],NULL,(void *)func,&myclass[i]);

とするとエラーがでてコンパイルが通りません。

何がいけないのか教えてくれませんか?
526デフォルトの名無しさん:2005/10/30(日) 00:23:00
C++なら俺に聞け
527デフォルトの名無しさん:2005/10/30(日) 00:23:23
>>522
bufferはtestから抜けるときに消滅する。
前者ではこれから消滅するものへのポインタを返すのがまずい。
後者はこれから消滅するものだけどその中身(のコピー)を返しているから問題ない。

ちなみにこれは平気。文字列自体はプログラムの実行している間ずっと存在するので、そこへのポインタを扱っても問題ない。
const char *test(void) {
  const char *str = "test";
  return test;
}
(char buffer[]="test";ではtest関数ローカルの変数bufferを"test"で毎回作り出していることになるので、
testの呼び出し毎にbufferは作られてなくなる)
528デフォルトの名無しさん:2005/10/30(日) 00:23:50
>>525
環境依存スレ行ってこい
そもそもここはC
529デフォルトの名無しさん:2005/10/30(日) 00:49:06
>>527
書いていただいたソースで理解できました。bufferは配列の先頭要素を指すポインタなので、
配列へのポインタを返しても、呼び出し側に戻ったときすでに配列は消えていて、配列に入っていた値を参照できない。
ってことなんですね。
難しいっす。
530デフォルトの名無しさん:2005/10/30(日) 09:40:00
>>529
そういうことだ。
531デフォルトの名無しさん:2005/10/30(日) 17:50:37
どのくらいあるかわからない入力を全部取得する方法を教えて下さい。
いま↓みたいににやってます。
#include <stdio.h>
#include <stdlib.h>
int getbuf(char** buffer) {
#define BUF_SIZE 1024
 int ch, idx, len = BUF_SIZE;
 char* buf = (char*)malloc(len);
 for (idx = 0; (ch = getchar()) != EOF; buf[idx++] = ch) {
  if (idx >= len) {
   char* tmp = (char*)malloc(len + BUF_SIZE);
   for (idx = 0; idx < len; ++idx) { tmp[idx] = buf[idx]; }
   free(buf); buf = tmp; len += BUF_SIZE;
  }
 }
 buf[idx] = '\0'; *buffer = buf; return idx;
}
532デフォルトの名無しさん:2005/10/30(日) 17:56:33
>>531
realloc
533デフォルトの名無しさん:2005/10/30(日) 17:56:59
>>531
とりあえず、realloc
534533:2005/10/30(日) 17:58:09
かぶった orz
535531:2005/10/30(日) 18:09:05
ありがとうございます。realloc便利ですね。
536デフォルトの名無しさん:2005/10/30(日) 19:20:18
reallocって良いでしょう?ところで
またまた、関数ポインタで不思議な状況に
遭遇しました。関数ポインタの引数は
どうなっているんでしょうかねぇ?

#include <stdio.h>

void boyaki(void){
printf("なんでロッテなんやぁ?\n");
}
void monku(int n){
int i;
for(i=n;i--;printf("なんでやタイガーズ!\n"));
}
537デフォルトの名無しさん:2005/10/30(日) 19:20:52
int main (void){

void (*okasi_yanaika)();//引数無し関数ポインタ
void (*okasiiAry[1])();//引数無し関数ポインタ配列

void (*nandomo_ittarei)(int);//int引数関数ポインタ
void (*ittareAry[1])(int);//int引数関数ポインタ配列

okasi_yanaika=boyaki;
okasi_yanaika();
okasiiAry[0]=boyaki;
okasiiAry[0]();

nandomo_ittarei=monku;
nandomo_ittarei(3);
ittareAry[0]=monku;
ittareAry[0](5);

//ここまでは当然ですが、次の例は不思議ですよね?
//動いてますけど…
printf("なんで引数の無い関数が引数とれるんじゃぁ!\n");
okasi_yanaika=monku;
okasi_yanaika(5);
okasiiAry[0]=monku;
okasiiAry[0](10);

return 0;
}
538デフォルトの名無しさん:2005/10/30(日) 19:43:13
>>536
言っている意味がわからんが?
そもそもVCではコンパイルすら通らない。
539デフォルトの名無しさん:2005/10/30(日) 19:48:35
>>537
void (*okasi_yanaika)(void);//引数無し関数ポインタ
void (*okasiiAry[1])(void);//引数無し関数ポインタ配列
540デフォルトの名無しさん:2005/10/30(日) 20:27:34
>538
当方VC++エンプラ版だけど・・・
余程安物のVC++じゃないの?
それとも:
reallocって良いでしょう?ところで
またまた、関数ポインタで不思議な状況に
遭遇しました。関数ポインタの引数は
どうなっているんでしょうかねぇ?

これも一緒にコンパイルしたのかなぁ?
541デフォルトの名無しさん:2005/10/30(日) 20:37:13
そういう知識自慢は他のところでやってくんない?
542デフォルトの名無しさん:2005/10/30(日) 20:41:34
>>540
536+537のソースはVCではコンパイルとおりません。安物とかそういう問題ではないんだが。
キティちゃんですか?

G:\開発\test\test.cpp(32) : error C2440: '=' : 'void (__cdecl *)(int)' から 'void (__cdecl *)(void)' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
G:\開発\test\test.cpp(33) : error C2197: 'void (__cdecl *)(void)' : 実引数が多すぎます。
G:\開発\test\test.cpp(34) : error C2440: '=' : 'void (__cdecl *)(int)' から 'void (__cdecl *)(void)' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
G:\開発\test\test.cpp(35) : error C2197: 'void (__cdecl *)(void)' : 実引数が多すぎます。
543デフォルトの名無しさん:2005/10/30(日) 20:42:00
>541
でも不思議だと思わん?
544デフォルトの名無しさん:2005/10/30(日) 20:45:42
>>543
某スレと良い、君も好きだねぇ
啓蒙活動w
545デフォルトの名無しさん:2005/10/30(日) 20:48:11
こんな事ができても不思議だと思わん。
char c;
int *p = (int*)&c;
*p = 0x123456;
546デフォルトの名無しさん:2005/10/30(日) 20:48:58
>542
おいおい!ホントかよぉ。こちらは
実行結果:
なんでロッテなんやぁ?
なんでロッテなんやぁ?
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんで引数の無い関数が引数とれるんじゃぁ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
なんでやタイガーズ!
Press any key to continue
こうなってんだけどぉ。誰か他のもっとましなコンパイラもってる人!
やってみてくれないかなぁ?
547デフォルトの名無しさん:2005/10/30(日) 20:49:37
せめてこっちでやれ
VIPPERでもわかる C言語プログラミング
http://pc8.2ch.net/test/read.cgi/tech/1129913775/
548デフォルトの名無しさん:2005/10/30(日) 20:52:16
ワラタw住民かぶってるやん
549デフォルトの名無しさん:2005/10/30(日) 20:52:20
>545
charは根がintじゃけん。それは当たり前です。
550デフォルトの名無しさん:2005/10/30(日) 20:54:21
>>542
このスレが何のスレだか判っていますか?
或いは、あなたは自分が何をしているのか判っていますか?
551デフォルトの名無しさん:2005/10/30(日) 20:55:30
つまり聞く耳もたない基地外って事か。もう気が済むまで好きなだけ荒らしてください。
552デフォルトの名無しさん:2005/10/30(日) 20:55:49
キタコレ
553デフォルトの名無しさん:2005/10/30(日) 20:56:51
基地外認定早いなぁ 想定の範囲外ってやつですか
554デフォルトの名無しさん:2005/10/30(日) 21:03:08
>551
void(*f)(); のような関数ポインタと配列が 
引数を取ってかつ、それをちゃんと計算するってぇ、話題が
このスレでは荒らしになるのでしょうか?
555デフォルトの名無しさん:2005/10/30(日) 21:05:33
え?なんで質問スレに来てんのw?
556デフォルトの名無しさん:2005/10/30(日) 21:06:41
ええかげんにしろ啓蒙クン
557デフォルトの名無しさん:2005/10/30(日) 21:10:35
ロリコン男のストーカー脅迫事件
浅倉大介(当時30)は98年に進学校の女子高生(17)に一目惚れして一方的に「婚約している」
と吹聴し車で相手の学校まで乗りつけ高校で職員会議沙汰になる程の迷惑行為をした。
相手の女性は将来が決まる重要な時期(理系の学部に進学したかったようです)に
ストーカーをされて「歌手になれ結婚してくれ」と浅倉に何の興味もないのに押し付けられて
ノイローゼ気味になっていた。さらに当時浅倉はプロデュースしているアーティストTMRevolutionが
売れており人気があったため事務所の用意周到な隠蔽工作と相乗して周りの人間にすら状況
を理解されず、歌手になると勘違いされプライバシーを根掘り葉掘り探られ誹謗中傷もされて
精神的にズタズタになって学校内で何度も倒れ、卒業後は逃げるように地方に引っ越して行った。
ちなみに浅倉は彼女の事をマスコミには一方的に婚約者として公表している。

浅倉は未だに相手の女性に対して人生を狂わせた事について何の謝罪もせずに結婚して
出産しろとヤクザを使い性的に辱めて脅迫をしている。
それに事務所が倒産したら盗撮画像をばら撒くぞとも脅してもいる。
示談の話は進んでいるが悪質極まりない対応をしている為、世間の方に知っていただき
少しでも彼女が安全な状態になれば思い私共は書き込みました。
最悪の場合彼女が殺害されても身元不明の死体が見つかり通報があれば警察が動きますので。

浅倉大介がパーソナリティーをしているラジオFM79.5に元浅倉ファンのLEMON(過去に
HPを持ち浅倉のラジオの書き起こしを載せていた)の父親が勤務しておりこの事件について
詳しく知っている。
詳細http://jbbs.livedoor.jp/bbs/read.cgi/computer/1872/1092320889/919-926
http://music5.2ch.net/test/read.cgi/musicjg/1126700852/778-922
558デフォルトの名無しさん:2005/10/30(日) 21:20:18
>>542
そりゃC++(ry

>>546
あー、あるファイルで void func(void) を実装していながら
別ファイルで void func(int) とプロトタイプをうたって呼び出せるのと
あんまりかわらないような。
559550:2005/10/30(日) 21:59:38
>>558
もしかして:「騙って(かたって)」

うたってどうしますか(苦笑)。
560デフォルトの名無しさん:2005/10/30(日) 22:03:49
>>559
謳うという意味で書いたんだけど、そう解釈されても差し支えないですね
561デフォルトの名無しさん:2005/10/30(日) 22:07:48
>>559
ちょっと前のgoogle並みだなw
562デフォルトの名無しさん:2005/10/30(日) 22:07:51
うわこれは酷いな
563デフォルトの名無しさん:2005/10/30(日) 22:17:27
酷い→謳い
564デフォルトの名無しさん:2005/10/30(日) 22:46:25
引数が無いんじゃなくて、引数が無視されるから
565デフォルトの名無しさん:2005/10/30(日) 23:20:35
>>564
ワカランちゃんにはそれがわからんのです。
566デフォルトの名無しさん:2005/10/30(日) 23:22:19
>>563
別に変だとは思わないが
567デフォルトの名無しさん:2005/10/30(日) 23:29:07
わからんちゃんをわからんちゃんというあるいみわからんちゃん
568デフォルトの名無しさん:2005/10/30(日) 23:37:08
わからんちゃんってカワイイなw
569デフォルトの名無しさん:2005/10/31(月) 02:05:48
realloc を同じサイズで呼んだ場合は、既存のメモリー領域が使い回しされるんでしょうか?
570デフォルトの名無しさん:2005/10/31(月) 02:07:29
そんな保証はないがそういう実装もあるかもな。
サイズ増減した場合でも同じ領域が使われる事もあるかもしれないし。
571デフォルトの名無しさん:2005/10/31(月) 02:13:17
VCはほぼ何もしない(同じアドレスを返す)ように
なってるみたいだ。C言語的な仕様ではないと思うけど。
572デフォルトの名無しさん:2005/10/31(月) 02:23:25
"static 変数型 変数名"で宣言された変数と、
"変数型 変数名"で宣言された変数はどう扱いが違うのか、イマイチ解りません。
わかりやすく解説が載っている参考サイトなど無いでしょうか
573デフォルトの名無しさん:2005/10/31(月) 02:25:14
int count1()
{
 int counter = 0;
 return counter++;
}

int count2()
{
 static int counter = 0;
 return counter++;
}
これをそれぞれ300回呼んで戻り値チェックしてみろ
574デフォルトの名無しさん:2005/10/31(月) 02:25:18
空間限定のグローバル変数みたいなもん
575デフォルトの名無しさん:2005/10/31(月) 02:37:11
>>572
適当に書いてみるテスト

同じstaticでも関数の中で宣言した変数につけたのと
関数の外で宣言した変数につけたのでは全く意味が違います
(C++だとクラスの中で宣言した変数につけたのもまた意味が違う)

関数内のstatic変数

普通のローカル変数は関数からリターンすると変数の内容は失われますが、
static変数の場合は関数からリターンしてもその内容が保持されます。

int test()
{
  static int a = 0;/*ここのstaticをつけたりはずしたりして繰り返し呼んでみよう*/
  a++;
  return a;
}

関数外のstatic変数

通常グローバル変数は、リンクされるすべてのソースからアクセスすることができますが、
staticをつけると、変数のスコープ(その変数にアクセスできる範囲)がソースファイル内に限定されます。

576デフォルトの名無しさん:2005/10/31(月) 02:54:22
>>572,>>573,>>574
はぁ、なるほど
解りやすい解説とソースコードをありがとうございます。
577575:2005/10/31(月) 03:24:38
しくしくしくしくしく・・・orz
578デフォルトの名無しさん:2005/10/31(月) 04:00:38
泣くな、たぶんミスっただけだw
579デフォルトの名無しさん:2005/10/31(月) 04:39:43
質問なんですけどputc()の第一引数はなぜchar型ではなくint型なんでしょうか?
580デフォルトの名無しさん:2005/10/31(月) 04:48:59
>>579
文字定数('で囲んだ文字のこと、'A'とか)の型がintだからだと思う
581デフォルトの名無しさん:2005/10/31(月) 07:46:20
それだけじゃないけどね。

ヒント:暗黙のプロモーション、プロトタイプ宣言の省略
582デフォルトの名無しさん:2005/10/31(月) 08:51:40
ソース
583デフォルトの名無しさん:2005/10/31(月) 09:46:03
C89 の標準関数では、

・int
・double
・ポインタ

しか使われないようになっている。
584デフォルトの名無しさん:2005/10/31(月) 09:58:06
・long
・typedef 型
・構造体

もあるな。
でも、char はない。
585デフォルトの名無しさん:2005/10/31(月) 12:45:15
関数ポインタ配列を順次実行しようとしています

void (*fl2[])() = {
 func1,
 func2,
 func3,
 NULL,
};

void (*pFList2)() = *fl2;
for (; *pFList2; pFList2++) {
 (*pFList2)();
}

どうも終端判断とインクリメントするコンパイルエラーが取れません(for文の所)
何か妙案は無いでしょうか
586デフォルトの名無しさん:2005/10/31(月) 12:47:29
関数ポインタをtypedef汁
587デフォルトの名無しさん:2005/10/31(月) 12:54:27
質問です。
atexitに失敗した場合、それ以前にatexitしてあった関数は終了時に実行されますか?
588デフォルトの名無しさん:2005/10/31(月) 13:18:38
>>585
void (**pFList2)() = fl2;
for (; *pFList2; pFList2++) {
 (*pFList2)();
}
589デフォルトの名無しさん:2005/10/31(月) 14:01:08
>>588
激しくサンクス!
590デフォルトの名無しさん:2005/10/31(月) 14:36:08
>>589
>>588 でできるけど、typedef した方が分かりやすい。
591デフォルトの名無しさん:2005/10/31(月) 17:24:54
>>590
どんなふうにtypedefすればいい?
592デフォルトの名無しさん:2005/10/31(月) 17:34:41
typedef void (*fphoge)();

fphoge fl2[] = { ... };

fphoge* pFList2 = fl2;
593デフォルトの名無しさん:2005/10/31(月) 20:24:57
>>585
これのclassメンバ関数版にトライしてみたが挫折・・・
594デフォルトの名無しさん:2005/10/31(月) 20:25:55
木構造で、以下のようにして内容物を検索したいのですけれど、

Node *SearchTreeItem(Node *pRoot, char exp[])
{
Node *node;
if(node == NULL)
return NULL;
node = SearchTreeItem(pRoot->Left, exp);
if(node != NULL)
return node;
if(strcmp(node->Expression, exp) == 0)
return node;
node = SearchTreeItem(pRoot->Right, exp);
return node;
}

エラーが出て途中でストップしてしまいました。
なので、
595デフォルトの名無しさん:2005/10/31(月) 20:27:12
内容物を表示するだけに自粛し、以下のように書き直し再度試したところ、
Node *SearchTreeItem(Node *pRoot, char exp[])
{
if ( !pRoot )
return NULL;
if ( pRoot->Left )
SearchTreeItem( pRoot->Left, exp );
printf("%s\n",exp);
if ( pRoot->Right )
SearchTreeItem( pRoot->Right, exp );
return NULL;
}

やはり途中で止まってしまいました。
どの辺りがおかしいでしょうか?

よろしくお願いします。
596デフォルトの名無しさん:2005/10/31(月) 20:29:54
ステップ実行できるデバッガ使えと
597デフォルトの名無しさん:2005/10/31(月) 20:41:13
デバッガ使えないなら
どこまで実行できてるかprintfしてみる程度の
頭を使って欲しいものだ
598デフォルトの名無しさん:2005/10/31(月) 21:09:41
>>593
void (ClassName::*fl2[])() = {
 &ClassName::func1, ...
};
599デフォルトの名無しさん:2005/10/31(月) 21:49:37
>>594
Node *SearchTreeItem(Node *pRoot, char exp[])
{
 Node *node;
 if (pRoot == NULL)
  return NULL;
 node = SearchTreeItem(pRoot->Left, exp);
 if (node != NULL)
  return node;
 if (strcmp(pRoot->Expression, exp) == 0)
  return pRoot;
 return SearchTreeItem(pRoot->Right, exp);
}
void PrintTreeItem(Node *pRoot)
{
 if (pRoot == NULL)
  return;
 PrintTreeItem(pRoot->Left);
 puts(pRoot->Expression);
 PrintTreeItem(pRoot->Right);
}
600デフォルトの名無しさん:2005/10/31(月) 22:58:48
>>598
感動した!
601デフォルトの名無しさん:2005/10/31(月) 23:21:51
>>590
たかが ** くらいで typedef が必要なアフォハケーン
602デフォルトの名無しさん:2005/10/31(月) 23:22:36
>>593
C++ スレで聞いてみ
瞬殺で回答くるよ
603デフォルトの名無しさん:2005/10/31(月) 23:25:03
604デフォルトの名無しさん:2005/10/31(月) 23:28:59
>>601
問題の位置が分かってないアフォだな。
関数ポインタを typedef しないやつはオナニープログラマだという話だ。
605デフォルトの名無しさん:2005/10/31(月) 23:35:57
>>604
自分がわからないからってな個人的事情を知らん奴に押しつけることこそ「問題の位置」だよ
606デフォルトの名無しさん:2005/10/31(月) 23:39:53
まぁ自分一人でシコシコプログラム作る分にはどうでもいいけど
会社のプロジェクトでプログラム作るときは他人が読むことを考えて可読性を上げた方がええわな。
607デフォルトの名無しさん:2005/10/31(月) 23:40:52
>>606
だから俺ルールを可読性って言うなよ
608デフォルトの名無しさん:2005/10/31(月) 23:41:38
コーディング基準で typedef しろと言われている場合と
あんた個人の金切り声は
内容が同じでも意味が全く違うんだよ
609デフォルトの名無しさん:2005/10/31(月) 23:44:39
質問者がtypedefしてないなら特に口出すことでもないいな。
610デフォルトの名無しさん:2005/10/31(月) 23:55:17
そううだね。
611デフォルトの名無しさん:2005/11/01(火) 00:00:50
関数ポインタ型は typedef って常識だろ?
可読性の問題もあるけど、戻り値や引数の型を変えたい時に困るだろ?
612デフォルトの名無しさん:2005/11/01(火) 00:07:19
>>611
「常識」の理由がころころ変わるなよ・・・
まあいい、それで何個の関数の戻り値や引数の型を変えたくなったんだ?
613デフォルトの名無しさん:2005/11/01(火) 00:12:40
なんだかなーって奴が板に住み着いたのかな。
他のスレでも全然sageてないし。
614デフォルトの名無しさん:2005/11/01(火) 00:13:07
ストーカーきもい
615デフォルトの名無しさん:2005/11/01(火) 00:27:38
フリーでお勧めソフトありませんか?
独学ではじめてみようと思うんですが・・・・
616デフォルトの名無しさん:2005/11/01(火) 00:30:45
Cygwin+gcc
617デフォルトの名無しさん:2005/11/01(火) 00:31:02
>>615
過去ログサイトのテンプレ
618デフォルトの名無しさん:2005/11/01(火) 00:33:42
>>615
1つじゃ騙されるから複数ちゃんぽん
619デフォルトの名無しさん:2005/11/01(火) 00:37:01
ありがとうございます。
サイトまわってStarEditなるものを見つけてきますた
620デフォルトの名無しさん:2005/11/01(火) 00:45:17
ここでワープロコピペ
621デフォルトの名無しさん:2005/11/01(火) 00:46:14
>>611
戻り値や引数の型でタイプミスの可能性が増えるからだろ?
622デフォルトの名無しさん:2005/11/01(火) 01:02:14
>>621
コンパイル通らんだろ
623デフォルトの名無しさん:2005/11/01(火) 01:02:40
打ち間違いをする可能性を減らす って意味だろ
624デフォルトの名無しさん:2005/11/01(火) 01:02:58
625デフォルトの名無しさん:2005/11/01(火) 01:09:40
そもそもコンパイルエラーになることを防止するんじゃないの?
626デフォルトの名無しさん:2005/11/01(火) 01:11:09
( ゚д゚)ハァ?
627デフォルトの名無しさん:2005/11/01(火) 01:11:47
>>625
どういうことだ?
628デフォルトの名無しさん:2005/11/01(火) 01:13:20
( ;゚д゚)ヒィィィィィィ
629デフォルトの名無しさん:2005/11/01(火) 01:38:47
ふへほ
630デフォルトの名無しさん:2005/11/01(火) 01:42:46
何度も同じの書くのメドイ。
引数ないならいいけど、引数が4個くらいあるとイヤになる。
631デフォルトの名無しさん:2005/11/01(火) 01:51:25
typedef void afo(int, int, int, int);
afo* voke;
afo sine {} //ill-formed
632デフォルトの名無しさん:2005/11/01(火) 01:56:03
すみません。どなたか>>587はわかりませんか?
633デフォルトの名無しさん:2005/11/01(火) 01:56:28
>>632
実際にやってみりゃええやん。
634デフォルトの名無しさん:2005/11/01(火) 01:59:13
C言語でCGIを作りたいのですがコンパイル方法がわかりません。
開発環境はVS2003です。よろしくお願いします
635デフォルトの名無しさん:2005/11/01(火) 02:07:40
>>634
VC コンパイル で検索してみたの?
636デフォルトの名無しさん:2005/11/01(火) 02:16:24
そのCGIの実行環境が非Windowsのレン鯖な悪寒
637デフォルトの名無しさん:2005/11/01(火) 02:40:02
>>633
atexitを失敗させる方法が思いつきません。どうしたらいいですか?
638デフォルトの名無しさん:2005/11/01(火) 02:46:04
失敗するまで登録し続ける
639587:2005/11/01(火) 08:47:01
>>638
なるほど!そんな手があったんですね!・・・と思ってgccで以下のコードを試しました。
#include <stdlib.h>
#include <stdio.h>
void func(void) { static int n = 0; printf("%d ", ++ n); }
int main() {
  int i;
  for (i = 0; ; i ++) {
    if (atexit(func) != 0) {
      printf("atexit failure (i = %d)\n", i); break;
    }
  }
  return 0;
}
atexitが失敗する前にコンピュータがフリーズしてしまい、結果がわかりません。orz
普段フリーズすることなんてないのですが、上のコードを実行したらフリーズ後にコンピュータ本体のどこかから変な警告音まででました。

ちなみにBCCだとたったの32回しか登録できなかったのですが、atexit失敗後にきちんと全部の関数が呼ばれました。
これはどう解釈すべきでしょうか?
(というか、できれば標準でどのように規定されているかが知りたいのです・・・)
640デフォルトの名無しさん:2005/11/01(火) 08:53:03
atexitなんてそんなんにガシガシ登録するもんでもないだろ
641デフォルトの名無しさん:2005/11/01(火) 08:58:59
>>640
atexitが失敗したときの処理をどう書けばよいのかに困っているのです。
もしatexitの失敗により、それ以前に登録していた関数が呼び出されないことがあるなら、atexitを使わない方向で考えなければならないかもしれません。
もしくは、atexitが失敗することはありえないと考えて、失敗時の処理は書かない、というのも(移植性を求めたい場合でも)あり得る選択肢ですか?
642デフォルトの名無しさん:2005/11/01(火) 09:04:28
失敗したら即終了。またはエラーログ吐きつつ続行。
643デフォルトの名無しさん:2005/11/01(火) 09:29:43
>>642
失敗したら即終了ということは、メモリの開放をatexitに任せるのは良くないと考えるべきですか?
それともfprintf(stderr or log, "メモリリークしたかもしれません")などで諦めるべきでしょうか?

実際悩みどころはatexitそのものよりも、atexitに登録しておいた関数たちが心配なんです。
だから、できることなら登録済み関数がどう扱われるかに関する標準での規定(もしくは未定義?)の情報があると助かります。
644デフォルトの名無しさん:2005/11/01(火) 09:37:09
>>634
プロバイダに聞け
645デフォルトの名無しさん:2005/11/01(火) 10:11:33
>>643
基本的に心配のポイントがナンセンスだとは思うんだが…
どちらにせよ異常処理としては、後処理(atexit登録)の内容、意味、重要性
毎にケースバイケースの判断が必要だろ?
atexit()使わない人も少なくないから興味薄いし、
それでも心配なら自分で ANSI(ISO), POSIXをきちんと調べるべきだろうに。
646デフォルトの名無しさん:2005/11/01(火) 10:27:54
>>643
> メモリの開放をatexitに任せるのは良くないと考えるべきですか?

そもそも、標準に準拠した環境なら、
main()のreturn or exit()で解放されるわけだが…。
>>643
アメやるから帰れ。
機能  atexit関数は,funcが指す関数を,プログラムの正常終了時に
     実引数をもたずに呼び出される関数として登録する。
処理系限界
     処理系は,少なくとも32個の関数の登録をサポートしなければ
     ならない。
返却値 atexit関数は,登録が成功したとき0を返し,失敗したとき0以外
     の値を返す。
648デフォルトの名無しさん:2005/11/01(火) 10:52:55
関数ポインタを登録するヒープを確保するくらいだろうから
失敗したらそれ以前のものがすべて破壊されるとは考えにくい。

ついでに言うとmallocやfopenに失敗した時
それ以前のハンドルがすべて無効になるともならないとも言ってないな。
649643:2005/11/01(火) 11:40:55
みなさん、貴重なご意見をありがとう!!

>>645
たしかに、ケースバイケースという点を見逃して質問してしまいましたね。実際atexitに登録していた関数は、動的に確保したメモリの開放に関連していたので、ある時点でatexitに失敗した場合、どうやってGCしようか思案していたのです。

>>646
すみません、「動的に確保した」メモリの開放のことだったのですが、言葉足らずでした。

>>647
まさに求めていたものです!639でbccが32回で止まったことに納得がいきました。
atexitに失敗したら、それまでに登録されていた関数が呼び出されるかどうかは、未定義なんですね。

>>648
なるほど。そう考えると、atexitに失敗したらメモリリークを避けるのは難しいってことなんですね。

色々勉強させてもらいました。どうもありがとうございました!
650デフォルトの名無しさん:2005/11/01(火) 12:13:25
0.1を10回足したら厳密に1になるような(固定小数点?有理数?BCD?)演算ライブラリで、一般的によく使われているものはありますか?
(C++ならboost::rational? 一般的とは言い難いかもしんないけど)
651デフォルトの名無しさん:2005/11/01(火) 13:02:34
下駄履かせて計算すればいいだけじゃない?
652デフォルトの名無しさん:2005/11/01(火) 13:13:29
>>649
> atexitに失敗したらメモリリークを避けるのは難しいってことなんですね。
いや、「まともな」OSならプロセスが死んだらメモリとファイルハンドラは解放する。
そもそもkill -9とかされたらatexit()自体呼ばれないし...

普通、atexitにはいきなり終了されるとマズイ処理とかを登録する
例えば、エディタでソース編集している時にいきなり保存もせずに終了したら泣くでしょ?
そういう場合、atexitにファイル保存処理を登録しとく。

wordは...あれはネタプログラムだから、ファイル保存せずに終了もありでしょう。
653デフォルトの名無しさん:2005/11/01(火) 14:18:41
>例えば、エディタでソース編集している時にいきなり保存もせずに終了したら泣くでしょ?
>そういう場合、atexitにファイル保存処理を登録しとく。
ハァ?
たとえにしても意味不明すぎ。
654649:2005/11/01(火) 14:18:42
>>652
そうなのですか!勉強になります。
となると、mallocしっぱなしでmainのreturnをした場合にも、きちんとメモリは解放されるものなんですか?
655デフォルトの名無しさん:2005/11/01(火) 14:33:08
>>651
特定用途だとそれでいいけど、欲しいのは汎用ライブラリなので……。
0.1を10回足すというのは、例示として浮動小数点だと誤差が出る典型的な
ケースを挙げただけで、それそのものが目的なわけではないです。
わかりにくくて申し訳ない。
656655:2005/11/01(火) 14:36:08
あ、特に一般的と言えるものはない、ということならそれはそれでいいです。
とりあえず目についたものは、GNU MPくらいかなぁ。
657デフォルトの名無しさん:2005/11/01(火) 14:41:08
>>654
> mallocしっぱなしでmainのreturnをした場合にも、きちんとメモリは解放されるものなんですか?
まぁ、コーディングとして美しいかはともかく、「まともなOS」なら解放される。
ちなみに私の独断でのまともなOSの定義はWinNT系とUnixなど
DOSやらWin9x系(特にMe)はまともなOSとは言い難い
658デフォルトの名無しさん:2005/11/01(火) 15:54:02
mallocしてfreeしないなんて人の道に反するよ。
659デフォルトの名無しさん:2005/11/01(火) 15:57:33
Win9X系でもメモリぐらいは解放するだろ
ちなみにfree()せずに終了してもMS-DOSでは問題ないはず
なんせシングルタスクの世界だからなw
660デフォルトの名無しさん:2005/11/01(火) 16:00:00
Win3.1がやばいんじゃなかったっけ。
プログラム間でポインタ受け渡して操作し合えたのにはシビれたよ。
661デフォルトの名無しさん:2005/11/01(火) 16:20:21
Win16は一番くさいよな。昔のMacOSとかも似たようなもんだろうな。
メモリが断片化するからmalloc()使うなと泣きを入れてくる素晴らしいOSだ。
662デフォルトの名無しさん:2005/11/01(火) 16:56:47
Win95 ってどうだっけ?
663デフォルトの名無しさん:2005/11/01(火) 17:26:31
>>649
う〜〜ん、やっぱり頭痛ものだなぁ……
exit()前にfree()が必須かどうかはともかく(C FAQネタ)、
>>647 の出典が不明なままでよく信じる気になれるよな。
とても ANSI,POSIX などの「規格」とは確信できないだろうに。
664デフォルトの名無しさん:2005/11/01(火) 17:41:28
atexit なんて使ったことないんだが。
グローバル変数使ってないと存在価値ないが、
グローバル変数なんて使わないし。
665647:2005/11/01(火) 17:50:37
>>658
free() してもメモリが OS に返されるわけではない。
…いや、このネタやっぱ禁止。

>>663
>>>647 の出典が不明なままで
おお、忘れてた。

JIS X3010 : 2003 (ISO/IEC 9899 : 1999)
プログラム言語 C
666デフォルトの名無しさん:2005/11/01(火) 19:02:05
お、fjの論争の続きか?
667デフォルトの名無しさん:2005/11/01(火) 19:23:11
まずはgoto論争を片付けてからだ
668デフォルトの名無しさん:2005/11/01(火) 19:31:20
>>360のやつ俺なりに書いてみたよ
いまいちポインタを使えきれてない気がするんだけど書き方のアドバイスお願い

#include <stdio.h>

int main( int argc, char *argv[] )
{
int i;
char e;
char *name[7]={"Yamada","Yoshizaki","Suzuki","Kato","Kamata","Kuwata","Maeda"};

e=getchar();

for(i=0;i<7;i++)
if(name[i][0]==e)
printf("%s\n",name[i]);
}

669デフォルトの名無しさん:2005/11/01(火) 19:58:38
>>668
まあいいんじゃない?
670デフォルトの名無しさん:2005/11/01(火) 20:15:22
C言語ってオブジェクト指向言語に比べて検出されるバグの数多い?
671デフォルトの名無しさん:2005/11/01(火) 21:20:27
ファイルを全部バッファに格納するのは
reallocでバッファ拡大してくのと
fseekで終端まで行ってftellで長さ見るの
どっちがいいのですか?
672デフォルトの名無しさん:2005/11/01(火) 21:25:19
reallocは論外だろ。
サイズはOSのAPI,システムコールでとったら。
673デフォルトの名無しさん:2005/11/01(火) 22:12:38
>>670
比較対照広杉だが、
C のエラーチェックは比較的甘いので、
そのせいでバグは多くなりやすいとは言えなくもない。
674デフォルトの名無しさん:2005/11/01(火) 22:14:45
Linuxのソースコードってどこで手に入りますか?
言語勉強の一環として読み解きたいんで
675デフォルトの名無しさん:2005/11/01(火) 22:16:58
>>668
イニシャルの入力はmain関数で行うんじゃないの?
676デフォルトの名無しさん:2005/11/01(火) 22:36:44
674は釣りですか?
677デフォルトの名無しさん:2005/11/01(火) 22:37:31
いやマジっす
678デフォルトの名無しさん:2005/11/01(火) 22:42:09
>>674
目の前にいたらお前を殴ってるぞ
679デフォルトの名無しさん:2005/11/01(火) 22:43:48
>>678
なぜでありますか?
たしかLinuxってC言語で書かれているのでは?
スレ違いではないと思うのですが
680デフォルトの名無しさん:2005/11/01(火) 22:46:43
679は釣りですか?
681デフォルトの名無しさん:2005/11/01(火) 22:58:32
>>680
釣りだと信じてる
682デフォルトの名無しさん:2005/11/01(火) 23:01:25
Linuxにソースコードついてないか?
683デフォルトの名無しさん:2005/11/01(火) 23:07:29
>>674
蚊Linuxですか?
684デフォルトの名無しさん:2005/11/01(火) 23:07:38
685671:2005/11/02(水) 00:10:10
>>672
レスどうも
winプログラミングではAPIでやってます

しかし、そういうシステムコール関数が用意されてない場合に終端に行ってftelを使うというのは、方法としてどうなんでしょうか。
今はreallocでやってるんですけども。
686デフォルトの名無しさん:2005/11/02(水) 00:27:11
>>685
相を分けて考えるべき。
・ファイルサイズを得る手段として、ftell()は無難か。
→ファイルサイズが2GBを超えた場合や、非バイナリモードなどで正しくない値を返す可能性があるが、概ね使える。
・ファイルサイズが得られない場合にrealloc()しながらファイルを読むのは適当か。
→一度fgetc()などで空読みしてでもrealloc()は避けたほうが無難かもしれない。
#ま、要はfseek()+ftell()が実装されているならそれを使うってことで委員で内科医?
687デフォルトの名無しさん:2005/11/02(水) 00:51:38
>>685
なら CreateFileMapping でFA

realloc は俺もやだ
x = realloc(y, z); で x != y のたびに memcpy するだろ
しかも x != y は毎回あっても規格合致だから
性能的に話にならない
688デフォルトの名無しさん:2005/11/02(水) 00:58:16
reallocは有害無益!!とほざいてみるテスト。
689デフォルトの名無しさん:2005/11/02(水) 10:13:02
私はCを始めて一年になる、初心者です。
分からないことがあります、質問しても良いでしょうか?

int *p;
p=calloc(10, sizeof(int));

int *p[10];

は同じポインター配列だと思うのですが、どこか違うのですか?
690デフォルトの名無しさん:2005/11/02(水) 10:23:16
int *p;
p=calloc(10, sizeof(int));

int *p[10];
p[0]=calloc(10, sizeof(int));

691デフォルトの名無しさん:2005/11/02(水) 10:25:22
>>689
上のpは10個の要素を持つint型の配列を指すポインタ
下のpは10個の要素を持つint*型の配列

ぜんぜん違う
692デフォルトの名無しさん:2005/11/02(水) 10:33:49
>>690
int *p[10];
p[0]=calloc(10, sizeof(int));

でそれぞれの要素に値を代入するにはどうしますか?
int i;
for(i=0;i<10;++i)
p[0][i]=0;
こうですか?
693デフォルトの名無しさん:2005/11/02(水) 10:43:17
>>686
>fseek()+ftell()が実装されているなら
ANSI C なら実装されているだろうし
(タマに実装されてない処理系があるが)
寧ろ stat/fstat が実装されてれば
そっちの方が話が早いような。

>>687
>性能的に話にならない
サイズにもよるが、そもそもファイルI/O(ry
694デフォルトの名無しさん:2005/11/02(水) 10:51:37
ちなみに、
int *p;
p=calloc(10, sizeof(int));
p[0]=calloc(10, sizeof(int));
int i;
for(i=0;i<10;++i){
p[0][i]=0;
printf("%d\n",p[0][i]);
}
ではエラーが出ます。callocを使って二次元配列は作れないですね。
695671:2005/11/02(水) 11:11:36
大変参考になりました
ありがとう
696デフォルトの名無しさん:2005/11/02(水) 11:21:50
697689:2005/11/02(水) 11:41:34
>>696
char a[]はchar *aと同じと聞いたことがあったのですが、
どうもぜんぜん違うもののようですね。
この辺の知識がこんがらがっていました。
ありがとうございました。
698デフォルトの名無しさん:2005/11/02(水) 13:03:56
Cでは2次元配列なんかできないと思っておけば問題ない。
2次元に見えるのはポインタに騙されてるだけ
699デフォルトの名無しさん:2005/11/02(水) 14:07:25
線形リストを作って、乱数(重複しないで)を入力するんですが、重複を判定するにはどうしたらいいでしょうか?
700デフォルトの名無しさん:2005/11/02(水) 14:29:37
>>699
set に insert していって戻り値を見ればいいんジャマイカ
701デフォルトの名無しさん:2005/11/02(水) 14:47:09
>>699
頭から順に登録されているかを判定する

>>700
Cだと、setなんか無いだろ
702デフォルトの名無しさん:2005/11/02(水) 18:26:36
どなたかアドバイスお願いします。

a,b,cという3本のソースファイルから参照した定数(下記)をヘッダファイルに
記載してソースファイルからそれぞれインクルードしました。
すると「MULTIPLE PUBLIC DEFINITIONS」というエラーが発生します。
constをstaticにすると解消されますがこれはなぜでしょうか?

const char num[8] = {0,1,2,3,4,5,6,7};
703デフォルトの名無しさん:2005/11/02(水) 18:32:31
>>702
includeしたら各翻訳単位に同名の非static変数が存在することになる。
よって多重定義でエラーを吐くんでアウト。
staticなら翻訳単位内のみで有効だから多重定義にならずにセーフ。
704デフォルトの名無しさん:2005/11/02(水) 18:35:29
タイピングゲームを作っているのですが、某人気タイピングゲームみたいに制限時間を
1秒ずつ減らしながらかつその秒数を表示でき、そういったことと並行して文字列の出入力を
可能にする関数もしくはプログラムを書いて下さい。

time(&t1);
while(1){
time(&t2);
if(difftime(t2,t1)>=1.0) break;

希望として上のコードを用いてほしいです。お願いします!
705デフォルトの名無しさん:2005/11/02(水) 18:36:13
gettickcountでまわしてください。
706デフォルトの名無しさん:2005/11/02(水) 18:41:53
それを言うなら timeGetTime だろ。
707デフォルトの名無しさん:2005/11/02(水) 19:24:56
>>702
#ifndef使ったら
ええんちゃうん?
708デフォルトの名無しさん:2005/11/02(水) 20:25:46
#include <stdio.h>

void main (void)

{
int i=1,s=0;

while(1)

{
s+=1;

if(s >=100)

break;

i++;

}

printf("1からの総和が100以上になるのは%dです。\n",i);

}
と書いたら、
709デフォルトの名無しさん:2005/11/02(水) 20:28:45
「1からの総和が100以上になるのは100です」と出た。
正解は14のはずだが・・・。
やはり、http://homepage3.nifty.com/aokura/
の「C言語を始めよう!」では駄目なのか・・・
710デフォルトの名無しさん:2005/11/02(水) 20:30:56
>>702
C FAQ10-6参照
> 一般に、以下のものはヘッダー(.h)に入れる。
> マクロの定義(プリプロセッサーの#define)
> 構造体、共用体、列挙型の宣言
> typedefの宣言
> 外部関数の宣言(質問1.11も参照のこと)
> グローバル変数の宣言
基本的にグローバル変数の「定義」はCソース内で行うべきであり
「宣言」はヘッダファイルで行うようにすべき

つまり、どっかのソース中に
> const char num[8] = {0,1,2,3,4,5,6,7};
を入れて、ヘッダでは
extern char num[]
と宣言しとく。

staticにすると、同じnumという変数が全てのオブジェクトファイルに入ってしまい
あまり好ましいとは言えない。
711デフォルトの名無しさん:2005/11/02(水) 20:31:58
>>708-709
何かのギャグですか?
712デフォルトの名無しさん:2005/11/02(水) 20:33:35
>>697
http://kmaebashi.com/programmer/pointer.html#argumentarray
char a[]とchar *aが同一視されるのは関数の仮引数の場合だけ。
713デフォルトの名無しさん:2005/11/02(水) 20:34:38
>>709
お前の書いたコードが悪い。
ループ内にprintfを書いてsの値を確かめてみな。
714デフォルトの名無しさん:2005/11/02(水) 20:43:27
>>708
> s+=1;
多分s+=i;が君の想定している動きなんだろうけど、
「プログラムは思ったとおりには動かない、書いたとおりに動く」
からなぁ...

あと、void mainとかforでどうにかできるのにわざわざ無限ループ使ってたりするところが萎えだなぁ...
> int i=1,s=0;
> while(1) {
>   s+=i;
>   if(s >=100)
>     break;
>   i++;
> }
for(i = 1, s = 0; s < 100; i++)
  s+=i;
2行で済むぞ。
715デフォルトの名無しさん:2005/11/02(水) 20:46:24
う、1とiを間違えてた。
レスdクス。
716デフォルトの名無しさん:2005/11/02(水) 20:53:24
>>714
実際改行しない書き方もあるから1行のこともあるわな。


しかし>>708-709のコードは気持ち悪すぎる。
背筋がゾゾッとした。
717デフォルトの名無しさん:2005/11/02(水) 23:13:07
というか即フリーソフトのせいにしてるのが笑える、もとい笑えない
718デフォルトの名無しさん:2005/11/02(水) 23:18:18
C言語の初心者スレいっぱい立ちすぎ
719デフォルトの名無しさん:2005/11/02(水) 23:37:00
>void mainとか

UNIX って偉いなあw
720デフォルトの名無しさん:2005/11/03(木) 10:01:20
1とiを見間違えることはあっても
1とiを書き間違えるなんてことがあるなんて
721デフォルトの名無しさん:2005/11/03(木) 10:42:00
視覚記憶は想像以上に影響あるからな
ローマ字入力しているときに濁点忘れとか実際あるし
722デフォルトの名無しさん:2005/11/03(木) 16:02:11
ねえよ
723デフォルトの名無しさん:2005/11/03(木) 16:21:36
ないな
724デフォルトの名無しさん:2005/11/03(木) 16:46:08
うん
725デフォルトの名無しさん:2005/11/03(木) 17:02:55
俺あるぉorz
726デフォルトの名無しさん:2005/11/03(木) 18:22:20
/* 拡張子がすべて大文字かどうか */
BOOL IsUpperExtension(const char *filename)
{
 unsigned char *ext;
 ext = (unsigned char *)PathFindExtension(filename);
 while (*ext != '\0') {
  if (*ext >= 'a' && *ext <= 'z') {
   return FALSE;
  } else if (_ismbblead(*ext)) {
   if (*++ext == '\0') break;
  }
  ++ext;
 }
 return TRUE;
}

/* ファイル名がすべて大文字かどうか */
BOOL IsUpperAll(const char *filename)
{
 unsigned char *s = (unsigned char *)filename;
 while (*s != '\0') {
  if (*s >= 'a' && *s <= 'z') {
   return FALSE;
  } else if (_ismbblead(*s)) {
   if (*++s == '\0') break;
  }
  ++s;
 }
 return TRUE;
}

...こいつプログラミングにむいてねぇorz
727デフォルトの名無しさん:2005/11/03(木) 18:55:41
>>726
別にいいんじゃない?
728デフォルトの名無しさん:2005/11/03(木) 19:22:36
const じゃないってことか?
729デフォルトの名無しさん:2005/11/03(木) 19:54:59
回答してるひとは、動かないソースを読んでて面白いですかね?
730デフォルトの名無しさん:2005/11/03(木) 19:59:30
犯人が明かされない推理小説でも楽しめる人間はいるもんだよ
731デフォルトの名無しさん:2005/11/03(木) 20:02:05
open();の中のmode_Tの値が、0660なのですがこれは何を意味するのでしょうか?
732デフォルトの名無しさん:2005/11/03(木) 20:03:14
頭の0は8進数の印
733デフォルトの名無しさん:2005/11/03(木) 20:03:33
mode_t ^^;
734デフォルトの名無しさん:2005/11/03(木) 20:06:11
>>732
有難うございます。今から基数の変換をやってみたいと思います。
735デフォルトの名無しさん:2005/11/03(木) 20:12:01
ファイル名が・・・じゃなくて、
大文字かどうか判定する一般的な関数を作るべきだな。
拡張子は・・・って関数も、それを利用して作ればいい。
736デフォルトの名無しさん:2005/11/03(木) 20:54:49
というか大文字がどうかを判定する標準関数が存在しているわけだが・・・

http://www.bohyoh.com/CandCPP/C/Library/isupper.html
737デフォルトの名無しさん:2005/11/03(木) 20:58:51
UNIX豚は別にして、ファイル名がASCIIだけとは限らないわけだが
738デフォルトの名無しさん:2005/11/03(木) 21:07:11
>>737
大丈夫。isupperはボーランドC++でも使えます
739デフォルトの名無しさん:2005/11/03(木) 21:11:39
ここは、windowsプログラミングのスレに変わったのでつか?(・∀・)
740デフォルトの名無しさん:2005/11/03(木) 21:25:28
ファイルシステムを規定しないと解決しない
741デフォルトの名無しさん:2005/11/03(木) 21:54:26
>>737
悪いが>>726がそれに対応しているようには見えないわけだが
ワイド文字のことを言いたいのならiswupperを使えばいい
742デフォルトの名無しさん:2005/11/03(木) 21:57:02
>>726のソースは、>>709のサイトのでつか?
743デフォルトの名無しさん:2005/11/03(木) 22:02:41
ASCIIに限定したくないのならなおさら標準関数を使ったほうがいいような希ガス
744デフォルトの名無しさん:2005/11/03(木) 22:05:31
あるデータ列の最大値がmax,最小値がminのとき、このデータ列をaからbの値
の範囲に正規化するにはどうすればいいですか?
745デフォルトの名無しさん:2005/11/03(木) 23:02:22
>>744
アルゴリズムについてはスレ違い。つーか、max〜minの値をa〜bに変換したいのか?
中学生レベルの問題ジャマイカ。
746デフォルトの名無しさん:2005/11/03(木) 23:05:22
>>744
RDBの正規化や浮動小数点の正規化というのは聞くが、なんだそれは?
747デフォルトの名無しさん:2005/11/03(木) 23:10:04
>>746
minを基準にして、データ列の他の値は、
minとの差分で表す見たいな事だと思ったけど
ちがうかな?
748デフォルトの名無しさん:2005/11/03(木) 23:18:27
>>747
あぁそういうことか
てっきり正規分布にでも当てはめるのかと思った
749デフォルトの名無しさん:2005/11/03(木) 23:50:28
正規化っちゅーのはたいていデータ列の平均引いて標準偏差で割ることだろう
750デフォルトの名無しさん:2005/11/03(木) 23:53:16
と思ったら分野によってだいぶ常識が違うみたいですね
ttp://ew.hitachi-system.co.jp/w/E6ADA3E8A68FE58C96.html
751デフォルトの名無しさん:2005/11/03(木) 23:55:42
>>749
それって正規分布に従う奴をN(0,1)に変換する奴だっけ?
つーか、質問が曖昧杉
752デフォルトの名無しさん:2005/11/04(金) 00:31:27
そりゃぁ、何を「正規」とするかだからねぇ。
つーか、スレ違いだっちゅうに。
753デフォルトの名無しさん:2005/11/04(金) 00:42:30
>>751
任意のN(μ,σ^2)を標準正規分布にあてはめるときに
Z=(X-μ)/σってのは統計の分野でよく使うやつです。

データ列を任意の区間[a,b]に変換するような場合も
アイデアは同じですね。冗談抜きに小学生でもできます。

で、C以前の問題ということでスレ違いですね。
754デフォルトの名無しさん:2005/11/04(金) 00:47:37
Cの文法はここで聞けばいいのかな?

宿題スレみてて、ちょっち疑問におもったんだけれども。
int func();
/* ... */
int func()
{
/* ... */
}
ってな書き方を何度か見たんですけど、下と等価なんでしょうか?
int func(void);
/* ... */
int func(void)
{
/* ... */
}
755デフォルトの名無しさん:2005/11/04(金) 00:52:42
>>754
上はK&Rスタイルだったっけか
とりあえず等価とみてよかったと記憶してるが
Cならちゃんとvoidって書くべきじゃね?
756デフォルトの名無しさん:2005/11/04(金) 01:01:43
>>754
等価ではない。
前者は引き数リストを省略している。
つまり、int func();と宣言してfunc(1);と参照してもエラーにならない。
引き数がないことを明示したければ、int func(void);と書かないといけない。

C++の場合は引き数リストを省略できないので、等価となることになっている。
757デフォルトの名無しさん:2005/11/04(金) 01:11:04
要は、
int func();
という宣言は、

Cなら
int func(...);
C++なら
int func(void);
と宣言したのと同じ。
758デフォルトの名無しさん:2005/11/04(金) 01:25:23
レスありがとうです。
Cでは引数がない場合はint func(void)と書くべきだとわかりました。
(宿題スレでお手本プログラムでvoidを書かないのが複数出てたんで、心配になってしまった・・・)
759デフォルトの名無しさん:2005/11/04(金) 01:33:52
解答する香具師にもバカが多いから、
質問する方もそのへんちゃんと見分けなきゃね
760デフォルトの名無しさん:2005/11/04(金) 01:39:56
>>759
お前もその馬鹿の一人だがな。
761デフォルトの名無しさん:2005/11/04(金) 01:41:40
int func();

int func(...);
は違う。

前者は引き数リストの省略で、後者は可変長引き数の指定。
尚、記憶に間違いがなければ可変長引き数の指定は固定引き数が一つ以上必要だった筈。
#誰か規格に当たってくれ。
762デフォルトの名無しさん:2005/11/04(金) 01:43:37
C言語覚え立てとかは答えたがりが多いしね
763デフォルトの名無しさん:2005/11/04(金) 01:46:55
>>759を見て、まさかオレに限って、いや万が一と思い、自分のレスを幾度も読み返し、
念のためググって自分の発言に間違いはないか、複数のサイトを比較し確かめた上で、
やっと自分には関係ないと安堵して一息ついた人の数↓
764デフォルトの名無しさん:2005/11/04(金) 01:55:13
だっふんだ
765デフォルトの名無しさん:2005/11/04(金) 01:58:01
>>763
そんなことするくらいなら規格に当たればいいのに。
766デフォルトの名無しさん:2005/11/04(金) 12:14:35
八つ当たりイクナイ
767デフォルトの名無しさん:2005/11/04(金) 14:58:55
三項演算子は左辺値にはならないのでしょうか?
全然実用的な意味はありませんが、あくまで
C言語の仕様を確認するためです。:

#include <stdio.h>
int main(void){

int a=1,b=2,x=3,y=4,*c,*d;
c=&x;d=&y;
*c=(a<b)? ((*c<*d)? *c:*d): ((x>y)?x:y);
//こんなネストは出来る。
printf("c=%d d=%d \n",*c,*d);
if(((a>b)? x:y)<8) printf("Aha!\n");
//条件文にも使用可能。がしかし、
// ((a>b)? x:y)= 8;
// ((*c>*d)? *c:*d)=10;
//((*c<*d)? c:d)= &a;
//printf("c=%d d=%d \n",*c,*d);
//と、色々やっても左辺値にはならないようだが?

return 0;
}
768デフォルトの名無しさん:2005/11/04(金) 15:15:17
int main()
{
int a1 = 40;
int a2 = 70;

*(a1 > a2 ? &a1 : &a2) = 10;
printf("a1 = %d\n", a1);
printf("a2 = %d\n", a2);
return 0;
}
これならできた
769デフォルトの名無しさん:2005/11/04(金) 15:35:05
だから質問する前にFAQくらい読めと何度言っ(ry

C FAQ 3.16
ttp://www.kouno.jp/home/c_faq/c3.html#16
770デフォルトの名無しさん:2005/11/04(金) 15:37:24
>768
こりゃあ!すげぇ。
て、ことは:
#include <stdio.h>
int main(void){

int a=1,b=2,x=3,y=4,a1=40,a2=70,*c,*d;
c=&x;d=&y;
*c=(a<b)? ((*c<*d)? *c:*d): ((x>y)?x:y);
printf("c=%d d=%d \n",*c,*d);
if(((a>b)? x:y)<8) printf("Aha!\n");

//両辺が共に三項演算子、が可能になったじゃないか!

*(a1 > a2 ? &a1 : &a2)=(a<b)? ((*c<*d)? *c:*d): ((x>y)?x:y);
printf("a1 = %d,a2 = %d\n", a1);
return 0;
}
//極めて非実用的では、あるが…
771デフォルトの名無しさん:2005/11/04(金) 16:14:46
>>767-768
ちなみにC++だと左辺値になるので(a1 > a2 ? a1 : a2) = 10;などが可能になっている。
772デフォルトの名無しさん:2005/11/04(金) 16:19:50
仕様を確認、といいながら未だFAQも規格も読めないウザ厨ってのはなんなのよ
773デフォルトの名無しさん:2005/11/04(金) 16:45:00
>仕様を確認、といいながら未だFAQも規格も読めないウザ厨ってのはなんなのよ

けれど、これはお世辞にも美しいとはいえない。
774デフォルトの名無しさん:2005/11/04(金) 16:52:54
これは・・・じゃなくて
君の性格は・・・
だろ?(w
775デフォルトの名無しさん:2005/11/04(金) 17:09:39
メモリのリーク管理はどうすれば良いんですか?
mallocしたらfreeなど解放には気を付けているのですが、
どこか気付いていないところで漏れていないか心配です
776デフォルトの名無しさん:2005/11/04(金) 17:11:05
>>775
C++使え
777デフォルトの名無しさん:2005/11/04(金) 18:22:46
>768
両辺が三項演算子って、なかなか面白そうだから
整列された二つの配列を奇数と偶数配列に
分割してみました。結構、「美しい」?コードです。
が、動きません。
どうすれば良いのでしょうか?

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

#define N 15

int main(void){

int ary1[]={ 2,5,7,8,10,(int)NULL};
int ary2[]={ 1,3,4,6,9,(int)NULL};
int aryOdd[N],aryEven[N];
int i=0,j=0,k=0,l=0,m,*x=&m;

while(*(x^1? &aryOdd[i++]:&aryEven[j++])=
(ary1[k]>ary2[l])*x=ary1[k++]:*x=ary2[l++]);
while(i--) printf("Odd = %d\n",aryOdd[i]);
while(j--) printf("Even = %d\n",aryEven[j]);
return 0;
}
778デフォルトの名無しさん:2005/11/04(金) 18:36:36
#include <stdio.h>

void main (void)

{
int i=1,s;

for(i=1,s=0;;i++)

{
if(i%2==0);

continue;

s+=i;

if(s >=100)

break;


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

}

printf("1からの奇数の総和が100以上になるのは%dです。\n",i);

}

どこがおかしいんだろう・・・
779デフォルトの名無しさん:2005/11/04(金) 18:38:15
>>777
whileに入ったところで読む気が無くなった
見づらいだけで意味無いだろ
780デフォルトの名無しさん:2005/11/04(金) 18:39:39
>>778
要は偶数だったらcontinueさせたいのか?
それだと無限ループ。ifの構文を見直せ
781デフォルトの名無しさん:2005/11/04(金) 18:39:52
>>778
無限ループ使うのいい加減止めろよ
782デフォルトの名無しさん:2005/11/04(金) 18:48:40
>>778
日記はEmacsにでも書いとけ
783デフォルトの名無しさん:2005/11/04(金) 19:03:32
#include <stdio.h>

int main(void){
  int i,s;

  for(i=1,s=0;(s+=i)<100;i+=2)
    printf("%d\n",i);

  printf("\n%dで計%d",i,s);

  return 0;
}

可能な限り最適化
784デフォルトの名無しさん:2005/11/04(金) 19:19:11
変数は必ず初期化しましょう
785デフォルトの名無しさん:2005/11/04(金) 19:31:19
ハァ?
786デフォルトの名無しさん:2005/11/04(金) 19:33:02
>>777
とりあえず入門からやり直せ。
・空ポインタ定数マクロをポインタ以外のものとして使用してはいけない
・ポインタはビット演算できない
・排他的OR演算子は偶奇を判定しない
・直前の副作用完了点と次の副作用完了点までの間に、式の評価によってオブジェクトに格納された値を変更する回数は高々一度だけでなければならない。更に、変更前の値は、格納される値を決定するためだけにアクセスしなければならない。
・三項演算子の?は省略できない
787デフォルトの名無しさん:2005/11/04(金) 19:47:57
788デフォルトの名無しさん:2005/11/04(金) 21:01:32
>786
先生!ご指摘の部分を修正したところ、エラーの数は確かに
「激減」致しました。が、依然として動きません。
#include <stdio.h>
#include <stdlib.h>
#define N 15

int main(void){

int ary1[]={ 2,5,7,10,(int)NULL};
int ary2[]={ 1,3,4,6,9,(int)NULL};
int aryOdd[N],aryEven[N];
int i=0,j=0,k=0,l=0,m,*x=&m;
while(*(
(x%2)?
&aryOdd[i++]:
&aryEven[j++])
=
(ary1[k]>ary2[l])?
*x=ary1[k++]:
*x=ary2[l++]);
//これで「見易く」はなりましたよね?
while(i--) printf("Odd = %d\n",aryOdd[i]);
while(j--) printf("Even = %d\n",aryEven[j]);
return 0;
}
>>
・直前の副作用完了点と次の副作用完了点までの間に、(以下略)
<<
このコメントを加味したコードをお示し下さい。
先生の「華麗な」力技を期待しております。
789デフォルトの名無しさん:2005/11/04(金) 21:05:01
>>788
だから(int)NULLはおかしい。NULLはヌルポインタを表すもの。
int値では0にしろ。
790デフォルトの名無しさん:2005/11/04(金) 21:05:14
>>788
もう帰れ
791デフォルトの名無しさん:2005/11/04(金) 21:10:51
オナニーショウを見てもつまらねえ
792デフォルトの名無しさん:2005/11/04(金) 21:14:36
>>788
なにこの糞プログラム
793デフォルトの名無しさん:2005/11/04(金) 21:20:43
>789
NULLを0に代えましたが、
> '%' : 不正な左オペランドです。
> '=' : 左のオペランドが、左辺値になっていません。
エラーが消えません。
先生方の華麗な力技を是非!是非!
794デフォルトの名無しさん:2005/11/04(金) 21:23:13
先生方、両辺三項演算子スタイルって結構
発展性を秘めているんじゃないでしょうかねぇ?
795デフォルトの名無しさん:2005/11/04(金) 21:23:25
>>793
(*x%2)にすればVC++7.1では動いた。
796デフォルトの名無しさん:2005/11/04(金) 21:30:25
for文で終了条件をa[i]番目が−または+の時ってしたいんですけど
for(i=0;a[i]!='-'||a[i]!='+';i++){
↑じゃあダメですよね どうしたらいいか教えてもらえませんか?
797デフォルトの名無しさん:2005/11/04(金) 21:30:42
>>793 NULLを \0にしてみたらどうですかねぇー。
798デフォルトの名無しさん:2005/11/04(金) 21:34:28
ていうかなんでNULLじゃなきゃ駄目なんだ?
799デフォルトの名無しさん:2005/11/04(金) 21:37:38
>>796
適当にこれじゃだめ?

for(i=0;i<max;i++){
  if(a[i]=='-'||a[i]=='+')
     break;
}
800デフォルトの名無しさん:2005/11/04(金) 21:46:31
>>796
for(i = 0; a[i] != '-' && a[i] != '+'; i++)
801デフォルトの名無しさん:2005/11/04(金) 21:55:28
&&でいけました ありがとうございます
802デフォルトの名無しさん:2005/11/04(金) 21:57:34
>795
>(*x%2)にすればVC++7.1では動いた。
当方はVC++6.0です。
ファイルをcからcppに変更しましたら辛うじて動きました。
この時点で本来このスレの話題では無くなるの
ですが、そこを敢えてしつこく…
当方の実行結果下記の通り、おかしなこと?に
なっておりますが、先生の7.1ではどうでしょうか?
また、ファイルはcのままでしょうか?
Odd = 9
Odd = 3
Odd = 1
Odd = 7
Odd = 5
Even = 0
Even = 6
Even = 4
Even = 10
Even = 8
Even = 2
803sage:2005/11/04(金) 22:06:00
-1.#IND00e+000か1.#QNAN0e+000を判別したいんです。
microsoftには、以下のようにして"C"が表示されればNaNとわかると
載っていたのですが、実行すると、いずれも表示されません。。
環境はwin2kにVC++6.0です。
初心者なりに検索したのですが、どうしようもなくなってしまいました。
時間のある方、教えてくださいm(_ _)m

if(a<0.){
printf("A")}
else if(a>0.){
printf("B")}
else{
printf("C")}

804803:2005/11/04(金) 22:06:32
慌ててた、、死にたい、、
805デフォルトの名無しさん:2005/11/04(金) 22:17:08
>>803
;を付けないのは仕様ですか?
806デフォルトの名無しさん:2005/11/04(金) 22:20:00
しようのない子ね♥
807803:2005/11/04(金) 22:20:14
>>803
忘れてただけです、、
基本的にFortranを使ってたのでその癖が出ちゃいました。
すんません。
808デフォルトの名無しさん:2005/11/04(金) 22:20:44
エラーが出て動かないときってエラー文見ないわけ?
VC++ならご丁寧に日本語で出力されるじゃん。
不思議でならんな。
809デフォルトの名無しさん:2005/11/04(金) 22:22:10
>804
なにも2ちゃんで死ぬほどのこたぁないと思うが・・・
810803:2005/11/04(金) 22:23:09
あああ、、
判ると思うけど807の>>803>>805です。
ほとんど徹夜状態なんで許してください。。
811デフォルトの名無しさん:2005/11/04(金) 22:52:54
>810
いいってことよぉ。
どうせここんところの発言は全部一人で
書いてんだからさぁ。
812デフォルトの名無しさん:2005/11/04(金) 22:55:32
>>803
おまえ、素直に一晩寝てから書き込め。
813デフォルトの名無しさん:2005/11/04(金) 23:47:10
>>778
おかしいところは盛りだくさんだけど
とりあえず
if(i%2==0);
の行末のセミコロンを取り除けばとりあえず動くんじゃないかな
814デフォルトの名無しさん:2005/11/05(土) 00:17:27
>>795
未定義動作が含まれてるから動かしちゃだめ
815デフォルトの名無しさん:2005/11/05(土) 01:05:18
if(i%2==0)だと偶数の総和になると思うぞ
816デフォルトの名無しさん:2005/11/05(土) 01:17:49
てかif(i%2)で十分
817デフォルトの名無しさん:2005/11/05(土) 01:17:55
セミコロンがついてると
for(i=1,s=0;;i++)
{
continue;
}

だよ
無限ループじゃん
818デフォルトの名無しさん:2005/11/05(土) 01:22:14
#include <stdio.h>
int main (void)
{
int i=1,s;
for(i=1,s=0;;i++)
{
if(i%2==0)
continue;
s+=i;
printf("%d ",s);
if(s >=100)
break;
}
printf("\n1からの奇数の総和が100以上になるのは%dです。\n",i);
return 0;
}

result:
1 4 9 16 25 36 49 64 81 100
1からの奇数の総和が100以上になるのは19です。

すこーしだけ改変
しっかしすげーうんこプログラムだね
819デフォルトの名無しさん:2005/11/05(土) 08:41:30
ド素人だから知らんかったが
CにもCONTINUEがあるんだな
GOTOみたいなもんだろ
気持ち悪いな^^;
820デフォルトの名無しさん:2005/11/05(土) 10:54:29
break
821デフォルトの名無しさん:2005/11/05(土) 11:30:30
gotoを使いたくないからcontinueとかbreakとかがあるんじゃないの?
822デフォルトの名無しさん:2005/11/05(土) 11:31:31
論理的に等価
823デフォルトの名無しさん:2005/11/05(土) 11:58:34
char a=1;
printf("%d",sizeof(a));//実行すると 1
printf("%d",sizeof(~a));//実行すると 4

型変換は演算が無い限り行われないと考えていいんでしょうか?
だとすると

printf("%d",sizeof'A');//実行すると4

となるのは何故でしょうか?
824デフォルトの名無しさん:2005/11/05(土) 12:01:43
'A'がintだからじゃない?
825デフォルトの名無しさん:2005/11/05(土) 12:06:07
というか実際そうだ
Cだとintになる
826デフォルトの名無しさん:2005/11/05(土) 12:06:48
>>824
レスどうもありがとうございます。
ある本に「文字定数からintへの格上げ〜」と書いてあったで、
文字定数はcharと決め付けてしまいました。
827デフォルトの名無しさん:2005/11/05(土) 12:11:43
>>825
そうでした。つまらない質問をして申し訳ないです。
参考までにエキスパートCプログラミング P.208です。
自分の読み違いかもしれませんね・・・。
828デフォルトの名無しさん:2005/11/05(土) 12:23:21
>>821
break は中間判定という点で goto と同じ考え方で使うもの
ただしループの途中に外から飛び込むことができない、いわば制限つきの goto だ

>>822
さて、continue はどうだろう
分岐先はループ内であり逸脱前に前判定または後判定を必ず通るので中間判定とは言いがたいと思う
829デフォルトの名無しさん:2005/11/05(土) 13:13:42
>>828
とりあえずその「中間判定」というのが何の寝言で gotoとどう関係するのか
説明してからのたまうべきだと思うが。(もしくは何も喋らないか)
830デフォルトの名無しさん:2005/11/05(土) 13:17:02
>>828
gotoとbreakが同列かよ
寝言は寝ていえ
831デフォルトの名無しさん:2005/11/05(土) 13:24:58
最近828みたいな奴がよくでるなぁ

#まさか同一人物じゃないですよね?
832デフォルトの名無しさん:2005/11/05(土) 13:26:47
gotoを効果的に使える場面でしか使えないようにしたのがbreak
利用方法さえ間違わなければgotoはとても有用だという証
833デフォルトの名無しさん:2005/11/05(土) 13:34:52
>>829
{ から } までを1命令と考えられるようにまとめようとしているとき、
命令A
命令B
命令C
というシーケンスでAからBを経ずにCへ制御が移ることを
命令Aに於ける中間判定といい
不明瞭なので避けるべきと主張するのが goto 有害説

よって立場のとりかた次第で意味を失いまたは反論の余地がでるが
ダイクストラは大規模なプログラムの能率的な管理に立場を置いている
834デフォルトの名無しさん:2005/11/05(土) 14:03:34
スパゲッティがどうのと文句垂れときながら、
再びGOTOがどうとか、懲りない奴ら
835デフォルトの名無しさん:2005/11/05(土) 14:08:54
gotoをはじめとした害悪を取り除いたのがJava
836デフォルトの名無しさん:2005/11/05(土) 14:13:44
JavaにもLABALあるぞ?
837デフォルトの名無しさん:2005/11/05(土) 14:29:38
gotoの代わりに例外という害悪を導入したのがJava
でもGCがあればgotoだろうがbreakだろうがどうとでもなります、だろ
838デフォルトの名無しさん:2005/11/05(土) 14:30:50
>>837
GC と goto 有害説がどう関係するのか聞きたい
839デフォルトの名無しさん:2005/11/05(土) 14:34:36
おーい、誰か食いつけよ
かなりもったいない餌まいたのに
つまんねー
840デフォルトの名無しさん:2005/11/05(土) 14:54:48
>>838
金がないからってgotoするよりは地道に空き缶でも集めてる方がいいって話
841デフォルトの名無しさん:2005/11/05(土) 15:44:27
>>833
何その中間判定の定義?しかもgoto有害説と関係ないじゃん
842デフォルトの名無しさん:2005/11/05(土) 16:17:59
>802 
Cでもこれなら動くが…

#include <stdio.h>
#include <stdlib.h>
#define N 15

int main(void){

int ary1[]={2,5,7,10,0};
int ary2[]={1,3,4,6,9,0};
int aryOdd[N],aryEven[N];
int i=0,j=0,k=0,l=0,m;

while(*(
(m%2)?//普通に変数を使えば良い。
&aryOdd[i++]:
&aryEven[j++])
=
(ary1[k]<ary2[l])?//802のコードの不等号は逆!
(m=ary1[k++]):
(m=ary2[l++]));

while(i--) printf("Odd = %d\n",aryOdd[i]);
while(j--) printf("Even = %d\n",aryEven[j]);

return 0;
}
843デフォルトの名無しさん:2005/11/05(土) 16:28:23
>842
先生!
もう半分諦めておりましたのに、お手数おかけしました。
お陰様で整列も上手く行きます。
しかしながら、10がぁ消えちまって…
最後の華麗な力技をお願いします。
他の先生方も是非!是非!
実行結果:
Odd = 9
Odd = 7
Odd = 5
Odd = 3
Odd = 1
Even = 0
Even = 6
Even = 4
Even = 2
Press any key to continue
844デフォルトの名無しさん:2005/11/05(土) 16:29:28
>>842
それも未定義動作。
845デフォルトの名無しさん:2005/11/05(土) 16:48:16
>844
未定義かどうか知らんが、確かに
毎回同じ実行結果にはなるね。
846デフォルトの名無しさん:2005/11/05(土) 18:08:43
#include <stdio.h>

void main (void)

{
int a=10,b=3,wa;

float syou;

wa=kasan(a,b);

syou=jozan(a,b);


printf("%dとの%dとの和は%d、商は%.1fです。\n",a,b,wa,syou);

847デフォルトの名無しさん:2005/11/05(土) 18:09:25
}
int kasan(int x,int y)

{
int z;

z=x+y;

return z;

}

float jozan(int a,int b)

{
return(a/b);

}

848デフォルトの名無しさん:2005/11/05(土) 18:18:04
先生!
lこれはfloatで戻ってくるかどうかは未定義だと
仰りたいのでしょうか?
849デフォルトの名無しさん:2005/11/05(土) 18:18:21
cmd.exe /C LCC.EXE KATASE~1.C
*** コンパイル開始 ***
KATASE~1.c 10: Warning: function 'kasan' undefined -- assumed to be int
KATASE~1.c 12: Warning: function 'jozan' undefined -- assumed to be int
KATASE~1.c 31: conflicting declaration for 'jozan'
*** コンパイル終了 ***
850デフォルトの名無しさん:2005/11/05(土) 18:20:12
>846,847
感動的に「寒い」コードだよなぁ…
851デフォルトの名無しさん:2005/11/05(土) 18:22:18
>849
片瀬先生ですかぁ?
852デフォルトの名無しさん:2005/11/05(土) 19:03:04
>>845
特定の環境下で同じ実行結果になるのはともかく、
未定義かどうか知らん、のは非情にまずかろう。
まあ842やその元のアプローチ自身、根本的に何の価値も無い
ということにまだ気がつかない奴残ってるのか?
ageてるのとかその他なんか急速に初心者スレよりひどくなって……
853デフォルトの名無しさん:2005/11/05(土) 19:05:56
>>828,833
寝言よりひどかったでした。
854デフォルトの名無しさん:2005/11/05(土) 19:18:56
寝言より酷いのは>>845
855デフォルトの名無しさん:2005/11/05(土) 19:23:34
とりあえず>>845がやってるのが価値が無いことだと言うことは
容易に認識してるんだが、未定義なのって副作用絡み?
今ひとつ副作用完了点辺りが理解できてない俺に誰かわかりやすく説明希望
856デフォルトの名無しさん:2005/11/05(土) 19:58:47
関数の仮引数のポインタは知ってますが、これは何でしょうか?K&Rにも載っていないのですが

/* 前のフェーズを設定 */
void *setbackphase(int phase)
{
static int backphase = 0;

backphase = phase;
return &backphase;
}
857デフォルトの名無しさん:2005/11/05(土) 20:01:19
あれま
858デフォルトの名無しさん:2005/11/05(土) 20:08:12
関数にポインタ付ける意味がわからんのだが・・・
ていうかなんじゃこれ?
phaseのアドレス返すだけなら&phaseでいいんぢゃないの???
859チラシの裏:2005/11/05(土) 20:12:09
ああ,backphaseとphaseのアドレスは違うからか・・・
860デフォルトの名無しさん:2005/11/05(土) 20:16:14
int phaseは関数を抜けた時点で破壊されるから。
861デフォルトの名無しさん:2005/11/05(土) 20:17:36
>>841
中間判定については確かにちょっとおかしいな
「中間判定による分岐」なら意味が通るが

ところで goto 有害説と関係ないと主張するためには
まずあなたの言う「goto 有害説」とは何かを示す必要があるぞ
現状、唐突に関係ないと言い出しているだけで(自粛)にしか見えてない
862デフォルトの名無しさん:2005/11/05(土) 20:18:07
>>858
日経ソフトウェアに連載されてたコードなんですけど
ttp://software.nikkeibp.co.jp/software/download/0407/algo0407.zip

この中の maillist.c の530行目に出てくるんです
863デフォルトの名無しさん:2005/11/05(土) 20:23:03
>858
吸い込み関数って知ってる?
正確に言うと参照を返す関数。
書き方悪いけど
return (*)〜;を返す。
分かりやすく言うと、関数が戻値を返したつもりでも、逆に値の吸い込み。
864デフォルトの名無しさん:2005/11/05(土) 20:23:34
関数内のstatic変数は関数抜けても存在し続けるから。自動変数だと関数抜けると破棄される。
865デフォルトの名無しさん:2005/11/05(土) 20:32:17
吸い込み関数に該当するページが見つかりませんでした。

検索のヒント

- キーワードに誤字・脱字がないか確かめてください。
- 違うキーワードを使ってみてください。
- より一般的な言葉を使ってみてください。
866856:2005/11/05(土) 20:36:40
>>863さん
ありがとうございます。参考にさせて頂きます

皆さんも有難うございました
867デフォルトの名無しさん:2005/11/05(土) 20:56:47
>852,854
確かに
>845
は従来の意味では、つまりC言語の仕様を厳格に
適用し、これまでコード例が豊富だと言う意味では
価値が無い。
ただ若干変な奴?だが彼が拘っている両辺三項演算子スタイルそのもの
に発展性があるかどうかは、今後の実装に拠るんじゃないか?
即ちC言語の仕様において現在、未定義とは未来永劫、未定義とは
限らない。
もっと広い目で見てやっても良いんじゃないかな?


868デフォルトの名無しさん:2005/11/05(土) 20:56:57
質問です。
プロトタイプをしない場合、暗黙の型変換が行われますが、
プロトタイプをした場合の引数における型の変換はどんなルールは基づいてるんでしょうか?
869デフォルトの名無しさん:2005/11/05(土) 21:00:10
>>868
そこまで疑問点を明確に定義できるなら規格票もってれば完璧にわかる
870デフォルトの名無しさん:2005/11/05(土) 21:05:08
>>855
簡単にいうと

*(e1 ? e2 : e3) = e4 ? e5 : e6

という式ではe5やe6の評価とe1の評価の間には副作用完了点はない。従ってどっちが先に評価されるかは決まっていない(この時点でもうだめなことはわかると思う)。

>>786の4番目の長い項目(の後半)をかみ砕いて言うと、
・副作用完了点を挟まずに一つのオブジェクトの変更と参照の両方をやるのは基本的に認められていない。
・但し、オブジェクトに格納される値を求めるとき(例えば x = x + 1のような場合)だけは参照していい。
ということ

>>845ではe5やe6でmが変更されているが、e1ではmをmに格納される値を求めるのとは別の目的で参照しているから未定義動作を引き起こす。
まあ、読みにくいだけならIOCCCに出すというような使い道もあるが、これじゃ無理だな。

念のために書いておくが

*(e1 ? e2 : e3) = (e4 ? e5 : e6, e7)

みたいなことをやって副作用完了点を無理矢理作り出しても無駄だから。
こんな場所に副作用完了点を作ってもe4 ? e5 : e6の副作用が完了するまでe7の副作用を起こさないことが保証されるだけでe1がいつ評価されるかには関与しない。
代入式の左辺と右辺の間に副作用完了点を作るのは不可能だ
871デフォルトの名無しさん:2005/11/05(土) 21:20:47
>>870
なるほど、サンクス
mの参照と代入が行われてるのを見落としてた
872デフォルトの名無しさん:2005/11/05(土) 21:40:19
>870
>代入式の左辺と右辺の間に副作用完了点を作るのは不可能だ
右辺の式評価が完了しない限り左辺に代入することは不可能だ。
従ってC言語の仕様における式評価順は右辺から左辺になるんじゃなかったか?
873デフォルトの名無しさん:2005/11/05(土) 21:44:12
>>872
m[i] = i++;
先に左辺が評価されても問題ないパターンがある以上、仕様上は未定義。
874デフォルトの名無しさん:2005/11/05(土) 21:45:46
>871
>mの参照と代入が行われてるのを見落としてた
もし、代入で統一したかったら、
(m=m%2)?
でも動くが…
875デフォルトの名無しさん:2005/11/05(土) 21:54:09
>873
>m[i] = i++;
>先に左辺が評価されても問題ないパターンがある以上、仕様上は未定義。
常に右辺から評価されても全然問題はない。
つまり上の例は、先に左辺が評価されて「も問題ない」パターンの
レアケースであり、左辺から評価されちゃまずいものが殆どではないのか?

876デフォルトの名無しさん:2005/11/05(土) 21:59:09
>>875
チミがなんと言おうとISO/IECでは未定義になってるんだから未定義なんだよ。
877デフォルトの名無しさん:2005/11/05(土) 22:00:23
>875
本来左辺式が評価されること自体が
レアケースであることは踏まえて、
そのレアケースのレアケースっていう
意味でだ。
確かにあまり意味はないが・・・
でも、面白いだろう?
こんな議論って。
878デフォルトの名無しさん:2005/11/05(土) 22:04:09
>>872
右辺 : 代入する値の特定
左辺 : 代入されるオブジェクトの特定
が出来れば代入は可能だが、そのどちらも「式評価の完了」を意味しない

ついでに書くと、3行目と4行目が論理的につながっていない。
3行目が仮に事実だとしてもそれだと「代入は右辺の評価のあと」としか言えない

>>874
そこに代入がないことが問題なんじゃなくて、右辺に代入があることが問題
879デフォルトの名無しさん:2005/11/05(土) 22:05:11
副作用完了点と評価順序の話を混同しているよ。
880デフォルトの名無しさん:2005/11/05(土) 22:06:39
>>875
なんか勘違いしてないか。
評価と代入は別であって、評価が終わらないと代入が行われないことは確かだが、
右辺を評価しないと左辺が評価できないわけではない。
その上で、C言語標準では「評価は式中いつ行われてもいい」となっているから、
副作用完了点を持つ式中では左辺右辺に関わらず未定義動作を引き起こす。
881デフォルトの名無しさん:2005/11/05(土) 22:27:33
>880
確かに:
int x =0,a=5,b=7;
*((x == 0)? &a : &b)= ++x;
printf("a= %d ,b= %d\n",a,b);
不貞だよな。
882デフォルトの名無しさん:2005/11/05(土) 22:45:18
>>867
少なくとも細くつりあがった目では見てないが、
生暖かい目で見てやるわ
883デフォルトの名無しさん:2005/11/05(土) 23:00:49
>882
生暖かいってのはリアルだよな。
これがあの寒いコードを書いた同一人物とは
とても思えん。(w
884856:2005/11/05(土) 23:17:39
>881
うわぁ、正気の沙汰じゃない、やめてくれ〜って感じだな
確かに研究者なら楽しいかもしれない
ちょっと着眼点を変えてみて、856のstaticには重要な意味がある
staticは実行開始時から終了までアドレスは変わらない
だから、不定だか不貞だかゆう言葉は分からないけどbackphaseは参照される側ということになる
てことで、856は誤りということになったwスミマセン
フテーヤローだみたいな状況を防ぐ為にも、関数内に独自に確保した関数やPrivateメンバ変数、コンビを組むアクセス関数なんかがあって、ストックの役目をしてる
フテーヤローの危うさには、他に、クラスオブジェクトポインタ(とそのメンバ)同士の代入とか、new使ったオブジェクトの代入とかヤバイもんがゴロゴロ転がってる
参照を返す関数は>856のvoidは腑に落ちないけど、例えば、
int& setbackphase(int phase)
これが基本形。ただし、〜&型はC++の仕様でCじゃ使えない
885訂正:2005/11/05(土) 23:19:59
>関数内に独自に確保した関数

>関数内に独自に確保した変数
>てことで、856は誤りということになったwスミマセン
も訂正で
>てことで、863は誤りということになったwスミマセン
なんか非常に読みにくくなった
失礼
887デフォルトの名無しさん:2005/11/05(土) 23:25:49
最近空気読めない人が多いな
888デフォルトの名無しさん:2005/11/05(土) 23:37:07
>>867
自演デンパくん?どっかの新聞と似たような論理展開しないでね。


>ただ若干変な奴?だが彼が拘っている両辺三項演算子スタイルそのもの 
>に発展性があるかどうかは、今後の実装に拠るんじゃないか? 

今後の実装には拠らない。言語仕様が決めること。


>即ちC言語の仕様において現在、未定義とは未来永劫、未定義とは 
>限らない。 

"*分かりやすい*詭弁"だねw
889デフォルトの名無しさん:2005/11/05(土) 23:38:47
「未」という字はどんな意味で使われることが多いかな
890デフォルトの名無しさん:2005/11/05(土) 23:38:58
曰くこんなスレで「楽しい議論」を撒き散らす人間に詭弁なんていわれたくないです\(^^)/
891デフォルトの名無しさん:2005/11/05(土) 23:39:59
副作用完了点の曖昧さは未定義というより不定義とでも言うべきだと思うが
892デフォルトの名無しさん:2005/11/05(土) 23:41:21
>>891
いえいえ規格書では未定義です
僕は規格書を読んだこと無い人間を馬鹿にしたいです
893デフォルトの名無しさん:2005/11/05(土) 23:41:42
少なくとも>>867の理屈なら何でも肯定できてしまうなぁw
894デフォルトの名無しさん:2005/11/05(土) 23:43:16
>規格書
プ
895デフォルトの名無しさん:2005/11/05(土) 23:43:20
俺の使っているコンパイラではこうだから、とか言う阿呆もいたな。
896デフォルトの名無しさん:2005/11/05(土) 23:44:41
未定義動作と決まっているならいいんじゃん。
897デフォルトの名無しさん:2005/11/05(土) 23:45:08
今日の釣果自慢していいですか?
898デフォルトの名無しさん:2005/11/05(土) 23:47:09
法律と同じだねぇ
「法律にはこう記されているんだから、それに従いたくないなら日本を出てくべきだ」
「いや、法律は人間によって定められたものであるが、法律が人間を定めてはならない」
899デフォルトの名無しさん:2005/11/05(土) 23:47:57
で、間違い書いてどれくらい恥晒したの?
まとめたまえw
900デフォルトの名無しさん:2005/11/05(土) 23:48:23
たまえw
901863:2005/11/05(土) 23:50:11
ところで、ちなみに俺はoprater派じゃない、使いたくはない
なぜかって?
よくできたclassならいいけど、やれることが狭まる
ちなみにVCのインクルードファイルにも見ない、見かけたことがない
902デフォルトの名無しさん:2005/11/05(土) 23:52:14
>>867
後ろの5行、ハン板でよく見かける展開ですが…もしかして
903デフォルトの名無しさん:2005/11/05(土) 23:53:48
>>901
本物の>>863なら吸い込み関数の定義を述べてよ。
ザンギエフなのか?
904デフォルトの名無しさん:2005/11/05(土) 23:54:05
ほおっておいてくださいこれが僕の生き方なんです
905デフォルトの名無しさん:2005/11/05(土) 23:59:20
>904
気にすることは無いと思います。
ポインタ型同士の代入、参照については、C関連やる人なら、しっかり深めとかなきゃいけない内容だし。
じゃないと迂闊にnewだのmallocだのは危なくて使えないでしょう。
>903
単に「参照を返す関数」に当て字を使っただけだよ
906デフォルトの名無しさん:2005/11/06(日) 00:00:55
吸い込み関数(笑)
907デフォルトの名無しさん:2005/11/06(日) 00:03:50
908デフォルトの名無しさん:2005/11/06(日) 00:06:40
俺は知識ない人だけど
自分で名づけた名前を「知ってる?」って聞くのはナンセンスだろ

全然面識ない人に「花子って知ってる?俺の娘なんだけど」
って言ってるようなもんだ
909デフォルトの名無しさん:2005/11/06(日) 00:07:44
参照て、上論議にあるように、どっちがどっちを参照かあやふやじゃない?
〜&型の関数は明らかに参照する側だろう
これに参照を返す関数てな、あやふやな言葉使うより、(笑) でも
きっちり、戻り値吸い込み!関数と言った方が適切だと思うけどね俺は、造語だけど。
だが、確かに863は誤った。
ところで、Cでこの議論からかってると、痛い目見るぞ、いつか・・・、というか罠はゴロゴロ転がってる。
910デフォルトの名無しさん:2005/11/06(日) 00:09:44
>自分で名づけた名前

いや、みんな、言葉は違えど、似たようなもん使ってると思ってたけど?
911デフォルトの名無しさん:2005/11/06(日) 00:10:37
>>908
まぁ逃げ道は残してあげとかないと、貴重なデムパ浴が…
912デフォルトの名無しさん:2005/11/06(日) 00:15:50
まぁ、釣りが楽しみで着てる様なもんだもんな皆w
ところで、核心の議論は中途半端だが、このまま終わりにして、あやふやなままアドレス参照、代入とかバシバシ使っちゃうわけか皆?
まあ、理解しててやってんなら楽しんどけばいいと思うけど。
913デフォルトの名無しさん:2005/11/06(日) 00:16:49
ところどころに半島の香りがするんですが。
914デフォルトの名無しさん:2005/11/06(日) 00:19:34
最近、史上最強オナニストがVIPから流れてきたのよ、悪いな
915863:2005/11/06(日) 00:24:12
日本語が変てことか?確かに文章下手で訂正だらけで読みにくくて申し訳ないけど
だが、大事な核心部分に国関係ないと思うけどね
だが、水差しちゃった感じだな、駄レスで本論と遠ざかってしまった
916デフォルトの名無しさん:2005/11/06(日) 00:28:22
そうだな。確かに国は関係無いが言葉が正確に使えないと議論にならないんで、正直アレだ。
917デフォルトの名無しさん:2005/11/06(日) 00:29:01
母国のサイトで質問すればいいのにね
918デフォルトの名無しさん:2005/11/06(日) 00:29:15
s/駄レス/だらず/
919デフォルトの名無しさん:2005/11/06(日) 00:30:15
>>917
ここは2ちゃんだぞ?
追い出された奴が流れて来たに決まってるじゃん。
920デフォルトの名無しさん:2005/11/06(日) 00:30:41
じゃん・・・
921デフォルトの名無しさん:2005/11/06(日) 00:31:52
なういじゃんふぉれすときゃっと
922デフォルトの名無しさん:2005/11/06(日) 00:32:11
ぃゃん・・・
923デフォルトの名無しさん:2005/11/06(日) 00:32:50
>>919
それじゃリアルと一緒じゃないか
924デフォルトの名無しさん:2005/11/06(日) 00:44:19
>>869
検索したらdefault argument promotionsを見つけました。
ありがとうございました。
925デフォルトの名無しさん:2005/11/06(日) 03:08:23
デンジャーなのは引数参照渡しだろうな
それもクラス間だと、注意報クラス
更にやばいのが3つ巴
クラスAのメンバ:void foo(int* a){}
クラスBのメンバ:void foo(&b){}
クラスCのメンバ:void foo(&c){}
そーとーきおつけなきゃいけない警報クラス、堤防決壊避難命令級!
クラスB,Cのオブジェクト作って更に流用なんてことになると手の施しようもないカトリーナクラス!!
ここまで来ると、オブジェクト至高だとか流暢なこと言ってられない、逆に裏スパゲチィ劣化版オブジェクト歯垢
引数参照渡しの場合、双方向あてがわれてローカル内で片方向にしてローカル変数で隠蔽等が効きにくい、禁じ手に近い
926デフォルトの名無しさん:2005/11/06(日) 03:11:20
黙れ基地外
927デフォルトの名無しさん:2005/11/06(日) 03:11:47
クラスBのメンバ:(A)a1.foo(&b);
クラスCのメンバ:(A)a2.foo(&c);
しっけい、こうだな
928デフォルトの名無しさん:2005/11/06(日) 03:14:55
ここまで来るとさすがに怖いな
929デフォルトの名無しさん
タイトルの読めないデムパの現れるスレはここですか?