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

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

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

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


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

【初心者歓迎】C/C++室 Ver.28【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1149815331/
C/C++の宿題を片付けます 68代目
http://pc8.2ch.net/test/read.cgi/tech/1151158759/
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/
2デフォルトの名無しさん:2006/06/26(月) 10:09:48
>>1 ANSI-Cかよ…
3デフォルトの名無しさん:2006/06/26(月) 12:46:08
>>1



しかし、何故「標準C」にしなかったのか?
4デフォルトの名無しさん:2006/06/26(月) 15:38:36
以下のように、構造体自体は実装ファイルで定義し、そのポインタのみをヘッダでtypedefすることで
構造体のメンバを隠匿する、という方法を見たのですが、これはANSI Cで認められている方法でしょうか?
手元の書籍等見ても記述がなく、ネットで検索しても分かりませんでした。

// MyData.h
typedef const struct PrivateMyData*MyDataRef;
// MyData.c
struct PrivateMyData {
char a;
char b;
};
5デフォルトの名無しさん:2006/06/26(月) 16:09:27
>>4
不完全型(incomplete type)として認められている。
6デフォルトの名無しさん:2006/06/26(月) 16:28:24
長さが3文字以上の文字列を入力として受け付けて,先頭と最後の文字を除いた文字列を出力せよ。ただ
し,入力される文字列が3文字以上であることは仮定して良い。ってどうゆうふうになりますかねぇ???
7デフォルトの名無しさん:2006/06/26(月) 16:32:46
>>6
void printCuttedString(const char * str)
{
#if 0 /* checkが必要なら
if (str == NULL || strlen(str) < 2) return;
#endif
printf("%.*s", strlen(str - 2), str + 1);
}
87:2006/06/26(月) 16:35:30
微妙に訂正。
- #if 0 /* checkが必要なら
- if (str == NULL || strlen(str) < 2) return;
+ #if 0 /* checkが必要なら */
+ if (str == NULL || strlen(str) < 3) return;
9デフォルトの名無しさん:2006/06/26(月) 16:40:17
>>7-8
×printf("%.*s", strlen(str - 2), str + 1);
○printf("%.*s", strlen(str) - 2, str + 1);
10デフォルトの名無しさん:2006/06/26(月) 16:40:48
>>6
宿題は宿題スレへ
11デフォルトの名無しさん:2006/06/26(月) 16:41:51
スレ違いでした。。すいません
12デフォルトの名無しさん:2006/06/26(月) 16:43:12
>>5
了解です。
オブジェクト型・関数型・不完全型という分類を知りませんでした。
ありがとうございました。
137:2006/06/26(月) 16:48:42
>>9
指摘THX.
#いかんなぁ、未だ寝ぼけてるようだ。

>>11
おいおい、回答しているのに無視かい。
14デフォルトの名無しさん:2006/06/26(月) 17:10:19
すいません。
ありがとうございました。
15デフォルトの名無しさん:2006/06/26(月) 17:25:55
>>13
> おいおい、回答しているのに無視かい。

この手の質問に、わざわざ回答するのもどうかと思う。
>>10の対応で十分。
16デフォルトの名無しさん:2006/06/26(月) 23:10:46
hoge.cの中でグローバル変数(externではない)gを用意
main.cで適当なポインタpをhoge.cの関数に渡す
hoge.cの中で、受け取ったpにgを入れてあげる
main.cでpを扱う
というのはアリでしょうか?

/* main.c */
int main(void) {
 char *p;
 func_hoge(p);
 printf("%s\n", p);
 return 0;
}

/* hoge.c */
char g[1024] = "hogehoge";
void func_hoge(char *p) {
 p = g;
}
17デフォルトの名無しさん:2006/06/26(月) 23:29:02
ヒント
void func_hoge(char **p)
1816:2006/06/26(月) 23:43:17
ありがとうございます。これで動いているっぽい?です・・・

/* main.c */
int main(void) {
 char *p;
 func_hoge(&p);
 printf("%s\n", p);
 return 0;
}

/* hoge.c */
char g[1024] = "hogehoge";
void func_hoge(char **p) {
 *p = g;
}
19デフォルトの名無しさん:2006/06/27(火) 22:34:20
アゲ
20デフォルトの名無しさん:2006/06/28(水) 00:15:45
調べたのですがわからなかったので質問をば

*(ushort *)a=3;

この文はどういう意味なのでしょうか?
ポインターのポインターなら

ushort **a=3;

となると思うのですが・・・
よろしくお願いします
21デフォルトの名無しさん:2006/06/28(水) 00:22:20
>>20
何者かわからないaをushortのポインタとみなし(キャストし)、その
指し示す先に3を代入するという意味で、ポインタのポインタではありません。
22デフォルトの名無しさん:2006/06/28(水) 00:34:26
なるほどキャストでしたか
どうもありがとうございました
23デフォルトの名無しさん:2006/06/28(水) 00:39:45
ところでANSIでは左辺値のこういうキャストは認められていなかったような
24デフォルトの名無しさん:2006/06/28(水) 01:46:16
別にaが定数(配列とか)とは書いてないし。
25デフォルトの名無しさん:2006/06/28(水) 02:03:30
entypeってどんな型でしょうか?検索したけど書いてないので・・・
26デフォルトの名無しさん:2006/06/28(水) 02:19:51
むしろ教えて欲しい
27デフォルトの名無しさん:2006/06/28(水) 07:40:35
>>23
全然問題ない。
(ushort *)aは右辺値だが、間接参照演算子の結果は必ず左辺値。
28デフォルトの名無しさん:2006/06/28(水) 10:12:27
[1] 授業単元: プログラミング
[2] 問題文: 階乗を計算するdouble型の関数を使い、1から10までの階乗を表示するプログラムを作成してください。引数を使わないで、外部変数を使って、main関数からユーザー関数に、1から10までの値を送ってください。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 今日
[5] その他の制限:お願いします。なるべく早く・・・
29デフォルトの名無しさん:2006/06/28(水) 14:11:54
93 :ひよこ名無しさん :2006/03/28(火) 02:03:32 0

別に竹石圭佑がゲイでもホモでもどーでもいいだろ。関わらずに無視すりゃ良いだけだし。
大体、ほっとけば勝手に犯罪起こして、また逮捕されて社会から消えるような野郎だしな。
30デフォルトの名無しさん:2006/06/28(水) 14:18:32
>>28
いっそ中退してしまえ間抜け。
31デフォルトの名無しさん:2006/06/28(水) 14:38:24
きも
32デフォルトの名無しさん:2006/06/28(水) 16:31:28
>>28
スレ違い
33デフォルトの名無しさん:2006/06/28(水) 16:32:26
>>25
> entypeってどんな型でしょうか?

標準Cにそんな型はない
34デフォルトの名無しさん:2006/06/28(水) 17:00:06
この質問はANSIでいいのかな?
WindowsまたはLinuxで動かす予定のソフトを作っているのですが、
仮にそのどちらでもないOSでソースをコンパイルした場合に

#if defined (_MSC_VER)

func_windows();

#elif defined (__GNUC__)

func_linux();

#else

//コンパイル時にここに来たらエラー表示してコンパイルを中断する方法を教えてください。
//よろしく。

#endif
35デフォルトの名無しさん:2006/06/28(水) 17:05:01
#error
36デフォルトの名無しさん:2006/06/28(水) 17:06:36
>>34
errorディレクティブ。

その前にその条件ではWindowsかLinuxかになっていないぞ。
本当にWindows/Linuxで判別したいなら_WIN32/__linux__が定義されているかを使うべきだと思う。
37デフォルトの名無しさん:2006/06/28(水) 17:15:30
#error でしたか。皆さんありがとうございます。
>本当にWindows/Linuxで判別したいなら_WIN32/__linux__が定義されているかを使うべきだと思う。
アドバイスありがとうございます。
私自身、どれを使ったらいいのか良く分からないまま_MSC_VERと__GNUC__を使っていました。


38デフォルトの名無しさん:2006/06/28(水) 22:09:20
文字列が書かれたファイルを読み込みたいんですが、

while(fscanf(fp,"%c",char)!= EOF ){

こう記述すると、最初の1文字しか入りません。どうしたらいいですか?
39デフォルトの名無しさん:2006/06/28(水) 22:12:57
>>38
> どうしたらいいでしょうか?

ファイル操作について勉強するといいよ。
40デフォルトの名無しさん:2006/06/28(水) 22:21:44
>>39
教科書読んで最善をつくしたんですが
41デフォルトの名無しさん:2006/06/28(水) 22:51:36
>>38
そう記述すると、どうみてもエラーです。
42デフォルトの名無しさん:2006/06/28(水) 23:04:21
>>41
どうかくんですか?
43デフォルトの名無しさん:2006/06/28(水) 23:13:40
getcharでいいだろ。

そして次はcharがchar型で問題が起きて聞きに来る予感。
44デフォルトの名無しさん:2006/06/28(水) 23:17:07
char型のspって名前のところに入れたいんですが

while(fscanf(fp,"%c",sp)!= EOF ){
でもだめだし
while(fscanf(fp,"%c",getchar(sp))!= EOF ){

でもだめなんです・・・・
45デフォルトの名無しさん:2006/06/28(水) 23:22:41
getcharでぐぐれよ。
サンプルコードぐらいすぐ出てくるだろ。
46デフォルトの名無しさん:2006/06/28(水) 23:30:58
いろいろ試したんですけど、左辺値が必要とかいわれたり、もう限界です
47デフォルトの名無しさん:2006/06/28(水) 23:34:31
× sp
○ &sp
48デフォルトの名無しさん:2006/06/28(水) 23:37:31
>>47
fp= NULL;
do{
printf("\nデータファイル名を入力して下さい");
scanf("%s", datafile);
fp = fopen( datafile, "r" );
}while( fp == NULL);

while(fscanf(fp,"%c",&speech)!= EOF ){
fclose(fp);
}
最初の1文字しかよみこまれないです・・・・
49デフォルトの名無しさん:2006/06/28(水) 23:41:04
>>48
落ち着いて自分が何を書いてるのかよく考えてみろ
50デフォルトの名無しさん:2006/06/28(水) 23:46:48
時間ないので優しくしてください
51デフォルトの名無しさん:2006/06/28(水) 23:46:56
あのなぁ、試行錯誤ってのは分かってる人間しかやっちゃ駄目なんだよ。
分かってない人間は、まず基礎を学べ。
その「教科書」とやらを窓から投げ捨て、すぐに書店に走れ。
52デフォルトの名無しさん:2006/06/28(水) 23:48:03
開いてないでしょ
53デフォルトの名無しさん:2006/06/28(水) 23:53:10
>>48
文字読み込む度にfclose()してどうする。


覚えようと言う気が、全く感じられないし、
才能もセンスもないみたいだから、辞めた方がいいよ。
54デフォルトの名無しさん:2006/06/28(水) 23:53:51
>>48
while(fscanf(fp,"%c",&speech)!= EOF ){
fclose(fp);
}

これの意味を日本語で説明してくれ
55デフォルトの名無しさん:2006/06/28(水) 23:54:30
うぜーむかついてきた
素直に答え教えろカス
56デフォルトの名無しさん:2006/06/28(水) 23:56:04
>>55
あれ?君宿題スレの人?
これからやるつもりだったけど、やる気なくなっちゃった。ごめーん。
57デフォルトの名無しさん:2006/06/28(水) 23:56:49
素直に教えてくれる友達に聞け
58デフォルトの名無しさん:2006/06/28(水) 23:57:20
>>54
55は俺じゃないです

説明できないっす。適当に書きました
上で&って言われたので入れてみたんですが
59デフォルトの名無しさん:2006/06/29(木) 00:00:13
まぁ、初心者スレにでも逝けと。
60デフォルトの名無しさん:2006/06/29(木) 00:06:34
while( fscanf( fp,"%c",&speech) != EOF ){
puts(speech);
}

にすると読み込めてるんですが、あとの処理では配列がからのままなんですが。。。
61デフォルトの名無しさん:2006/06/29(木) 00:12:06
>>60
始めから勉強し直せ!
62デフォルトの名無しさん:2006/06/29(木) 00:12:38
63デフォルトの名無しさん:2006/06/29(木) 00:15:25
>>59>>62
初心者スレの住人に迷惑。


>>60
と言う訳で>>61
64デフォルトの名無しさん:2006/06/29(木) 00:18:06
なんつうか、こうもうちょっと検索するなり
試行するなりしてから書き込めよ

65デフォルトの名無しさん:2006/06/29(木) 00:18:53
↓次の方どうぞ
66デフォルトの名無しさん:2006/06/29(木) 00:50:25
とりあえず検索するなり試行するなりしてかいるのかもしれないが、
少なくとも今までの姿勢からはそう見えない。
67デフォルトの名無しさん:2006/06/29(木) 01:00:26
>>60 ではじめて配列とか言い出したしな
68デフォルトの名無しさん:2006/06/29(木) 01:02:04
>>66
いろいろやってみました。
しかし文字列にスペースが入るとまた配列の最初から上書きされてしまうみたいです
69デフォルトの名無しさん:2006/06/29(木) 01:16:22
いろいろとは?具体的に。w
70デフォルトの名無しさん:2006/06/29(木) 08:22:18
で、どこに配列があるの?
71デフォルトの名無しさん:2006/06/29(木) 10:21:15
手取り足取り教えろとでも言うのかよ
72デフォルトの名無しさん:2006/06/29(木) 11:25:34
>>71
言ってるようなもんだろう、
いつまでも居座ってるって事は。
73デフォルトの名無しさん:2006/06/30(金) 09:36:15
そういう自助努力をしない人はプログラマーには・・・っていうか,どの職業も同じだな
74デフォルトの名無しさん:2006/07/01(土) 03:56:02
x86系とmips系ってどっちがC言語向きでしょうか?
75デフォルトの名無しさん:2006/07/01(土) 04:01:50
ゴリラとチンパンジー、どちらが日本語向きでしょうか?
76デフォルトの名無しさん:2006/07/01(土) 04:55:50
すみません
どこで聞いたらいいのか分からないのですが・・・
<-Bcc;
*;{ ...
{ #00ff00;kill(int;s1)>>;file);
w3 = exe->item;Goods*(Attach.)
alpha = exe->(TM)GOODIES;
act_probe = X->status.your_XP_adress;
act_layer = int;s2 = (x,$%&"#_LAYER(i++));
act_Demo = Xact_layer->list_of_files->next;
for(i=0;i,act_layer->(MS++GO;TO;DIE(=));

とか

act_probe = listt->zxcvb.local_XP_adress;
act_layer = GO/DEMO.sit(EXE-XXXX_LAYER(exe));
act_Demo = EXE_#layer->list_files->s1+=;xlan,0
for(i=0;i,exe->number_of_files;i++)
{
exe_#000000 = exec_#file->s2+=;b(off++));

ってなんかのソースですか?
それともプログラムですか?
教えてください
77デフォルトの名無しさん:2006/07/01(土) 05:30:41
>>76
GoodTimesだっけ?
ベースになってるネタはC言語のプログラムだけど、
それそのものはソースとしては成り立ってないし、何かのプログラムでもない。
そもそもウェブアートなんだから。
78デフォルトの名無しさん:2006/07/01(土) 06:33:55
ム板のクソスレによく書いてある
main()
{
  >>1氏ね;
}
みたいなものか
79デフォルトの名無しさん:2006/07/01(土) 11:13:05
>>74
前にビット演算スレでC言語向きなCPUについてぎゃーぎゃー騒いでたよ。
勿論標準Cの仕様にCPUの向き不向きなんて書いてないからここでやるな。
80デフォルトの名無しさん:2006/07/01(土) 12:04:01
質問です。

wchar_t型の文字の半角、全角を判別する方法はありますでしょうか?
標準関数の中からは見つかれらなかったのですが、どなたかご存知
の方いらっしゃいましたらお願いします。
81デフォルトの名無しさん:2006/07/01(土) 12:12:09
>>77-78
ウェブアートなんですか。ありがとうございます。
82デフォルトの名無しさん:2006/07/01(土) 12:47:10
>>80
突っ込み所はたくさんあるものの、結論から言うとないです
83デフォルトの名無しさん:2006/07/01(土) 17:28:07
何故T_CHARではないかと・・
84デフォルトの名無しさん:2006/07/01(土) 19:03:40
>>83
スレ違い。
85デフォルトの名無しさん:2006/07/02(日) 01:37:59
203 名前:It's@名無しさん :2006/06/29(木) 22:48:28
元GKだけど、なんか質問ある?
http://game10.2ch.net/test/read.cgi/ghard/1151582461/

204 名前:It's@名無しさん :2006/07/02(日) 00:34:08
IS…GK活動のソニー社内での呼称
NAVI…GK活動の指示がくるらしい。この指示に従って動く
ログ出し…上への書き込み報告

205 名前:It's@名無しさん :2006/07/02(日) 01:16:29
これがGKが居た証拠らしい・・確かに笑える。
154 :名無しさん必死だな :2006/06/29(木) 23:07:57 ID:bQ0GVGu7
http://www.google.co.jp/search?hl=ja&q=%EF%BC%B0%EF%BC%B3%EF%BC%93sugeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee%EF%BC%81%EF%BC%81&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
これだこれ
86デフォルトの名無しさん:2006/07/03(月) 02:32:31
>>80
使う文字にある程度制限があれば、
既知の半角文字だけ自前で判定すればいい。
87デフォルトの名無しさん:2006/07/04(火) 08:06:00
なんでCの入門書とかscanfとか使うなっていわれてる関数を例につかってるの・・。
初心者に対して例として使いやすいからってんだろうけどマジかんべんしてください。
#include<stdio.h>をおまじないと言って無理やり次に進むならscanfやgetsも
別の関数で無理やりおまじないとして使って例を挙げてください。
特にこの関数は使ってはいけない関数ですとか言って、後の記述に
ちゃっかり使って例を出してたりした時にはもう死にそう。
                                 初心者より
88デフォルトの名無しさん:2006/07/04(火) 08:10:40
>>87
そりゃぁあんた、実務経験のない人間が入門書を書いているんだからぁしかたがない。
尤も、実務経験のある人間で入門書を書けるセンスのある奴もなかなかいないわけだが。
89デフォルトの名無しさん:2006/07/04(火) 08:29:04
制御文よりも配列よりもポインタよりも先に、入出力は教える必要があるわけだが
これらを一切使わずに、int 型変数に整数値を取り込む簡単な方法が scanf 以外にあるなら教えてください
90デフォルトの名無しさん:2006/07/04(火) 10:21:18
ポインタを教えずにscanf()を使うくらいなら、
fgets()+atoi()で充分。
91デフォルトの名無しさん:2006/07/04(火) 11:21:08 BE:29115353-#
ハゲドー
92デフォルトの名無しさん:2006/07/04(火) 12:33:33
実務で使う関数は、標準関数じゃないものばかり。
そんな環境依存の本は「言語の入門書」にはならないよ。
93デフォルトの名無しさん:2006/07/04(火) 19:26:42
>>90
fread()+sscanf()はどうよ?
94デフォルトの名無しさん:2006/07/05(水) 00:49:39
>>93
メクラ?
>>90
>ポインタを教えずに
95デフォルトの名無しさん:2006/07/05(水) 01:09:48
沢山の変数の中から2つを選び出すには、何を使えばよいでしょうか?
96デフォルトの名無しさん:2006/07/05(水) 01:44:21
↓エスパー登場
97デフォルトの名無しさん:2006/07/05(水) 01:54:11
                /::::::::::::::::::::::;: ―-::、:::::ヽ
                /::::::::::::::::::::::::::/     `゙ヾi
              /:::::::::::::::::;;::::::::::l    -、 、__|
              l:::::::::::::/;ヾ:::/  ,,.-、_ :i;!ーi
              }:::::::::::::';r'ソ ゙'    ,.-━;;;ァ; ;:!
          、、__,....ノ;::::::::::::::iヾ      ` ゙フ´ : i゙
          /:::::::ヾ;、:::::::;:べリ.       /_  i
           ノi::::::::::::::::::ゞ'"   .      ,._ `ヾ:::;'
         ノ;::::::::::::::::/   :   :_  i:   '゙``ー:/ 俺の出番かな?
         i'i;、:;;r‐'" ̄``丶、 .ヾ::::゙:...._   '"゙:i'
          / -ー- 、、   `ヽ、ヾ:;;;;;;;;;;;;;;'ノ
98デフォルトの名無しさん:2006/07/05(水) 03:15:41
>>95
カン
99デフォルトの名無しさん:2006/07/05(水) 03:32:20
ポン
100デフォルトの名無しさん:2006/07/05(水) 07:27:28
ちょwwwwそこロンだってwwwwww
101初心者:2006/07/05(水) 09:51:52
c言語初心者なんで口柔らくお願いしますmーーm
数列の長さを設定しました。
キーボードで文字を入力します。
入力した文字が設定した長さを超えるとごみが出て
次の入力を影響します。
設定した長さ以後のごみをメモリからとる方法は??
(どんなの関数?)
102デフォルトの名無しさん:2006/07/05(水) 11:53:42
>>101
>口柔らくお願いしますmーーm
ふざけるな。お願いするのなら顔文字なんか使うな。
そして初心者スレに逝け。
恐らくgets()かscanf()を使っていると思うのだが、
fgets()を使うことを強く勧めておく。
103デフォルトの名無しさん:2006/07/05(水) 12:29:32
>>101
c言語って何?
Cなら知ってるけど。
104デフォルトの名無しさん:2006/07/05(水) 12:30:41
fgetsって改行文字も入れてくれちゃって使いにくい。
getsみたいに改行を取ってくれればいいのに。
105デフォルトの名無しさん:2006/07/05(水) 12:35:06
>>103
>>101が言っているのは「c言語」な訳だが...
106デフォルトの名無しさん:2006/07/05(水) 12:47:08 BE:139752498-#
>>104
#define gets_f(a,b) do{fgets(a,b,stdin);a[strlen(a)-1]='\0';}while(0);
107デフォルトの名無しさん:2006/07/05(水) 12:53:07
>>106
それだと最終行の行末に改行記号がないときに一文字落ちちゃうよ。
108デフォルトの名無しさん:2006/07/05(水) 12:58:27
ファイルじゃなくて標準入力なんだからいいじゃんいいじゃん。
109デフォルトの名無しさん:2006/07/05(水) 13:09:30
>>108
目的がオーバフロー対策なんだから、標準入力からでも末尾に改行がないときの対策こそ必要だと思うが。
まぁ、こんな感じだろ。
inline char * gets_f(char * a, size_t b)
{
if (fgets(a, b, stdin) == NULL) return NULL;
char * p = strchr(a, '\n');
if (p) * p = '\0';
return a;
}
110デフォルトの名無しさん:2006/07/05(水) 13:22:45 BE:17469533-#
こうか?
void chomp(char* s){int l=strlen(s)-1;s[l]=s[l]=='\n'?'\0':s[l];}
char* gets_f(char s, size_t len){char* res=fgets(s,len,stdin)&&chomp(s);return res;}
111初心者:2006/07/05(水) 13:23:45
101です、101の字は2チャンネルのデビューになります。
”C言語なら俺に聞け!”と書いたのでレス間違いました、
初心者レスに行きます。(以上礼!)
>>106御免今の能力で読めない><;
112名無しの初心者:2006/07/05(水) 16:00:27
isalnumはどういった使い方をすればいいんでしょうか?
113デフォルトの名無しさん:2006/07/05(水) 16:15:31
文字がアルファベット[A-Za-z]か数字[0-9]のいずれかであるかどうか判定したいとき。
114デフォルトの名無しさん:2006/07/05(水) 20:44:44
ランレングス法を使った文字列圧縮法
実行結果は
圧縮前文字列→AAABCCCCCCDDDEFGHHHHJJJ
圧縮前文字数→23
圧縮後文字列→AAAB@C6DDDEFG@H4JJJ
圧縮後文字数→19
という風になります。
sprintf(&cCnt,"%d",iCnt);
cHairetu[soeji]=cCnt;
を使うみたいです。
途中までやってみたのをとりあえず乗せてきます。
#include <stdio.h>
void main()
{
int iCnt;
int gokei;
int i=0;
int b=0,b2=0;
char mojiretu[50] = "AAABCCCCCCCCDDDEFGHHHHJJJ";
char mojiretu2[50];
char taihi;
i = 0;
printf("圧縮前文字列 → ");
while(mojiretu[i] != '\0'){
putchar(mojiretu[i]);
i++;
}
putchar('\n');
printf("圧縮前文字数 → %d\n",i);
115デフォルトの名無しさん:2006/07/05(水) 22:42:46
で質問は?
完成させてほしいなら宿題スレへけ
116デフォルトの名無しさん:2006/07/06(木) 15:03:35
質問が二つあるんですけれど、
(1)どうして、この二つの関数は引数の並びが違うんでしょうか?
void *calloc(size_t nelem, size_t elsize);
void *malloc(size_t size);
同じにしてもらったほうが、規則性があって分かりやすいような気がするんですが。

(2)
int *p = (int *)calloc(10, sizeof(int));
int *p = (int *)calloc( 1, 10*sizeof(int));
は同じですか?
117デフォルトの名無しさん:2006/07/06(木) 16:44:47
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00096.html

そういえば昔の HP-C は calloc がマクロで、
#define calloc(N, SIZE) memset(malloc((N) * (SIZE)), 0, (N) * (SIZE))
(うろ覚え) みたいになってたなぁ。
118デフォルトの名無しさん:2006/07/06(木) 22:19:19
プログラムの初心者なんですが教えてください。
1.web掲示板をつくる。
2.PDAのメモ帳を使って、その掲示板にリアルタイムで書き込みをしたい。

自分でも、よくわかってないんですが、
こういうことをしようとするには、どうやって進めていけばいいんですか?

馬鹿げた質問なんてことはわかっているんですが、教えてください
119デフォルトの名無しさん:2006/07/06(木) 22:46:49
小菅昭一って誰でしょうか?
この人のwebページなり書籍なりありませんか?
120デフォルトの名無しさん:2006/07/06(木) 22:46:53
>>116
(1)質問に質問で返して恐縮だが、一つしかないものと二つあるものを較べて並びが違うと言う、真意は?
少なくとも私には一つのものと二つのものを並びが違うとは言えないのだが。
(2)>117

>>118
1.WebProg板へどうぞ。
2.モバイル板へどうぞ。
121デフォルトの名無しさん:2006/07/06(木) 22:55:15
116じゃないけど、>>117の言いたいことは上が正しくて、下が誤りってこと?
122117:2006/07/07(金) 00:17:47
どの「上」「下」か知らんけど、
(2) 環境によっては、同じではない。
(1) 従って、要素数と要素サイズを別の引数として与えるのと
  要素数 * 要素サイズをひとつ渡すのとでは
  等価ではない可能性がある。
123デフォルトの名無しさん:2006/07/07(金) 10:30:52
>>118
まずそのPDAのメモ帳に通信機能はないでしょ。掲示板の方はPHPとかで簡単に作れる。受信したデータでWebページを生成
124デフォルトの名無しさん:2006/07/07(金) 18:37:21
>>118
ヒント:HTML
125デフォルトの名無しさん:2006/07/08(土) 16:56:38
getch()について質問があります

#include <stdio.h>
#include <curses.h>

int main(void)
{
char ch;
char test[20];
int i=0;

ch=getch();
while(ch!='\n'){
test[i++]=ch;
}

printf("%s",test);
return(0);
}

をコンパイルしようとすると
ld: Undefined symbols:
_stdscr
_wgetch
と出ます。

ググって調べたらttp://forums.macnn.com/archive/index.php/t-131565.html
の問題と同じなんですが解決法はないでしょうか?
126デフォルトの名無しさん:2006/07/08(土) 17:08:26
結論だけ言うと、君にはcursesは使いこなせないから、getch()はあきらめて
別の道を探せ。
127デフォルトの名無しさん:2006/07/08(土) 17:27:48
>>126
じゃあ他の方法でgetch()と同等の処理を実現できますか?
128デフォルトの名無しさん:2006/07/08(土) 17:32:17
conio.h使え
129デフォルトの名無しさん:2006/07/08(土) 17:33:36
>>125->>128
スレ違い。
環境依存OKスレか、初心者スレにでも逝け。
130デフォルトの名無しさん:2006/07/08(土) 17:39:38
131デフォルトの名無しさん:2006/07/08(土) 21:42:28
-lxxxxxx 抜けてるんだろうな
132デフォルトの名無しさん:2006/07/08(土) 22:31:13
mkdir関数についての質問があります。

予約デバイス名である
AUX
CON
NUL
PRN
CLOCK$
COM1〜COM9
LPT1〜LPT9

以上の名前のディレクトリの作成は失敗するらしいのですが、
何故かCLOCK$だけディレクトリが作成されてしまいます。
どなたか理由をご存知の方がいらっしゃいましたら
ご教授願えませんでしょうか?
133デフォルトの名無しさん:2006/07/08(土) 22:33:40
とりあえず環境依存OKのスレへ行ってください
134デフォルトの名無しさん:2006/07/08(土) 22:35:46
名前の最後を見ればわかる
135デフォルトの名無しさん:2006/07/09(日) 10:51:06
関数をポインタを受け取るように定義したんですが、
なぜその関数を実際に使う時は"&"で直接アドレスを渡す必要があるのでしょうか?
どなたかお願いします。
136デフォルトの名無しさん:2006/07/09(日) 10:57:35
>>135
いや、その必要は無いはず。
#include <stdio.h>
typedef void (*pfn)();

void f() {puts("hello");}
void g(pfn p) {p();}

int main(void)
{
  g(f);
  return 0;
}
137135:2006/07/09(日) 11:07:06
やはり問題ないですよね・・・違う原因を探ってみます。ありがとうございました。
138デフォルトの名無しさん:2006/07/09(日) 11:58:21
思いっきり話が噛みあっていない気がするのは漏れの気のせい?

>>135
初心者スレ辺りで実際のコードを貼ってみるといいと思うよ。
139デフォルトの名無しさん:2006/07/09(日) 14:36:07
C言語もプロトタイプ宣言って必須になったの?
gcc 3.4.4でエラーが返って来たんだけど

140デフォルトの名無しさん:2006/07/09(日) 14:44:26
>>139 C99 から必須。
141デフォルトの名無しさん:2006/07/09(日) 15:01:48
>>140
どうもです。

近いうちに規格が変わる予定ってあるんですかね?
142デフォルトの名無しさん:2006/07/09(日) 15:04:54
>>141
規格のほうはまだ先だろうが、コンパイラの実装が C99 に追いつくのは
「いまがんばってるとこ」って感じだから、実際に使用する規格が
C89 から C99 に変わるのは近いうちなのしれない。
143デフォルトの名無しさん:2006/07/09(日) 15:12:28
>>142
10年くらいかわならいんじゃ?
144デフォルトの名無しさん:2006/07/09(日) 15:12:38
既にデフォルトオプションではC99相当の構文解析をするコンパイラも大分出てきたので、
今のうちに対策を始めた方がいいのかもしれない。
#しかし、個別の話はここではスレ違いだな。
145デフォルトの名無しさん:2006/07/09(日) 15:20:19
ソースコードは、C99とC89のどっちで書くのが理想的なの?

おれは大体いつも意識して古臭い書き方してるけど。
146デフォルトの名無しさん:2006/07/09(日) 15:37:38
間を取ってC++。
ベターC部分はC89とC99を足して2で割ったものに+αしたような感じだろ。
147デフォルトの名無しさん:2006/07/09(日) 16:02:03
>>145
どっちでも問題がない書き方
148デフォルトの名無しさん:2006/07/09(日) 16:44:30
おれの場合だいたい、gccならC99、Visual C++ならC89

そんで、使えるもんは使っとく、使えなかったら諦めるってだけだが
149デフォルトの名無しさん:2006/07/09(日) 18:00:23
完全に浸透するまでは C89 を使うのが無難だと思うが、
色んな理由から元々コンパイラ依存なコードを書いてるのであれば、
そのコンパイラで C99 が使えりゃ C99 を使っていいと思う。
150デフォルトの名無しさん:2006/07/09(日) 19:45:07
ファイルに書き出すために文字列を結合してさらにそれをまた結合するプログラムですが
変数自体は破損してないようなんですが途中で文字化けしてしまいます。
文字列の結合に問題があるんでしょうか?
教えてください。
for(i = 0 ; i < nowMaxNum-1 ; i++) {
 if(i != 0) {
  wsprintf(lpCmdLineX2 , "#%s\r\n\0" , mapSetAd[i]);
  lpCmdLine2 = strcat(lpCmdLine2 , lpCmdLineX2);
 }
 for(conpas = 0 ; conpas < 4 ; conpas++) {
  if(cnMaxNum[conpas][i] > 0) cnMaxNum[conpas][i]--;
  for(id = 0 ; id < cnMaxNum[conpas][i]+1 ; id++) {
   wsprintf(str , "S%d %s" , cnNum[conpas][i][id] , cnStr[conpas][i][id]);
   MessageBox(hWnd,str,"確認",MB_OK);
   wsprintf(lpCmdLineX2 , "%d,%s,\0" , cnNum[conpas][i][id] , cnStr[conpas][i][id]);
   lpCmdLine2 = strcat(lpCmdLine2 , lpCmdLineX2);
  }
  wsprintf(lpCmdLineX2 , "|,|,\0");
  lpCmdLine2 = strcat(lpCmdLine2 , lpCmdLineX2);
  if(conpas == 3) {
   wsprintf(lpCmdLineX2 , "\r\n\0");
   lpCmdLine2 = strcat(lpCmdLine2 , lpCmdLineX2);
  }
 }
}
151デフォルトの名無しさん:2006/07/09(日) 19:57:46
>>150
「変数自体は破損していない」「文字化けしてしまう」というのが
具体的にどういうことなのかわからないので、はっきりとはわからんが、
strcat() の戻り値を使ってるあたりが勘違いの一端と思われ。
lpCmdLine2 の指してるバッファが足りないんじゃないの?
152デフォルトの名無しさん:2006/07/09(日) 20:00:34
>>151
ホントだ。サンクスです
153デフォルトの名無しさん:2006/07/10(月) 19:29:07
/* 1〜99 までの奇数を表示 */

#include <stdio.h>
int main(void)
{
int n = 0;
while (++n > 0 && n < 100) {
if (n % 2)
printf("%d ", n);
}
return 0;
}

結果
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 …
… 79 81 83 85 87 89 91 93 95 97 99 hoge%

↑を ↓

_1__3__5__7__9
11 13 15 17 19
21 23 25 27 29
31 33 35 37 39


81 83 85 87 89
91 93 95 97 99
hoge%

のように並べたいのですけど、ご教示いただけないでしょうか。
154デフォルトの名無しさん:2006/07/10(月) 20:02:52
>>153
突っ込みどころ満載だが、ここではスレ違いなので
初心者スレか宿題スレへどうぞ。
155デフォルトの名無しさん:2006/07/10(月) 22:39:15
>>153
1桁の表示のアンダースコアについてよう分からんけど
面倒だからwhileの中をこうしたら?
if (n % 2) printf("%2d ", n);
if(n%10==0) printf("\n");
156デフォルトの名無しさん:2006/07/10(月) 23:59:39
なんてこったい。
157153:2006/07/11(火) 00:02:06
>>155
ありがとうございました。
できました。
未熟者でして、最初簡単だと思ってやったらハマッテしまっていました!

> 1桁の表示のアンダースコアについてよう分からんけど

桁数の表示を揃えたいということを伝えるために一桁のところに
アンダースコアを入れてみました。
158デフォルトの名無しさん:2006/07/11(火) 00:14:48
>アンダースコアを入れてみました。
おっきした
159デフォルトの名無しさん:2006/07/11(火) 00:17:32
  _  ∩
( ゚д゚)彡 変態!変態!
 ⊂彡
160デフォルトの名無しさん:2006/07/11(火) 10:27:46
アンダースコートを穿いてみました。
161デフォルトの名無しさん:2006/07/11(火) 19:08:28
脱げ
162デフォルトの名無しさん:2006/07/11(火) 22:28:26
>>161
スケベ!
163デフォルトの名無しさん:2006/07/11(火) 22:43:28
脱がぬなら、(我が)脱いでみようホトトギス
164デフォルトの名無しさん:2006/07/12(水) 02:28:27
構造体のことについて質問があります。

typedef struct data{
  int **data;
}Data;
という構造体があったとして、以下のようにmain()からfunc()に構造体を渡した場合、
正常に動くのでしょうか?

main(){
  Data a;
  int **data;
  data = (int**)malloc(sizeof(int*)*10);
  for(i=0;i<10;i++)
    data[i] = (int*)malloc(sizeof(int)*10);
  a->data = data;
  func(a);
}

func(Data *a){
  int i,j,sum=0;
  for(i=0;i<10;i++)
    for(j=0;j<10;j++)
      sum += a->data[i][j];
}

つまり何を聞きたいのかというと、
2次元配列を動的確保した構造体を別の関数に渡した場合、
その配列に正常にアクセスできるのか、ということです。
自分で試したところ、一応動いているみたいなのですが、なんかすごく不安です。
165164:2006/07/12(水) 02:31:24
すみません、main()の

Data a; → Data *a;

でした。
166デフォルトの名無しさん:2006/07/12(水) 02:34:52
>>164-165
Data a; に戻して、 a.data = data とし、 func(&a) とすれば問題ない。
Data* a; だと不定な領域を指しているポインタを使うことになるのでアウト。
167デフォルトの名無しさん:2006/07/12(水) 02:37:13
>>164
正しく動く。
まだ読んでなかったら、これ読んでみて(わかりづらいかもしれないけど)
ttp://www.kouno.jp/home/c_faq/c6.html
168167:2006/07/12(水) 02:38:34
>>166
ぐはっ、その通り。よく見てなかった。 orz
169164:2006/07/12(水) 02:46:52
>>167-168
解答ありがとうございます。
安心できました。

>>ttp://www.kouno.jp/home/c_faq/c6.html
まだ読んだことがなかったので、読んでみます。
どうもありがとうございます。
170デフォルトの名無しさん:2006/07/13(木) 13:16:18
昨日からC言語の勉強を始めたのですが
どのように勉強していけばいいでしょうか?
171デフォルトの名無しさん:2006/07/13(木) 13:33:53
最初は本読みながら。
その後、とりあえず何か簡単なものを作ってみる。
172デフォルトの名無しさん:2006/07/13(木) 13:51:05
日本語や英語と同じだ
文法を覚えながらいろんなソースを読んで書くべし
173デフォルトの名無しさん:2006/07/13(木) 15:09:56
>>171,172
取り合えず「猫でも分かる〜」を買ってきたので
それ見ながら勉強します!
早速、分からない所があるのですが、
作ったプログラムの結果が表示される
黒い画面はどこにあるのでしょうか?
174デフォルトの名無しさん:2006/07/13(木) 15:19:44
>>173
コンピュータの中
単体で立ち上げたいなら スタート > アクセサリ > コマンドプロンプト
あるいは スタート > ファイル名を指定して実行 > cmd
175デフォルトの名無しさん:2006/07/13(木) 15:55:56
>>173
というか、まずコンパイラが必要。
Windows なら、今ならこれがオススメ。
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/

これでやってりゃ、黒い画面ってやつは勝手に出てくる。
176デフォルトの名無しさん:2006/07/13(木) 17:13:51
ttp://www.borland.com/jp/products/cbuilder/freecompiler.html
ttp://www.vector.co.jp/soft/win95/prog/se141451.html
手軽にやるならまずこっち。VC++2005ExpressEditionは無料なのは良いが
アルゴリズムの勉強程度で、手軽にセットアップできるBCC32をデフォで使って
いざWindowsアプリを作るぞ!ってときにVC++を
177デフォルトの名無しさん:2006/07/13(木) 17:20:20
>>170-176
初心者スレでやればいい話をぐだぐだ続けるんじゃない。
そもそもスレ違いだ。
178デフォルトの名無しさん:2006/07/13(木) 17:21:11
>>177
お前何?このスレの主?お前に命令されたくないんだけど?
黙ってくれない?
179デフォルトの名無しさん:2006/07/13(木) 17:21:42
>>177
いちいちそういうこと言うなよ、ケツの穴の小さいクズだなぁをいっ
180デフォルトの名無しさん:2006/07/13(木) 17:21:45
>>176
宣伝乙。
わざわざ無料で使えるよりANSI準拠度の高いコンパイラを否定してまでとはご苦労なこって。
181デフォルトの名無しさん:2006/07/13(木) 17:23:03
178 :デフォルトの名無しさん :2006/07/13(木) 17:21:11
179 :デフォルトの名無しさん :2006/07/13(木) 17:21:42
みごとに31秒だね。よっぽど宣伝したいらしいなぁ、>>178=>>179=>176は。
182デフォルトの名無しさん:2006/07/13(木) 17:25:00
>>180
>否定して
覚えはない、何ボケてんの?自分が勧めたもの以外を勧めた奴がいると
何かと気に食わないと言わんばかりのレスを入れる奴は自己中
183デフォルトの名無しさん:2006/07/13(木) 17:25:43
>>181
>よっぽど宣伝したいらしいなぁ、>>178=>>179=>176は
イコールが間違ってますよw
184デフォルトの名無しさん:2006/07/13(木) 17:26:35
手軽さを考慮したらまだBCCで問題ない。それを勝手な基準で問題としている香具師は
大掛かりな開発環境の方が良いとしか言えない奴。
それと、VC+2005EEを宣伝したがっているのは誰だよ?w
185デフォルトの名無しさん:2006/07/13(木) 17:28:51
>176は「アルゴリズムの勉強程度」にはVC++がむかないと言っているだけだな。
つーか、喪前様方スレ違いですよっと。
186デフォルトの名無しさん:2006/07/13(木) 17:30:04
>>185
誰もむかないとは言っていないが?ここって自分の気に入らないレスを
悪いようにしか解釈できない頭の固いというか固定概念しか持っていない
汎用性の無い香具師が多いんだなw
おめーらの発想力は貧弱すぎ、プログラマに向いてないよw
187デフォルトの名無しさん:2006/07/13(木) 17:30:42
BCCが問題だとしている香具師はいないな。
>180は糞みたいなシェアウェアをけなしているだけだから。
188デフォルトの名無しさん:2006/07/13(木) 17:33:10
>>186
素朴な疑問なんだが、>176が仮に「VC++がむかない」とは言ってないのだとしたら
なんでまた>176は糞みたいなシェアウェアなんか紹介しているんだ?
そんなに小遣い稼ぎがしたいのか?
#いや、生活かかって必死なのかも知らんが。
189デフォルトの名無しさん:2006/07/13(木) 17:34:50
自分が手にしなかったもの、使わなかったものは全部糞としか言えない香具師はダメぽ
手軽さを考慮したら、BCCはまだまだ使えるよ。
そういう俺はVC++2005ExpressEditionとBCCの両方を使って
アルゴリズムの勉強程度ならBCC、WindowsアプリならVC++と使い分けているし。
VC++なら単純なソースを書くにも使えるけど、開発環境の仕様を理解していない
初心者に果たして向くだろうか?ってところまでは考えてないんだろうけどさ。
お勧めするくらいなら、参考になる本くらい紹介してやれば?
190デフォルトの名無しさん:2006/07/13(木) 17:35:44
>>188
> 糞みたいなシェアウェア
え?
> Borland? C++Compiler 5.5無償ダウンロード
って文字が見えませんでしたか・・・?
191デフォルトの名無しさん:2006/07/13(木) 17:37:58
>>190
>176のリンク2個目
--
CPad for Borland C++Compiler
Borland C++Compiler用のC/C++開発環境(送金義務なしのシェアウェア)

--------------------------------------------------------------------------------

動作OS:Windows2000 Windows98 Windows95 WindowsNT 
動作機種:汎用 
ソフトの種類:シェアウェア 1,575円

192デフォルトの名無しさん:2006/07/13(木) 17:39:47
BCC は Borland からウザいメールがくるので嫌だ。
193デフォルトの名無しさん:2006/07/13(木) 17:49:03
あらら、>191でネタばれしたら途端に静かになっちゃったよ。
まぁ、句点を使ってないレスを見れば一目瞭然なんだけど。
194デフォルトの名無しさん:2006/07/13(木) 17:56:21
多倍長演算を使ってπやらeやら求めてみたいと思ってるんですがそれらについて書いてあるおすすめのサイトが有りましたら教えてください
195デフォルトの名無しさん:2006/07/13(木) 18:12:08
>>194
取り敢えず取っ掛かりとしてはこの辺から。
ttp://www.sra.co.jp/people/miyata/algorithm/multprec.txt

後は自分でぐぐってみてくれ。
196デフォルトの名無しさん:2006/07/13(木) 19:09:21
cygwin+gccでおk
197デフォルトの名無しさん:2006/07/13(木) 19:36:29
>>193
> 送金義務なし
屁理屈うざ杉、フリーで使えることには変わりはなし。開発者は任意でって言っているし。
そもそもそれはエディタであって、使わなくても問題なし。コンパイラにおいてはフリーだろ。
そういう性格じゃプログラマに向いていないから、悪いことは言わないからやめとけ。
お前、プログラマだけでなく人生も失敗するぞ。
198デフォルトの名無しさん:2006/07/13(木) 20:10:59
void main()
{
int i;
int data[10];

for(i=0;i<10;i++){
data[i]=i;
}
}

こうした場合に例えばdata[-1]やdata[13]などを表示すると、どういう値がでてくるのでしょうか?
実際に試すと、よくわからない数字が出てきて、これが一体何を表すのかわかりません・・


199デフォルトの名無しさん:2006/07/13(木) 20:13:16
>>198
そういうこと。よくわからない数値が出るというのも、もっとも起こりそうな挙動の1つ。
200デフォルトの名無しさん:2006/07/13(木) 20:42:30
>>197
まぁお前の方がウザいんだが
201デフォルトの名無しさん:2006/07/13(木) 21:50:44

0xff,0xab,0x12
と入力したときにそれぞれ別の文字列に格納したいんですが、
どういう風に記述すればいいんでしょうか?
202デフォルトの名無しさん:2006/07/13(木) 22:22:28
>>200
いつまでやってんの?明らかに、BCCを否定しただけの奴の方がうざい。
BCCを勧めた奴はVC++は否定していないし。
203デフォルトの名無しさん:2006/07/13(木) 22:25:13
>>202
お前もいつまでやってんだよ
204デフォルトの名無しさん:2006/07/13(木) 22:25:42
痛い煽り厨 >>180 >>181 >>185 >>188 
極めつけが >>191 >>193 < シェアウェアの意味を理解していない無知
205デフォルトの名無しさん:2006/07/13(木) 22:26:22
>>203
お前もいつまでやってんだよ?お前に命令されたくない。何お前?ここの主?
だとしても2ちゃんねるじゃお前の勝手な意見は拘束力がないから無駄だけどね(プ
206デフォルトの名無しさん:2006/07/13(木) 22:42:26
誰かひろゆき呼んで来い
207デフォルトの名無しさん:2006/07/13(木) 22:47:31
>>205
お前は宿題スレから出るんじゃない。
208デフォルトの名無しさん:2006/07/13(木) 22:51:42
餓鬼は巣に帰れ
209デフォルトの名無しさん:2006/07/13(木) 23:57:59
また初心者同士の煽り合いか
210デフォルトの名無しさん:2006/07/14(金) 00:16:13
グローバル配列変数の宣言時の初期化に関して質問なんですが、
int hoge[2] = {1, 2};
extern hoge[2];
を一文で書く何かいい方法はありませんか?

配列でなければ
#ifdef GLOBAL_DEFINE
#define EXTERN
#define GLOBAL_INIT(x) = x
#else
#define EXTERN extern
#define GLOBAL_INIT(x)
#else
EXTERN int hoge GLOBAL_INIT(1);
とかでいいんですが。。。
211デフォルトの名無しさん:2006/07/14(金) 00:18:55
>>210
そんな無理にCとそりのあわない考え方をやろうなんてことは、よしておいた方がいいよ。
212デフォルトの名無しさん:2006/07/14(金) 00:19:56
EXTERN int hoge[2] GLOBAL_INIT({1, 2});
じゃダメ?
#そのマクロの存在自体の問題は兎も角。
213デフォルトの名無しさん:2006/07/14(金) 00:23:07
規模が大きくなるほど、変数初期化は専用の初期化関数に任せたほうが保守性がよくなる。
規模が小さけりゃ、そんな変なマクロ使うまでもない。
214デフォルトの名無しさん:2006/07/14(金) 00:30:33
>>210
ムリしてプログラムしなくてもいいと思うよ
215デフォルトの名無しさん:2006/07/14(金) 00:33:00
ごめん、環境書くの忘れてたよ、
環境はVC6.0です。
>>212の方法はエラーで弾かれました。

すこし状況を公開すると、
#ifdef GLOBAL_DEFINE
int hoge[3] = {1, 2, 3};
#else
extern int hoge[3];
#endif

こんなグローバル変数が大量にある。
ヘッダに書いてるので、ソース側の変更作業が発生しないような修正を施したい、というわけです。
216デフォルトの名無しさん:2006/07/14(金) 00:52:33
修正する必要はあるの?
217216:2006/07/14(金) 00:55:03
ごめん、流れ読めてなかった。
218デフォルトの名無しさん:2006/07/14(金) 01:04:31
>>216
確信をつかれました、結論から言うと、無いです。

過去から受け継いで受け継いでで半ば枯れたコードになりつつあるため、
触らないのが無難なのは分かってるんですが、
何か方法があるかなと思い質問してみたというわけです。

>>213
確かにそのとおりでしょう、そのうちコード整理をしてみたいと思います。

結論は出ました、有難うございました。
219デフォルトの名無しさん:2006/07/14(金) 01:41:49
>>201
いまいち意味がつかめんが、
#include"stdafx.h"
#include<stdio.h>
#include<string.h>
#include<malloc.h>

int main(void) {
char str[3][256];
int i, j;
for (i = 0; i < 3 ; i++) {
for (j = 0; j < 256 && str[i][j] != '\n'; j++) {
str[i][j] = getchar();
if (str[i][j] == ',' || str[i][j] == '\n') {
str[i][j] = '\0';
break;
}
}
}
for (i = 0; i < 3; i++) {
puts(str[i]);
}
return 0;
}
こんなんじゃ、だめかな。あまりいいプログラムじゃないが。
220デフォルトの名無しさん:2006/07/14(金) 01:45:11
>>219はもちろん#include<stdio.h>
以外のヘッダはいらないです・・・(消し忘れ)
221デフォルトの名無しさん:2006/07/14(金) 02:08:40
>>207
それはお前。お前が宿題スレから出るんじゃない。キチガイが多いなぁ、ここは、ったく。
222デフォルトの名無しさん:2006/07/14(金) 03:42:09
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

struct card {
int face;
char *suit;
};
typedef struct card Card;

void fillDeck(Card *,int [],char *[]);
void shuffle(Card *);

main()
{
Card deck[40];
int face[] = {1,2,3,4,5,6,7,8,9,10};
char *suit[] = {"hart","daiya","kurab","superd"};


srand(time(NULL));
fillDeck(deck, face, suit);
shuffle(deck);

printf("baeojunnbisimasu");


return 0;
}
223デフォルトの名無しさん:2006/07/14(金) 03:44:39
void fillDeck(Card *wDeck,int wFace[],char *wSuit[])
{
int i;

for (i = 0;i <= 39;i++){
wDeck[i].face = wFace[i % 10];
wDeck[i].suit = wSuit[i / 10];
}
}
void shuffle(Card *wDeck)
{
int i,j;
Card temp;

for (i = 0;i <= 39;i++ ){
j = rand() % 40;
temp = wDeck[i];
wDeck[i] = wDeck[j];
wDeck[j] = temp;
}
}
ここからカードを5枚表示させてその数字の合計を表示する
プログラムにしたいのですが
どなたか教えていただけないでしょうか
よろしくおねがいします
224デフォルトの名無しさん:2006/07/14(金) 07:33:13
>>223 自分でやれよ。
225デフォルトの名無しさん:2006/07/14(金) 09:51:42
>>174,175
レス遅れました。
アドバイスありがとうございます!
昨日はエディターっていうのをゲットしましたよ♪
226デフォルトの名無しさん:2006/07/14(金) 11:40:05
>>225
釣りじゃないなら頼むから初心者スレに行ってくれ。
227デフォルトの名無しさん:2006/07/14(金) 12:02:04
>>223
宿題は宿題スレへどうぞ
228デフォルトの名無しさん:2006/07/14(金) 13:28:05
ANSI-CでURIを解析する関数ライブラリってどっかに無いでしょうか?
http URLからabsoluteURIからホストとポートを取得したいのですけど、
229デフォルトの名無しさん:2006/07/14(金) 16:49:00
>>225
そうか
おれは昨日, Max OSXをインスコしたVMwareの仮想マシンをtorrentにてゲットしましたよ
230デフォルトの名無しさん:2006/07/14(金) 18:45:25
プログラミング超初心者にオススメのC言語本ってなにですか?
できればprintfとか以降でポインタぐらいから解説してくれてるのがいいです
231デフォルトの名無しさん:2006/07/14(金) 19:39:54
>>230
ポインタからプログラミング始めるなんて猛者だな。

普通の入門書で問題ないと思う。
本屋に行って自分が一番読みやすいのを選ぶべし。
私的にはインターネットのウェブサイトにある解説でも、入り口としてはいいと思う。
232デフォルトの名無しさん:2006/07/14(金) 19:44:19
>>231
ポインタまではどうにか理解できたんで
明日にでも本屋いってきます
233デフォルトの名無しさん:2006/07/14(金) 20:01:34
ポインタまで理解できたのならあとはmanpageでも読めば済むだろ
234デフォルトの名無しさん:2006/07/14(金) 21:37:17
>>230
オレはK&Rを一通りやったあとに
自分でviクローンを作ってみた
その後, Win32とGTK+でGUIをつけたり
2バイト文字対応とか
いろいろ機能を加えたりして
勉強したよ
やっぱり実践が一番じゃない?
235デフォルトの名無しさん:2006/07/14(金) 21:44:29
K&R読んだだけでviクローン作れたら天才だな。
236デフォルトの名無しさん:2006/07/14(金) 23:29:23
void SetPoint(int**,int,int*,int,int,int*,int*,
int*,int*,
int*,int*,int*,int*,BOOL);

void SetPoint(int **num,int cps,int *numB,int way,int uWay,int *movX,int *movY,
int *sotoMaxX,int *sotoMaxY,
int *yobiX,int *yobiY,int *pntX,int *pntY,BOOL bl) {

SetPoint(&num, 3, numB, 0, 3, &movX, &movY,
sotoMaxX, sotoMaxY,
&yobiX, &yobiY, &pntX, &pntY, TRUE);
エラー E2034 D:\MyProg\game2\game7\game7.cpp 325: 'int ( *)[4]' 型は 'int * *' 型に変換できない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )
エラー E2342 D:\MyProg\game2\game7\game7.cpp 325: パラメータ 'num' は int * * 型として定義されているので int ( *)[4] は渡せない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )

ポインタのポインタとか指定したらわけわからんようになってしまいました。
どうすればいいですか?
237デフォルトの名無しさん:2006/07/14(金) 23:33:54
まず引数の意味をひとつづつ説明してもらおうか。
238デフォルトの名無しさん:2006/07/14(金) 23:35:47
>>236
int **pnum;
pnum = #
SetPoint(&pnum, 3, numB, 0, 3, &movX, &movY,
sotoMaxX, sotoMaxY,
&yobiX, &yobiY, &pntX, &pntY, TRUE);
239238:2006/07/14(金) 23:37:36
間違った
×int **pnum;
○int *pnum;
240デフォルトの名無しさん:2006/07/14(金) 23:39:04
キャストしたらどうよ。
241デフォルトの名無しさん:2006/07/14(金) 23:51:54
>>237-240
ありがとうございます。

けど肝心な事言い忘れました。num、numBは配列です。
SetPoint内のnumが多すぎて書き直せない状況なので、
ポインタを利用して打破できないかと思いましたが。
>>238
エラった。よく分かりません。ごめんなさい。
'int ( *)[4]' 型は 'int *' 型に変換できない
>>240
キャストってどうやってですか?
242デフォルトの名無しさん:2006/07/14(金) 23:54:25
まず引数の意味をひとつづつ説明してもらおうか。
243デフォルトの名無しさん:2006/07/14(金) 23:59:18
>>241
> けど肝心な事言い忘れました。num、numBは配列です。

型についてのエラーなのに、変数の型を明記してくれないで何をどうさせようってんだ?
配列です、だけじゃ全然わからん
244デフォルトの名無しさん:2006/07/15(土) 00:07:25
すみません。
static int num[4] , numB[4];
一応int型なんですが、
引数ひとつひとつ説明するより
もう一つダミーの関数を呼び出してみたらこっちはエラー出ませんでした。
void SetPoint2(int **num) {
*num[0] = 0;
return;
}
よく分かりません。すみません。
245238:2006/07/15(土) 00:19:33
>>241
>num、numBは配列です。
それを先に言ってくれ。それなら
int *pnum;
pnum = num;
SetPoint(&pnum, 3, numB, 0, 3, &movX, &movY, ....

念のため聞くけどsotoMaxX, sotoMaxYも配列だよね。あと拡張子cppになってるけど
C のつもりで答えていいの? C++は知らない。
246デフォルトの名無しさん:2006/07/15(土) 00:26:20
>>238
ありがとうございます!
テンパってて諦めかけていました。
そうです。sotoMaxX, sotoMaxYも配列です。
説明不足すみませんでした。
C++の意味は多分ないんでしょうけど、念のためそうしてます。
まだ未熟者で掟破りなコードですみません。
247デフォルトの名無しさん:2006/07/15(土) 02:06:35
>>235
いや, K&Rだけを読んだだけでぱぱっとviクローンを作ったわけじゃなくて
かなり試行錯誤したよ
GUIつけた後, Small Cのインタプリタを組み込んで
今でも改良しながら使ってるよ
248デフォルトの名無しさん:2006/07/15(土) 12:37:57
大変お見苦しいようですが、また質問させて下さい。
>>245さんの通りにやってみたのですが、
関数内で*num[1],[2]を使ったらフリーズしてしまいました。[0],[3]はいいんですが、
はじめに0を代入したはずなのに、しかも[0],[3]の中身は乱れています。
たぶんnumがローカルになっているせいだと思うんですが、
ポインタだだけでなくnum配列自体を関数に受け渡す方法はないでしょうか?
249デフォルトの名無しさん:2006/07/15(土) 12:41:38
あ、それができたら、そのまま配列使えばいいだけか。
スミマセン。
250ひみつの検疫さん:2024/10/19(土) 13:10:16 ID:MarkedRes
汚染を除去しました。
251デフォルトの名無しさん:2006/07/15(土) 15:07:30
>>248
>関数内で*num[1],[2]を使ったら
関数内でのアクセスは *num[1]じゃなく (*num)[1] でしょ。

その関数でint**を使う必要が本当にあるの?
無理して2重ポインタなど使わず設計を見直すことをお勧めする。いやマジで。
252デフォルトの名無しさん:2006/07/15(土) 15:11:32
>>248
本当に見苦しくて読む気にもならん。
まずC FAQ読め。

「6章 配列とポインター」
ttp://www.kouno.jp/home/c_faq/c6.html#0
253デフォルトの名無しさん:2006/07/15(土) 15:50:18


C言語では、二次元配列を関数に渡すことはできません。


254デフォルトの名無しさん:2006/07/15(土) 15:51:55
一次元配列を渡すこともできないぞ。渡せるのはポインタだ。
255デフォルトの名無しさん:2006/07/15(土) 15:54:02
まず引数の意味をひとつづつ説明しろ。
256デフォルトの名無しさん:2006/07/15(土) 15:57:06
Set Point する関数になんで、movX とか movYとかいう
怪しげな引数が必要なのかは、確かにに聞いてみたい気がするな。
257デフォルトの名無しさん:2006/07/15(土) 22:20:17
C言語の命令ばっかりを載せてる単語帳みたいな本又はサイトってありませんか?
できるだけ小さくて薄いので
258デフォルトの名無しさん:2006/07/15(土) 22:37:38
>>257
ないな。作ってもいいが、表紙と裏表紙だけで本文がないがな。
259デフォルトの名無しさん:2006/07/15(土) 22:40:50
>>257
>>1QBB
260デフォルトの名無しさん:2006/07/15(土) 22:47:21
E2040 c:\Borland\Bcc55\include\winnt.h 5417: 宣言が正しく終了していない
と怒られてしまいました。

//sort
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
#include <mmsystem.h>
#define N 10000

こいつのどこかに問題があるか、C以外の問題だと思うのですが、どうすればいいでしょうか。
処理時間を計測しようと悩んでいるのですが・・・。
261デフォルトの名無しさん:2006/07/16(日) 00:27:45
>>260
スレ違い。BCCスレか環境依存OKスレ、初心者スレにでもどうぞ。
262デフォルトの名無しさん:2006/07/16(日) 01:03:08
質問させてください。

char buf[100];
strlen(buf) と、sizeof(buf) って何か違いがあるのですか?
「文字列のバイト数を数えるのにstrlen使うな」と言われたのですが……
263デフォルトの名無しさん:2006/07/16(日) 01:09:16
>>262
strlen()は、ヌル文字で終わっている文字列の長さを調べる関数。
sizeofは、変数や型の大きさを調べる演算子。
sizeof bufはいつでも100だが、strlen()は、中に入っている文字列によって変わる。

どのような開発環境で、どのような文脈でstrlen()を使うなと言われた
のかはわからんが、ヌル文字で終わっている文字列の長さを調べる
のにstrlen()を使うのは、ごく普通のこと。
264デフォルトの名無しさん:2006/07/16(日) 01:22:03
>>262
逆にいうとヌル文字で終わっていない場合は暴走する。
265デフォルトの名無しさん:2006/07/16(日) 02:18:48
strlenはたまに危険なので、暴走しないようにstrnlenというのもある。
ANSIじゃないかもしれないけど……。
266デフォルトの名無しさん:2006/07/16(日) 10:38:51
'\0'を含むマルチバイト文字に使用しようとしているとか
267デフォルトの名無しさん:2006/07/16(日) 10:50:32
'\0'を含むマルチバイト文字なんてあるの?
268デフォルトの名無しさん:2006/07/16(日) 12:29:47
>>267
余裕である。つか、どうやってターミネートすると思ってるんだ?
269268:2006/07/16(日) 12:30:25
うは、誤読。取り消すorz
270262:2006/07/16(日) 12:52:43
みなさんありがとうございます。

実は、char buf[100]中にはバイナリデータが入る場合もある事を
書いていませんでした……
この場合、\0で抜けてしまうstrlen()じゃダメですよね。
おそらくそのミスを指摘されたんだと思います。

でも>>263さんの解説を見ると、sizeof()もダメな気が……
271デフォルトの名無しさん:2006/07/16(日) 13:00:40
>>270
うん、全く駄目。
バイナリデータを扱うときには、そのデータをセットした人(関数)が、
データサイズを戻す必要がある。

普通は関数の戻り値でサイズを戻したり、アウトパラメータで戻したりする。
そうしないと、なにかの関数を呼んでそのバッファにデータがセットされても、
外部から何バイトセットしたのかはわからない。
272デフォルトの名無しさん:2006/07/16(日) 15:53:07
初めまして。現在C言語を勉強しているのですが、malloc関数でつまずいてしまいました。

mainルーチン内でmallocを使う場合は、
int main()
{
273デフォルトの名無しさん:2006/07/16(日) 15:58:11
すいません。上の続きです。

int main()
{
int *x;
x = (int *)malloc(sizeof(int) * 10);

free(x);
}
みたいな感じで使うと思うのですが、メインルーチン内で宣伝したポインタ型変数xを
サブルーチンに渡して、領域を確保する事はできるのでしょうか?

void sub(int *x)
{
x = (int *)malloc(sizeof(int) * 10);
}
このようなサブルーチンを作って、メインルーチンでxに代入するとエラーが出てしまいます。
これの理由と、解決法を教えてください。
よろしくお願いします。
274デフォルトの名無しさん:2006/07/16(日) 16:18:31
int *sub()
{
 return (int *)malloc(sizeof(int) * 10);
}
x = sub();

もしくは

void sub(int **x)
{
 *x = (int *)malloc(sizeof(int) * 10);
}
sub(&x);
275デフォルトの名無しさん:2006/07/16(日) 16:27:04
>>274
おお!出来ました!!
ポインタって難しいですね・・・もっと勉強します!
レスありがとうございましたm(_ _)m
276デフォルトの名無しさん:2006/07/16(日) 17:40:39
>>275
何故そうなるのかちゃんと理解したか?
277デフォルトの名無しさん:2006/07/16(日) 17:58:40
ANSIって何ですか!?
278デフォルトの名無しさん:2006/07/16(日) 19:52:35
ポール・サイモンのギター曲だ、名曲だぞ。
279デフォルトの名無しさん:2006/07/16(日) 20:58:27
>>277
American National Standard Institute
米国規格協会

標準Cは最初にここで規格化されたので、それを指してANSI Cというわけだ。
280デフォルトの名無しさん:2006/07/16(日) 21:04:16
>>279
なるほど。って、何かとアメリカ基準ですな・・・
281デフォルトの名無しさん:2006/07/16(日) 21:45:30
>280
アメリカ製の言語なんで当然では?
282デフォルトの名無しさん:2006/07/16(日) 22:05:16
ISOやJISよりANSIが先に仕様を決めて
それをISOが取り込んだんだから当然
283デフォルトの名無しさん:2006/07/17(月) 04:22:56
すいません。教えてください。
void func(const int *a){ printf("a=%d\n",*a);}
int main(void){
int a=10;
func(a); return 0;
}
のように、呼び出し元のポインタの内容を変えないことを補償するために、
constを付けることはよくやりますよね?
同じことを、ポインタのポインタを引数に持つ関数でやるには、
どうすればいいのでしょう?

const int *a;
int *b;
なa,bに対して、a=b;は、問題なく出来るのですが、
const int **a;
int **b;
に対しては、a=b;は、コンパイラがエラーを吐きます。
const int **a;
が、(const intへのポインタ)へのポインタだから、って理由は分かるのですが、その解決策が分かりません。
よろしくお願いいたします。
284デフォルトの名無しさん:2006/07/17(月) 04:33:54
>>283
const int* const* a; にするとか const int** b にするとか、いくらでもあるんじゃないの?
何がしたいのかわからんのでどれが解決策になるのかわからんが。
285デフォルトの名無しさん:2006/07/17(月) 04:48:15
すいません。具体性に欠けてました。

void func(int (*a)[10]){
/* aは、参照するだけ */
}
int main(void){
int a[10][10];
func(a);
}

これを、
void func(const int (*a)[10]){}
のようにしたいのですが、ANSI-Cでは許してくれないようなのです。
286デフォルトの名無しさん:2006/07/17(月) 05:05:28
>>285
それは難しい問題だったような気がする。
C++ では int const a[][10] で通るみたい。

C だとそもそもポインターの型違いがエラーにならなかったような
覚えがあるんだが、なんてエラーメッセージが出るの?警告?
287285:2006/07/17(月) 05:14:40
gcc-3.4.4だと、
warning: passing arg 1 of `func' from incompatible pointer type
で、警告です。
動作に問題は出ないだろうとは思うのですが、この警告何とか、
出来ませんかね?
288デフォルトの名無しさん:2006/07/17(月) 05:27:54
>void func(int (*a)[10]){
これじゃ関数ポインタだし
289285:2006/07/17(月) 05:34:41
>>288
すいません。意味が分かりません。
aが、関数ポインタって意味ですか?
290デフォルトの名無しさん:2006/07/17(月) 05:37:01
>>288
アホ。

>>287
呼び出し側をcastしてやればwarningは消せるが・・・。

void func(const int (*a)[10]) {}
main() {
func((const int (*)[10])a);
}
291285:2006/07/17(月) 05:51:45
>>290
有難うございます。
確かに、それでWarningは消せるのですが、ポインタのキャストなしでやりたいのです。
というものも、MISRA-Cという組込み世界のコーディング規約のようなものがあるのですが、
その中で、
・ポインタのキャストは駄目
・ポインタ演算は、+1(−1)するもの以外、使っちゃ駄目
・ポインタを引数にする関数で、ポインタが指す元の領域を書き換えないなら、constをつけろ。
というようなルールがあります。
何とか、これに沿ったものを作りたいと思ってます。

ただ、もしかしたら、int(*)[10]から、const int(*)[10]へのキャストは、例外として
認められるのかもしれませんね。
また、調べてみてから、報告したいと思います。

292デフォルトの名無しさん:2006/07/17(月) 06:27:16
キャスト無しって・・・・・プロトタイプ宣言もしないアホウですか?
293285:2006/07/17(月) 06:36:57
>>292
???
ポインタのキャストとプロトタイプ宣言が関係ありますか?
それとも例に挙げたコードが、プロトタイプ宣言していないから、
アホウ呼ばわりされてるんですかね?

>>290
MISRA-C対応のあるソースコードの静的解析ツールにかけたところ、
やっぱり駄目でした。2次元配列をあきらめた方がいいのかな。。。
294デフォルトの名無しさん:2006/07/17(月) 09:17:53
>>285
よくわからないときにはtypedefするが吉。
typedef int hoge[10];

void func(const hoge *a);

int main(void){
  int a[10][10];
  func(a);
}
295デフォルトの名無しさん:2006/07/17(月) 10:04:59
>>294
同じwarningです。gcc3.4.2(MinGW) Cモード(gcc.exe)
C:\Documents and Settings\****\My Documents\MinGW\Learn5\intconst2.c: In function `main':
C:\Documents and Settings\****\My Documents\MinGW\Learn5\intconst2.c:11: warning: passing arg 1 of `func' from incompatible pointer type

結局Cでは警告を防げないのか。
296デフォルトの名無しさん:2006/07/17(月) 10:08:23
typedef const int boke[10];
297デフォルトの名無しさん:2006/07/17(月) 10:45:10
int (*a)[] から const int (*a)[] への(キャスト無しでの)変換は
ansi規格で認められていない。」と言うのがgcc の中の人の考えらしいです。

ttp://gcc.gnu.org/bugzilla/show_bug.cgi?id=9070

gccの警告を無視するってのは駄目ですか?
・・・駄目でしょうね(^^;
298デフォルトの名無しさん:2006/07/17(月) 10:51:31
>>297
俺個人の意見だけど、理由がわかっていて危険ではない事も調査済みなら
ワーニングを放置するのはありだと思うが、素直にキャストしたほうが
無駄にエネルギー使わなくてすっきりすると思う。
299272:2006/07/17(月) 13:02:57
>>275
レス遅れてすいません。
動いたけど、理解は出来なかったのでいろいろ試行錯誤してたいだい理解したので、
今度は、ポインタのポインタ(2次元配列もどき)の領域を確保しようと試みているのですが、
はやり、理解が浅いせいかうまくできません。

void sub(int ***x)
{
int i, j;
 *x = (int **)malloc(sizeof(int) * 10);
for(i=0;i<10;i++)
*x[i] = (int *)malloc(sizeof(int) * 3);

for (i=0;i<10;i++) {
for(j=0;j<3;j++) {
*x[i][j] = i*j;
}
}
}

int main()
{
int **x;

sub(&x);

// 表示処理x[][];
}

今の自分の知識では上のような感じなんですが、エラーがでてしまいます。
よろしくお願いしますm(_ _)m
300デフォルトの名無しさん:2006/07/17(月) 13:08:39
>>299
たぶんこうだと思う。
void sub(int ***x)
{
  int i, j;
  int y = 10, x = 3;
  *x = (int **)malloc(sizeof (int*) * y);
  for(i=0;i<10;i++)
    (*x)[i] = (int *)malloc(sizeof (int) * x);

  for (i=0;i<y;i++) {
    for(j=0;j<x;j++) {
      (*x)[i][j] = i*j;
    }
  }
}
301デフォルトの名無しさん:2006/07/17(月) 13:13:36
>>300
おいおい「たぶん」で書かないでくれよ。
必死こいてテストコード書いてたんだからさOTL
合ってるんだけどね。

今回は*と[]の優先順位の問題だね。
302デフォルトの名無しさん:2006/07/17(月) 13:16:25
>>299
>>1
> エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
303299:2006/07/17(月) 13:21:15
>>300-301
ありがとうございますm(_ _)m
仰る通り優先順位の問題だったみたいです。
初歩的な所からやり直さないとだめみたいですね・・
それにしても、この住人の方々は凄いです
自分はこのプログラムで数時間悩んだというのに、数分で解決してしまうなんて。
尊敬しますm(_ _)m

>>302
すいません。以後気を付けます。
今回のは、OSのエラー?(問題が発生したため〜)だったのでエラーと書いただけで省いてしまいました。
304デフォルトの名無しさん:2006/07/17(月) 13:25:44
>>297
C99 の規格読んだが gcc の解釈は正しい。もしくは規格の規定が悪い。

gcc 使えるんなら C++ でコンパイルしちゃえばいいんじゃないかな?
305285:2006/07/17(月) 13:45:23
みなさん、有難うございます。
MISRA-Cも、明確な理由をつけることによる、ルールの逸脱は
認めているので、
「int (*a)[] から const int (*a)[] への(キャスト無しでの)変換は
ansi規格で認められていない。」
という理由により、キャスト(もしくはWarningを無視)で、
大丈夫だと思います。
もしかして、私が知らないだけで、何らかの手があるかもと思い、
質問させて頂きました。
有難うございました。
306デフォルトの名無しさん:2006/07/17(月) 20:22:24
微妙にスレ違いかもしれませんが…
gccのエラーメッセージの日本語化をしたいのですが、
出力されたエラーメッセージから日本語に変換するためには
どうすれば良いのでしょうか。

お願いします。
307デフォルトの名無しさん:2006/07/17(月) 20:32:04
>>306
環境変数LANGなど。詳しくはgccのスレで聞け。
308デフォルトの名無しさん:2006/07/17(月) 20:40:32
>>306
http://gcc.gnu.org/svn/gcc/trunk/gcc/po/ja.po
↑こいつをどんどん翻訳してくれればいいんだ。期待してるぞ。
309デフォルトの名無しさん:2006/07/17(月) 22:14:32
タブのつもりですか?
310デフォルトの名無しさん:2006/07/18(火) 21:13:11
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2392.txt
実行後に標準入力からコマンドを入力し、そのコマンドをgetcl関数でスペース毎に
argmv[0],argmv[1]...に格納し、exec_one_command関数で実行。
その中にパイプがあればパイプの処理をするという仕様です。
自分でやったところはexec_one_command内でgetclでできたコマンドからパイプを
見つけてそれをNULLに置き換え、パイプの数に応じてexecvpで実行していくという
ところです。 実行してもパイプの処理になった場合にエラー終了してしまいます。
どのようにすれば繋いでいくことができるのでしょうか?

他のスレ回ったのですが、スレ違いっぽい内容だったのでお願いします。
311デフォルトの名無しさん:2006/07/18(火) 21:31:56
linuxのソースで見かけたコードなんだが、

struct hoge {
 ・・・
 void *foo[0],
}

で、malloc(kmalloc)するときに sizeof(struct hoge) + foosize分をallocateして
サイズを自由に変動させるような実装がある。(メンバfooにfoosize分の領域が割り当たる)
こういうのはANSIで認められてる?
それともGCC拡張?
312デフォルトの名無しさん:2006/07/18(火) 21:34:47
>>311
C99で導入された。
でも元はgcc独自拡張だったような気がしなくも無い。
313デフォルトの名無しさん:2006/07/18(火) 21:41:41
>311
昔のDOSでもあったというかやってた。でもvoid *foo[0]じゃなくchar *foo[1]だったな。
これで(可変長の)文字列の長さ分を足したサイズをアロケートすると'\0'の分も確保される。
314デフォルトの名無しさん:2006/07/18(火) 21:43:03
315デフォルトの名無しさん:2006/07/18(火) 21:46:03
>>311
これが出来るのは2つ以上のメンバを持っていて、
なおかつ最後のやつだけ。
hogeは配列には出来ない制限がある。
316デフォルトの名無しさん:2006/07/18(火) 21:55:49
>>312-315
d

ちなみに、この場合メンバfooの型は何になる?
void *型?
317デフォルトの名無しさん:2006/07/18(火) 22:40:14
>>310
あのさあ、C/C++系のスレは巡回してる人がかなり重複してるから、
スレ変えても今のままだと回答来ないよ。
知りたいことを最小限のコードで書いてみて疑問点を質問するとか。
「全く分かりません」であるなら却下。
318デフォルトの名無しさん:2006/07/18(火) 22:40:56
間違いを教えて下さい!!
アルファベット文字からなる文字列(31文字以内)を入力すると
全部大文字にして出力させる。
[例]入力 AbcDeFGHijk → 出力 ABCDEFGHIJK

#include<stdio.h>
main()
{
char moji[31];
int i=0, n=0, m=0;
scanf("%30s", moji);
while(moji[n]!='\0'){
if('a'<=moji[i] && moji[i]<='z'){
m=moji[i]-32;
}
else{m=moji[i];}m++;
i++;}
putchar(m);
}
319デフォルトの名無しさん:2006/07/18(火) 22:46:36
突っ込みどころが多くて何とも・・・。

・ n はどこから来てどこへ行くのか
・ putchar が while の外に
・ m++ って?
320デフォルトの名無しさん:2006/07/18(火) 22:46:55
#include<stdio.h>
main()
{
 char moji[31];
 int i=0, n=0, m=0;
 scanf("%30s", moji);
 while(moji[n]!='\0'){
  if('a'<=moji[i] && moji[i]<='z'){
/*  m=moji[i]-32; */
  m=moji[i]-'a'+'A';
  }
  else{
   m=moji[i];
  }
  putchar(m);
/* m++; */
  i++;
 }
/* putchar(m); */
}
321310:2006/07/18(火) 22:48:39
>>317
for(i=0;i<cmdnum;i++){
if ((pid = fork()) == 0){
if(n-->1){
pipe(fd);
close(1);
dup(fd[1]);
close(fd[1]);
close(fd[0]);
}
if(i>0){
close(0);
dup(fd[0]);
close(fd[0]);
close(fd[1]);
}
if (execvp(argmv[pl[i]], argmv) == ERR) {
perror("execvp");
exit(1);
}
} else if (pid >= 1) {
wait(&status);
} else {
perror("fork");
exit(1);
}
}

具体的にはこの部分なのですが、cmdnumはパイプで区切られたコマンドの数で、plにはパイプの
場所が格納されています。このまま実行すると2つ目以降のコマンドが繋がらなくてエラーが起こって
しまうのですが、closeやdupなどのところでおかしいところなどが見つかりましたらお願いします。
322デフォルトの名無しさん:2006/07/18(火) 22:49:08
すいません!!
一応通るんですけど、
イマイチわからないんです……。
323デフォルトの名無しさん:2006/07/18(火) 22:49:13
>>320
whileのmoji[n]をmoji[i]に。
324デフォルトの名無しさん:2006/07/18(火) 22:50:18
>>321
アホ。
最小限のコードというのは「抜き出したコード」じゃなくて、コンパイル・実行
可能なコードのことを言うのだ。
325デフォルトの名無しさん:2006/07/18(火) 22:53:03
>>321
例えば一つ目のコマンドがlsで、二つ目のコマンドがgrepなどと決めうちして
コードを書いてみて、どこでどのようなエラーになるのか質問しろ。
326デフォルトの名無しさん:2006/07/18(火) 23:06:42
ありがとうございます!!
ちゃんと出力されました☆
327デフォルトの名無しさん:2006/07/18(火) 23:32:18
つーか、pipe()はスレ違い。
#あ、close(), dup()もそうか。
328324とか:2006/07/18(火) 23:34:32
>>327
そういやそうだ。
すまん。
329310:2006/07/18(火) 23:37:26
>>325
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2393.txt
コマンドは a.exe ls | grep a | cat で固定です。
a: ls; No such file or directory
というエラーを出して終わってしまいます。
330324とか:2006/07/18(火) 23:41:32
>>329
続きはUnixプログラミングスレで。
少なくともexecが成功するコードで質問してね。
331デフォルトの名無しさん:2006/07/19(水) 00:00:11
某書の覆面算をするプログラムを丸写しした(はず)なのですが、
SEND+MORE=MONEYで解が1つはあるはずなのに解なしになってしまいます。
ちょっと点検していただけませんでしょうか?
あと、このプログラムが一体何をしているのか、解説していただけたら嬉しいです。
よろしくお願いします・・・

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

enum {FALSE, TRUE};

#define N 10
int imax,jmax,solution,word[N][128],digit[256],low[256],ok[10];

void found(void)
{
int i,j,c;
printf("\n解 %d\n",++solution);
for(i=0; i<=imax; i++)
{
for (j=jmax; j>=0; j--){
c=word[i][j];
if (c!='\0') printf("%d",digit[c]);
else printf(" ");
}
printf("\n");
}
}
332デフォルトの名無しさん:2006/07/19(水) 00:03:10
丸写ししたんなら宿題スレにまるごと貼ればいいのに、とおもう
333310:2006/07/19(水) 00:05:07
あ、パイプ以前の問題が見つかったので聞きたいのですが、
execvpなどで配列の最初からではなく、途中からそれ以降を実行するような
ことは可能なのでしょうか?
334デフォルトの名無しさん:2006/07/19(水) 00:09:47
>>333
あのねぇ、UNIXプログラミングスレでも相手してもらえなくなるよ。
素直にいけよ、糞ガキ
335デフォルトの名無しさん:2006/07/19(水) 01:09:27
文字列配列を関数の引数に引き渡す方法を教えて管足。お願いします。
336デフォルトの名無しさん:2006/07/19(水) 01:11:41
>>335
それぐらい自分で書け。それでわかんなかったらコードを添えて相談しろ。
337デフォルトの名無しさん:2006/07/19(水) 01:19:12
できるだけ短くまとめようと思ったんですが、
BOOL LoadEveFile(char *strFile , char **mainCode) {

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
LPSTR mainCode[256];
LPSTR *pMainCode;
pMainCode = mainCode;
LoadEveFile("map.txt" , pMainCode);
:
pMainCodeを渡すとmainCode自体は引き渡せないので困っています。お願いします。
338デフォルトの名無しさん:2006/07/19(水) 01:23:42
>>337
char* xxx[256];
xxx[0] = mainCode[0];
...
LoadEveFile("map.txt", xxx);
339デフォルトの名無しさん:2006/07/19(水) 11:16:30
#include <stdio.h>

int c;
int T(int n){
int i,tmp=0;

if(n==0)
return 0;
else{
for(i=0; i<n; i++)
tmp += T(i);
return (tmp*2/n + c*n);
}
}

int main(void){
int n;
do{
printf("c = ");
scanf("%d", &c);
}while(c<=0);

do{
printf("n = ");
scanf("%d", &n);
}while(n<0);
printf("T(n) = %d\n", T(n));

return 0;
}
というプログラムで、c=1と入力し、nに100以上の数字を入力すると、
処理にものすごく時間がかかってしまうのですが、短い時間で処理できるようにするにはどうすればいいですか?
340デフォルトの名無しさん:2006/07/19(水) 11:24:18
T(n) = {T(0) + T(1) + T(2) + ... + T(n-1)} * 2 / n + c * n
を解くんだな。

T(0), T(1), ... をいちいち再帰で求めないで、配列に入れていけば速くなる。

あと、数学的に解いて公式もとめて突っ込めばもっと速くなる。
341デフォルトの名無しさん:2006/07/19(水) 11:39:03
>>340
なるほど。ありです。
342337:2006/07/19(水) 12:33:19
>>338
dクスです(´∀`)
343デフォルトの名無しさん:2006/07/19(水) 13:52:51
int n;
struct *a;
a = malloc( );

ここで、a に n だけ割り当てたいのですが、どのようにすればいいのでしょうか?
カッコの中身をいろいろ試してもうまくいかないので。(sizeof(struct)*n) など・・・
344デフォルトの名無しさん:2006/07/19(水) 13:53:44
はじめて書き込みします。
C言語でUnixTimeを日付時刻に変換するような関数があると聞き、dateaddという関数を見つけたのですが使い方がよくわかりません。

 戻り値 = dataadd(第1パラ , 第2パラ , 第3パラ);

という書式らしいのです。
VBでの記述は多々みつかるのですが、Cでかかれたものが見つからなくて。。

なにか手がかりでもよろしいので、お力をお貸しください。
お願いします。
345デフォルトの名無しさん:2006/07/19(水) 13:58:29
ごめんなさい。
つづり間違えました。
 dateadd です。
346デフォルトの名無しさん:2006/07/19(水) 14:02:01
347デフォルトの名無しさん:2006/07/19(水) 14:03:55
346さま、ありがとうございます。
やってみます。
助かりました。
348デフォルトの名無しさん:2006/07/19(水) 14:08:43
>>343
struct *a;って何ですか?
> struct hoge *a;
> a = malloc(sizeof *a * n);

>> 344
Unixにはdateaddなんていう関数はない。それはWin限定で使えるAPI
locatetimeとtm構造体を調べてみろ
349343:2006/07/19(水) 14:40:27
>>348
配列を構造体で定義したものです。

たとえば、
struct char* hoge;
a[0].hoge = "ABC";
a[1].hoge = "abc";
と言った感じに代入は行われるみたいです。
350デフォルトの名無しさん:2006/07/19(水) 15:29:09
343: struct *a;

348: struct *a;って何ですか?
348: > struct hoge *a;

343: 配列を構造体で定義したものです。

軽くイラッと来た。
351343:2006/07/19(水) 15:35:48
typedef struct {
char* key;
} elementtype;

#define MAX 1000
elemenntype b[MAX];

a と異なる配列はこのように定義されているのですが、私の説明は間違っているのでしょうか?
352デフォルトの名無しさん:2006/07/19(水) 15:38:02
>>351
>>349の様な文法はCにはない。
353デフォルトの名無しさん:2006/07/19(水) 15:38:45
>>351
a とhogeはどこへ言ったんだよ。
354デフォルトの名無しさん:2006/07/19(水) 15:39:44
断片的に書かれても、わけ分からん。
355デフォルトの名無しさん:2006/07/19(水) 15:43:14
>>354
>>343が一番わかってないから無問題
356デフォルトの名無しさん:2006/07/19(水) 16:20:15
絶望的にプログラミングに向いてないやつって、いるよね
357デフォルトの名無しさん:2006/07/19(水) 16:21:35
Hello,C Worldからいきなり構造体へ飛んだみたいな人だな
358デフォルトの名無しさん:2006/07/19(水) 16:27:10
やりたいことはなんとなくわかるが、理解させる自信がない
359351:2006/07/19(水) 16:50:11
問題は構造体じゃないんです。mallocなんです!

#define N 10000
struct a[N];
とすると、作業領域を10000だけ確保しているわけですが、これを動的にmallocを用いて確保したいんです。
360デフォルトの名無しさん:2006/07/19(水) 16:55:32
いいからお前はまず、構造体の配列を使ったプログラムをコンパイル成功させろ
コンパイル成功したらそのソースをここでさらせ
361デフォルトの名無しさん:2006/07/19(水) 18:12:49
>#define N 10000
>struct a[N];

コンパイルして見ろよ、これ。
362デフォルトの名無しさん:2006/07/20(木) 10:02:35
ファイルが作成された日時を取得する方法を教えてけろ。
linux なら ls -l で表示される情報
DOS なら  dir で表示される情報
です。よろぴく。

363デフォルトの名無しさん:2006/07/20(木) 10:06:34
きっと脳内言語だからコンパイラは無いんだよ
364デフォルトの名無しさん:2006/07/20(木) 10:53:52
>>362
stat(2)
365デフォルトの名無しさん:2006/07/20(木) 10:56:54
>364
Thank you.
366デフォルトの名無しさん:2006/07/20(木) 16:19:18
すみません教えてください
授業の問題なのですが、

問_整数 a,b を直角三角形の直角を挟む2辺とするとき、a,bを入力したとき、斜辺の長さと面積を表示せよ。

#include <stdio.h>
#include <math.h>
void main(void)
{
int a,b;
double c;
printf("2辺の値を入力する。\n");scanf("%d,%d",&a,&b);
c=a*a+b*b;
c=sqrt(c);
printf("三角形の斜辺の長さは %lf 面積は %f です。\n",c,(float)(1.0*a*b/2));
}

最後の行の、(float)(1.0*a*b/2));の意味が分からないんです。
教えてくださいm(__)m



367デフォルトの名無しさん:2006/07/20(木) 16:39:06
演算した結果をfloat型にcastしているだけだが、casrする理由は知らない
%fは別にdouble型で出力可能だし演算結果はdouble型になるんで冗長なcastだな
368デフォルトの名無しさん:2006/07/20(木) 16:55:42
>>367
レスありがとうございます
もうちょっとだけお願いします><
(1.0*a*b/2)ってどうすれば思い付くんでしょうか。特に1.0が気になります
すごく初歩的な質問ですみません
369デフォルトの名無しさん:2006/07/20(木) 17:25:11
>>368
式に一つでもdouble型がある場合、double型になることを利用しただけ
# 正確な式の型の繰り上げ規則は調べてくれ

a*b/2だとint型になってしまう為、小数点以下が切り捨てられてしまうから
1.0というdouble型の数値を入れることによって結果をdouble型にしたんだろう
でも、a*b/2..0の方が綺麗だと個人的には思うけどな
370デフォルトの名無しさん:2006/07/20(木) 17:37:44
>>369
分かりました!
ありがとうございますm(__)m
371デフォルトの名無しさん:2006/07/20(木) 22:39:17
>369
a*b/2.0 と 1.0*a*b/2 は a*b が int の範囲に収まらない場合、挙動が違うんじゃね?
372デフォルトの名無しさん:2006/07/21(金) 01:08:53
floatにキャストしたり%lfなんてやってたら、おれ絶対先生に突っ込んじゃうだろうなあ・・・
上げ足取りなのかもしれんけど
373デフォルトの名無しさん:2006/07/21(金) 12:31:11
>>371
前者はintで掛け算が行なわれるから結果が異なるね。
まぁ、(double) a * b / 2でいいとも思うが。
374デフォルトの名無しさん:2006/07/21(金) 15:37:56
「&配列名」は、「配列名」や「&配列名[0]」と同様に配列の先頭アドレスが
取れるようですが、これはANSI Cで認められているのでしょうか?
375デフォルトの名無しさん:2006/07/21(金) 16:05:51
>>374
型が違う。
int a[10];とあったとき、
aや&a[0]と言った式ではint*型の値になるが、
&aではint (*)[10]型の値になる。
376デフォルトの名無しさん:2006/07/21(金) 16:17:01
>>375
そんなこと誰も聞いてませんが
377デフォルトの名無しさん:2006/07/21(金) 16:30:42
>>375
分かったかヴォケ
378374:2006/07/21(金) 16:46:53
>>375
なるほど、そういう違いがあるんですね。ありがとうございます。
で(^^;)、ソースコードの汎用性を考えた場合、
char a[10], b[10];
memmove(&b,&a,10); //aをbにコピー

memmove(b,a,10);
に変えておいた方がいいのかどうか、が気になっております。
379デフォルトの名無しさん:2006/07/21(金) 16:54:30
>>378
好きなようにしたらええがな。
380デフォルトの名無しさん:2006/07/21(金) 16:56:55
自分的には変更の可能性がある場合&を付ける
変更の可能性が無い場合は付けないと区別している

あくまで個人の趣味であり、押しつけるつもりはない
381デフォルトの名無しさん:2006/07/21(金) 17:08:13
>>380
ちょwwwおまwwww
382デフォルトの名無しさん:2006/07/21(金) 17:15:56
>>375
a の型はまぎれも無く int [10] だぞ。
int* に暗黙にキャストできるというだけであって。
sizeof a とか考えてみそ。
383デフォルトの名無しさん:2006/07/21(金) 17:38:27
setvbufでバッファがセットされるとき、それ以前に使われていたバッファはどうなるんですか?
384デフォルトの名無しさん:2006/07/21(金) 17:39:58
>>383
天国に上ります。
385デフォルトの名無しさん:2006/07/21(金) 17:45:00
>>383
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/setvbuf.3.html

> setvbuf() 関数は、ストリームをオープンした後、そのストリームに対して何らかの操作をする前にのみ使用できる。
> setvbuf() 関数は、ストリームをオープンした後、そのストリームに対して何らかの操作をする前にのみ使用できる。
> setvbuf() 関数は、ストリームをオープンした後、そのストリームに対して何らかの操作をする前にのみ使用できる。
386デフォルトの名無しさん:2006/07/21(金) 17:45:24
>>385
把握した。
387デフォルトの名無しさん:2006/07/21(金) 18:59:30
>>375
ま、とりあえずこのあたりを読んでみるべし
http://www.kouno.jp/home/c_faq/c6.html#4
388デフォルトの名無しさん:2006/07/21(金) 19:38:13
ちょっとした知識を披露したかったんだろうが、とんでもない無知をさらけだした例。
389デフォルトの名無しさん:2006/07/22(土) 08:19:01
if(!isdigit(atoi(smb)))
これchar型のsmbに数値が入っていて、それをintに変換、10進でなかったら実行ってことですよね。
atoiで数値にできるのに実行してしまうんですが、何でですか?
お願いします。
390デフォルトの名無しさん:2006/07/22(土) 08:33:17
あ、もしかして0は!の対象じゃないってことか
391デフォルトの名無しさん:2006/07/22(土) 08:37:27
あ、でも違うな。誰か教えてください。
392デフォルトの名無しさん:2006/07/22(土) 08:42:28
文字列smbで表される数値が'0'〜'9'か調べてる
393デフォルトの名無しさん:2006/07/22(土) 08:58:58
>>392
char smb[] = "1";
printf("%s\n" , smb);
仮置きしてみたんですが、これじゃ駄目みたいです。
c = getchar( );
で直接入力したらうまくいきました。
if (isupper(c)) /* 英大文字なら */
printf("英大文字です。");

else if (islower(c)) /* 英小文字なら */
printf("英小文字です。");

else if (isdigit(c)) /* 数字なら */
printf("数字です。");

else if (isspace(c)) /* スペースなら */
printf("スペースです。");

else /* 上記のいずれでもなかったら */
printf("何かわかりません");
これを使って検証したんですが、ためしにcに数値を入れたら、elseのケースになってしまいます。
何か重大なミスしてる悪寒。
394デフォルトの名無しさん:2006/07/22(土) 09:08:01
'1'と1は違う
395デフォルトの名無しさん:2006/07/22(土) 09:16:29
>>394
ありがとうございます。
ああ、そうか。
ってことは前述のコードはatoiに文字列渡したのがまずかったわけか。
396デフォルトの名無しさん:2006/07/22(土) 09:19:59
>>389
isdigit()の引き数は文字、atoi()の戻り値は数値、全く噛み合っていない。
>392は釣りかネタ。
397デフォルトの名無しさん:2006/07/22(土) 09:22:17
atoi()の引き数は文字列。
398デフォルトの名無しさん:2006/07/22(土) 09:25:07
>>397
ああ、そうだった。
今気づいて戻ってきました。
つまりいらないわけですね。
すみません。
399デフォルトの名無しさん:2006/07/22(土) 09:53:09
>>398
bool evalAtoi(long * val, const char * buf)
{
if (val == NULL && buf == NULL) return false;
char * end;
* val = strtol(buf, & end, 0);
return * end == '\0';
}
400デフォルトの名無しさん:2006/07/22(土) 09:57:11
文字コードがASCIIなら
smb="48"から"57"で
isdigit(atoi(smb))は真になる
48が文字'0'で57が文字'9'な
401デフォルトの名無しさん:2006/07/22(土) 09:59:33
と思ったけどsmbがchar型とか言ってる時点でなんか全然違うことを考えてるな
エスパースキル足りなかった
402デフォルトの名無しさん:2006/07/22(土) 10:18:28
>>399
&&じゃなくて||な
403デフォルトの名無しさん:2006/07/22(土) 11:36:10
ファイルサイズを正確に調べたいのですが、
lseekでファイルの末端までいってftellで取ってきた値が
そのままファイルサイズになっちゃったりしますか?

ほかにもっといい方法があればご教授お願いしたりします。
404デフォルトの名無しさん:2006/07/22(土) 11:44:44
>>403
ファイルシステムとかに思いっきり依存するので、C言語固有の
方法はない。例えば>>403の方法ではintとかunsignedの大きさに
制限されてしまう。
405デフォルトの名無しさん:2006/07/22(土) 11:54:41
>>404
どういう意味なの?
ftellで返ってくる値が1バイトとは限らないって意味なのなの?

freadで読み込んでいけば確実でせうか?
406デフォルトの名無しさん:2006/07/22(土) 11:55:56
>>405
時間が掛かるけど、バイナリモードで開いてfget()当たりで1バイトずつ
カウントしていけばいいかもしれんね。

>>404は、C言語固有の方法を使うよりも、OSのAPIを使った方がいいと
いう事。
407デフォルトの名無しさん:2006/07/22(土) 11:56:18
×fget()
○fgetc()
408デフォルトの名無しさん:2006/07/22(土) 12:00:07
例えばさ、ftell()の戻り型は、longじゃん。

もし、ファイルシステムで表せるファイルの大きさがlongで表せる大きさを
超えていたらどうなる?ftell()じゃあ正確に調べられないだろ。

身近な例ではNTFSとかな。
409デフォルトの名無しさん:2006/07/22(土) 12:03:16
stat()の類でわかるけど
標準Cではないって事
410405:2006/07/22(土) 12:09:52
なるほどです。勉強になりました。
とりあえずバイナリモードで開いて実際に読み込んでサイズ見ていきます。
でもgetcでみなきゃだめですか?
freadで1024バイト単位ぐらいで読み込んでいきたいんですが・・・
411デフォルトの名無しさん:2006/07/22(土) 12:12:37
>>410
そこら辺は任せる。要するにカウンタがオーバーフローしないで
調べられればそれでいい。
412405:2006/07/22(土) 12:34:59
>>411
うぃっす。了解です。ありがとうございました。
413デフォルトの名無しさん:2006/07/22(土) 13:28:26
z=100;
x = (char *)malloc(sizeof(char)*z);

この時にポインタxからzの数値を求める方法ってありますか?
sizeofでいけると思ってたのに無理でした。
414デフォルトの名無しさん:2006/07/22(土) 13:29:08
_
415デフォルトの名無しさん:2006/07/22(土) 13:34:21
>>414
無理ですか。サンクス!
416デフォルトの名無しさん:2006/07/22(土) 13:40:14
構造体を使うといいかも
struct {
int size;
char *buf;
} x;
x.size=100;
x.buf=malloc(sizeof(char)*x.size);
417デフォルトの名無しさん:2006/07/22(土) 13:56:17
>>416
あーなるほど。

でも残念な事にやろうとしてたのが、xを関数に渡して
関数内でデータをあれこれするのにどれだけメモリ確保したか
知りたかったんですよ。
大人しくzを引数で渡した方が簡単そうですね。
418デフォルトの名無しさん:2006/07/22(土) 14:07:20
だから引数で構造体をやりとりしろよw
419デフォルトの名無しさん:2006/07/22(土) 14:53:05
>>409
stat()って一般的に64ビットイントになってたっけ?
そうでないならfseek()+ftell()でも同じようなものかもしらん。
いずれにしても、標準Cでは手段がないことには同意。
fgetc()で終わるまで読もうと思ったら実はキャラクタデバイスで、
いつまで経っても終わらなかったりするかもしらんし。
420デフォルトの名無しさん:2006/07/22(土) 15:07:28
型 off_t を使う。これは 32 ビットアーキテクチャ上では 32 ビット符号付き型である。ただし、

#define _FILE_OFFSET_BITS 64


を定義してコンパイルした場合は 64 ビット符号付き型である。
421デフォルトの名無しさん:2006/07/22(土) 15:54:02
Windowsなら_stat64とか_lseek64とか
422デフォルトの名無しさん:2006/07/23(日) 00:28:48
ソースを複数に分けてプログラムを書くときは、グローバル変数を使うと、
引数などをいちいち書く必要が無くなるし、見やすいような気がするのですが、
グローバル変数はあまり使わない方が良いんですか?
ローカル・グローバル変数のメリット、デメリットなどあれば教えてください。
423デフォルトの名無しさん:2006/07/23(日) 00:31:26
その釣りツマンネ
424デフォルトの名無しさん:2006/07/23(日) 00:51:20
>>422

425デフォルトの名無しさん:2006/07/23(日) 01:22:32
ポインタが理解できたら急にCが面白くなった
426デフォルトの名無しさん:2006/07/23(日) 02:42:24
>>403-421
標準Cスレなのにここまで誰もfpos_tに触れていない件について
427デフォルトの名無しさん:2006/07/23(日) 04:44:28
fpos_t自体が実装依存で
中身が何であるか(整数なのか構造体なのか)全く規定されていない上
fgetposとfsetposでの使用しか保証されていないから。
428デフォルトの名無しさん:2006/07/23(日) 12:19:19
fseekのI/Fが悪いって事で
せめてsize_tで移動できたらよかったのに
429デフォルトの名無しさん:2006/07/23(日) 12:19:59
あ、それじゃ戻れないか
ssize_tとかで
430デフォルトの名無しさん:2006/07/23(日) 16:41:30
質問させてください。
20あるデータのうち0.3の割合で1、0.5の割合で2、0.2の割合で3を含んだデータを生成したいのですが、うまい表し方が思いつきません。
思いついた方法は
・1を6つ、2を10つ、3を4つと普通に配列にデータを代入する
・0〜1のランダムな値を出し、ランダムな値が
 0 <= random < 0.3 なら1
 0.3 <= random < 0.8 なら2
 0.8 <= random < 1 なら3
 を配列に代入する
という方法なのですが、どちらもいまいちぱっとしない気がします。どなたかうまい表現方法、あるいは確率分布データを生成する正統派な方法等ご存知の方ご教授願います。
431デフォルトの名無しさん:2006/07/23(日) 17:10:26
1、2、3のデータを割合分だけ作ってその他のデータとランダムに混ぜるくらいしか思いつかん
432デフォルトの名無しさん:2006/07/23(日) 19:58:26
>>430
2つ目の方法だと、たまにしか割合がきっちり 3:5:2 にならないが、それでもいいの?
いまいちどんなデータを作りたいかが分からん
433430:2006/07/24(月) 00:17:00
>>431,432 わかりにくい説明に付き合っていただきありがとうございます。
統計で使うデータを作りたいと思いまして、かんたんなサンプルデータとして、3:5:2でそれぞれの値を含んだデータをプログラムに作成させようというものです。それでc言語で確率を用いてデータ処理をしている例がみつからなかったので質問させていただきました。
434デフォルトの名無しさん:2006/07/24(月) 00:20:14
>>430
十分に要件を満たしうる方法について、「いまいち」とか「ぱっとしない」なんて答えしか出せないなら、
どんな方法を出してもそんなこと言われそうで答える気がしなくなる。
435デフォルトの名無しさん:2006/07/24(月) 01:36:00
>>433
なにが障害になってるのか、やっぱり分からない。
それでいいじゃんっていう気がする。

もしかして、値・発生確率・項目数などを自由に変えられるような
汎用性のある関数を書きたいということ?
436デフォルトの名無しさん:2006/07/24(月) 01:48:17
>>430
1つ目の方法と2つ目の方法じゃ得られるデータの性質が明らかに違うやん

20個のデータの中に必ず、1が6個、2が10個、3が4個、現れるようにしなければならないの?
そういうシャッフルをしたいならたくさんやり方あるね

てか、統計ってそういうもんじゃないよね・・・
437デフォルトの名無しさん:2006/07/24(月) 01:50:41
>>430
「どちらもいまいち」って事は、それ別々の方法として例示してるんだよね?
前者の方法は、何より「10つ」が気になる…のは置いといても、
ランダムでなければそれでいいんじゃないか?

後者の方法は>>432も指摘しているように、3:5:2にはならん。
「いまいちぱっとしない」以前の問題。
438デフォルトの名無しさん:2006/07/24(月) 12:27:18
う〜ん、どれもいまいちぱっとしないなあ〜
439430:2006/07/25(火) 03:36:22
>>434-437
皆様、鋭い指摘ありがとうございます。
たしかに後者の方法は常に同じ割合にならないのですが、前者に比べると作為的でないというかなんというか説明しにくいですがそんな理由で考えました。
3:5:2という割合になるようにしたいのでやっぱり前者が適していると思うのですが、なんか作為的な感じがして…
これ以上はアルゴリズムの話題になりそうなのでやめますね。皆様おつきあいありがとうございました。
440デフォルトの名無しさん:2006/07/25(火) 07:21:26
超基本的なDQN質問です。以下のようなコードがあったとして、
data[0] にアクセスするのは安全なのでしょうか? 要点は
*a は自動変数で消滅してしまうけど、*a の指しているアドレスにある
"nullpo" という文字列はいつまでも残っていますか? という感じです。
それとも、*a も malloc してあげないとダメなのでしょうか?
ちなみに以下では malloc は失敗しないものとして解釈してください。

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

int main(void) {
 char **data = NULL;

 data = set_data(data);

 puts( data[0] );
 return(0);
}

char **set_data(char **p) {
 char *a = "nullpo";
 char *b = "damepo";

 (char **)p = malloc( 3 * sizeof(char *));
 *p[0] = *a;
 *p[1] = *b;
 *p[2] = NULL;

 return(p);
}
441デフォルトの名無しさん:2006/07/25(火) 07:25:32
うわ、なんだこれ。少しミスりました。以下でお願いします。

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

int main(void) {
 char **data = NULL;

 data = set_data(data);

 puts( data[0] );
 return(0);
}

char **set_data(char **p) {
 char *a = "nullpo";
 char *b = "damepo";

 (char **)p = malloc( 3 * sizeof(char *));
 p[0] = a;
 p[1] = b;
 p[2] = NULL;

 return(p);
}
442デフォルトの名無しさん:2006/07/25(火) 07:45:45
全く問題ない
443デフォルトの名無しさん:2006/07/25(火) 09:02:02
(char **)p
このキャストは不要、むしろ邪魔。
444デフォルトの名無しさん:2006/07/25(火) 09:39:01
>>441
文字列リテラルでググって安心してこい
445デフォルトの名無しさん:2006/07/25(火) 10:04:54
*aなんて変数はない。あるのはあくまでもaだ。
446441:2006/07/25(火) 10:18:16
>>442 速攻レスありがとうございます!他の方の意見も聞きたかったので
お礼が遅れてしまいました。

>>443 そうですね。返って来るのは void * ですし、char **p と宣言して
いるから不要ですね。ご指摘ありがとうございます。

>>444 キーワードまでありがとうざいます。さっそく見て来ましたが、
自分の考えていた通りなのが分かって良かったです。

>>445 はい。*a ではないことは分かっていたのですが、a だけだと
どこに書いてあるのか分かりづらいと思ったので、あえて *a と
表記しました。でも紛らわしいですね。すみませんorz

以上であります! とってもありがとうございますた。
447デフォルトの名無しさん:2006/07/25(火) 13:53:24
だれか printf (const char*, ...); の実装を教えてください。
第二引数以降ってどうやって処理されてるのかがわかりません
448デフォルトの名無しさん:2006/07/25(火) 13:56:02
stdarg.h
449447:2006/07/25(火) 14:05:47
448サンてばステキ!どうもありがとう!
450デフォルトの名無しさん:2006/07/25(火) 18:56:00
typedef struct {
int a;
} elementtype;

void binary(int n) {
elementtype *x;
x = malloc(.....);
...
}

このような関数で x を動的に確保したいのですが、malloc(); をどのようにすればいいのでしょうか?
(配列をx[10000]のように定義せず、x に n だけ割り当てる)
451デフォルトの名無しさん:2006/07/25(火) 19:04:05
x = malloc(sizeof (elementtype) * n);
if (x == NULL)
{
  /* どうしよう */
}
452デフォルトの名無しさん:2006/07/25(火) 19:10:54
>>343クンか
453デフォルトの名無しさん:2006/07/25(火) 19:20:51
"←などの文字でchar型を初期化する時は、
char a[128] = {'"', '\0'};
等のように、ひとつずつ囲むしかないのでしょうか?
char a[128] = {"""};
みたいにするとエラーが出ます。
454デフォルトの名無しさん:2006/07/25(火) 19:22:47
\"
455デフォルトの名無しさん:2006/07/25(火) 19:24:27
printf("%d", n1, n2); と書いた場合、
n2は無視されることが保証されますか?
456デフォルトの名無しさん:2006/07/25(火) 19:25:18
普通無視される。でも後遺症が怖いよ。
457デフォルトの名無しさん:2006/07/25(火) 19:30:53
>>453
キーワード:C言語 エスケープシーケンス
458453:2006/07/25(火) 19:38:23
>>454,457
ありがとうございますm(_ _)m
459デフォルトの名無しさん:2006/07/25(火) 21:52:25
>>451
どうもありがとうございます!
460デフォルトの名無しさん:2006/07/25(火) 22:28:08
>>456
後半、ほんと?
461デフォルトの名無しさん:2006/07/25(火) 22:38:54
>>460

スタックに乗るだけで、後にも先にも問題ない。
462デフォルトの名無しさん:2006/07/26(水) 00:37:42
abortってなんか変わった?
環境変えたらmake通らなくなったでよ。
abort(1)って引数入れちゃ駄目なのかしら。
463デフォルトの名無しさん:2006/07/26(水) 00:51:26
>>462
だめ。
ANSI Cのabortは引数を取らない。
464デフォルトの名無しさん:2006/07/26(水) 00:53:14
>>463
即レスサンクス
前任者が全部引数居れてやがって全部直さんと駄目かorz
465デフォルトの名無しさん:2006/07/26(水) 01:03:08
逆に全部あるんだったらこういうのはどう?
#define abort(...) abort()

可変個引数なマクロを扱えないんだったら、...をxにでもすればいいけど、
暇なときに少しずつ直していくということができない。
466デフォルトの名無しさん:2006/07/26(水) 01:08:18
スクリプト組んで一気に直しちまえ
467デフォルトの名無しさん:2006/07/26(水) 01:14:31
>>465,466
ライブラリだけdefine切ったものでこっそり先に作って
時間あいた時に直す事にしますわ。
レスありがd
468デフォルトの名無しさん:2006/07/26(水) 01:16:13
abort(i++); とかあったりしてw
469デフォルトの名無しさん:2006/07/26(水) 01:20:24
ありそうでコワス
470前任者:2006/07/26(水) 01:25:33
そんな風に中で処理はしませんよ。
後始末関数を呼んでabortするだけですから。
471デフォルトの名無しさん:2006/07/26(水) 01:31:11
>>470
おまえかっ
ってかコンパイルオプションきつきつにしないと駄目っぽくて
余計な警告出過ぎでやる気が無くなっt(ry
取り合えず明日に備えて寝ますわ

ちょっと笑って元気が出た
ありがd
472デフォルトの名無しさん:2006/07/26(水) 01:51:45
>>468
#define abort(x) ((x), abort())

でどうよ。
473デフォルトの名無しさん:2006/07/26(水) 02:14:54
>>460-461
「関数の引数なんで、評価はされる。」って事と想像する<後遺症
474デフォルトの名無しさん:2006/07/26(水) 07:11:20
char*型を「もしmallocでメモリ確保してなかったならば」という文にしたいんですが、
どうすればいいですか?
475デフォルトの名無しさん:2006/07/26(水) 07:22:46
>>474
型は文にできねぇな。
476デフォルトの名無しさん:2006/07/26(水) 08:11:06
>>475
アリガス
477デフォルトの名無しさん:2006/07/26(水) 08:50:28
常套手段で
char* pc = NULL;
pc = malloc(100);
・・・
if (pc == NULL)
478デフォルトの名無しさん:2006/07/26(水) 09:07:58
>>474はメモリ確保した手段が何か知りたいのかと思われ。
きっと、char *を受け取った関数でその領域を解放すべきか判断したいのではないかと。

で、環境に依存せずにそんなことはできないので別の手段を考えろ、と。
479474=476:2006/07/26(水) 10:44:29
>>477
dです。
>>478
ごめんなさい。説明不足でした。
freeすべきかどうか調べる方法迷いましたけど、フラグ使ってましたw
480C言語超初心者:2006/07/26(水) 17:16:15
ax^2+bx+c=0
のa,b,cを任意に入力したときのxの解を求めるプログラムを作りたいんです。
誰か教えてくれませんか?
481C言語超初心者:2006/07/26(水) 17:18:52
ちなみに解に虚数iが出る場合とかに分けなきゃいけません
482デフォルトの名無しさん:2006/07/26(水) 17:41:24
>>481
マルチすなや。おまけにスレ違いだ。
483デフォルトの名無しさん:2006/07/26(水) 18:40:48
>>480
大変だな。頑張れよ
484デフォルトの名無しさん:2006/07/26(水) 18:55:23
誰かこの問題を実装してください。

http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H18a2/pm10.html

再帰構造体って、どーやって宣言すりゃいいの?

typedef struct letter {
char c; /* 英単語を構成する文字 */
struct letter *follow; /* この文字に続く文字へのポインタ */
struct letter *other; /* この文字に代わる別の文字へのポインタ */
char *trans; /* 訳語の文字列へのポインタ */
} LETTER;

LETTER *p_root;

って宣言してたらmainにはどーやって書いたらいいのか??
485デフォルトの名無しさん:2006/07/26(水) 19:04:27
>>484
東京理科大の先生に聞け
メールで俺からも頼んでおこう。
486デフォルトの名無しさん:2006/07/26(水) 19:42:43
>>484
連結リストでググれ

というかデータ構造とアルゴリズム勉強しろ
487デフォルトの名無しさん:2006/07/26(水) 20:54:25
ググったけどわからん!!
とりあえず、

char *trans_test[6]={"男、人間","主な","郵便物","電子メールソフト","名前"};

とは書いてみた。
その他がヽ( ´ー`)ノ
488デフォルトの名無しさん:2006/07/26(水) 21:59:53
興味があるだけなんですが、char の配列に機械語入れてそれを実行(jmp する)
したい場合、どうすればいいのでしょうか?

JIT とかってこれと似たことしてるんですよね?
489デフォルトの名無しさん:2006/07/26(水) 22:05:29
Cの範囲ではできないと考えていい。
490デフォルトの名無しさん:2006/07/26(水) 22:11:09
そこでgets()で以下略ですよ
491デフォルトの名無しさん:2006/07/26(水) 22:16:11
バッファオーバーランを使って実行させるやりかたは知ってるけど、
まっとうなやり方は知らない。
492デフォルトの名無しさん:2006/07/26(水) 22:19:16
糞団子にでも聞いて来い。
493デフォルトの名無しさん:2006/07/26(水) 22:31:32
>>498
ということは、スタックのレイアウトを仮定した上でリターンアドレスの書き
換えを行うことになるのでしょうか?

; 一般的に JIT 書くときどうするのか気になたもので...
494デフォルトの名無しさん:2006/07/26(水) 22:45:23
>>493
まぁスレ違いだな。
ということで、>498に期待。
495デフォルトの名無しさん:2006/07/26(水) 23:00:19
>>488
その配列変数をaとすると、((void (*)())(intptr_t)a)()で行ける環境がそこそこある。
ANSI Cの規格合致プログラムではなくなること請け合い。

その配列の最後には呼び出し元へ戻る命令を入れておいてね。
496デフォルトの名無しさん:2006/07/27(木) 12:42:23
ま、機械語という時点で処理系依存バリバリになってしまう
char のポインタを関数ポインタに無理矢理キャストして関数を呼ぶとか
497デフォルトの名無しさん:2006/07/27(木) 13:36:48
めんどくさいからksk
498デフォルトの名無しさん:2006/07/27(木) 15:50:15
>>486
どうやら連結リストではなくトライ木らしいですよ
499ど素人:2006/07/28(金) 02:11:38
前期の追試です。この2問に単位がかかっています。ぜひ、お願いします。
2.通常プログラムカウンタはプログラムの実行にしたがって一定の大きさだけ増えていく.
しかし,時に,プログラムカウンタに直前の値とは大きく異なる値がセットされる
時がある.それはどんな時か?

3.次のプログラムは何を行うプログラムか.簡単に説明しなさい.また,
結果を得るまでに,A[k]==aの比較が行われた回数を書きなさい.

A=new Array(3, 8, 19, 20, 22, 24, 45);
i=0;
j=A.length-1;
a=19;
k=Math.floor((i+j)/2);
while(i<=j){
if(A[k] == a){
break;
}
else if(A[k] > a){
j = k - 1;
}
else{
i = k + 1;
}
k = Math.floor((i+j)/2);
}
if(i>j) k=-1;
document.write(a," ",k);
500デフォルトの名無しさん:2006/07/28(金) 02:16:05
試験のとき問題文も読まない奴は落第すること請け合いだな
> GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
> 専門の別スレッド↓があるのでそこへさようなら。
501デフォルトの名無しさん:2006/07/28(金) 02:35:44
Javaかよ
502デフォルトの名無しさん:2006/07/28(金) 04:22:24
>>499
板違い

>>501
おいおい、これがJavaコードに見えるなら一度眼科に行った方がいいぞ
503デフォルトの名無しさん:2006/07/28(金) 07:00:26
JavaScript かな。
504デフォルトの名無しさん:2006/07/28(金) 12:12:54
document.writeがキメテです
505デフォルトの名無しさん:2006/07/28(金) 17:57:33
Cじゃ無いことだけは確かだな
506デフォルトの名無しさん:2006/07/28(金) 17:59:08
A.lengthやMath.floor()は?
507デフォルトの名無しさん:2006/07/28(金) 18:30:32
Javascriptだろ。
508デフォルトの名無しさん:2006/07/28(金) 20:05:04
>>506
Aっつー配列の長さ(要素数)を取る手段と整数部分を取る手段
ttp://www.big.or.jp/~mio/it-old/js/jsref/js_ref_floo.htm
まぁ、Javaとは別ものだけど、似ている部分はあるんだよね
けど、既出の通りJavaScriptなんでスレ違いだが
アルゴリズムの部分はCともそう大差は無いのも分かる
509デフォルトの名無しさん:2006/07/28(金) 21:21:00
a = 1;

if (a < 2 && a > 0) {
}else{
}
elseの中の処理をelseを使わずにやりたいのです。
a > 2 && a < 0という書き方ではなく別の書き方はありますか?
!=みたいな・・・・
510デフォルトの名無しさん:2006/07/28(金) 21:29:31
>>509
意味が分からんが != じゃだめなの?
a が整数型だと仮定しての話だけど

ついでに a > 2 || a < 0、な
511デフォルトの名無しさん:2006/07/28(金) 21:32:39
int a = 1;ならswitchとか
512デフォルトの名無しさん:2006/07/28(金) 21:34:42
>>509
if(!(a < 2 && a > 0)) {}
513デフォルトの名無しさん:2006/07/28(金) 21:38:06
>>510
おいおい、a==2とa==7のとき死ぬだろ。
514509:2006/07/28(金) 21:42:39
みなさんいろいろありがとうございます。
私がしたかったのは、>>512さんのやつでした。
助かりました。

説明が下手で申し訳ありませんでしたm(_ _)m
515デフォルトの名無しさん:2006/07/31(月) 17:03:03
char s1[],s2[],のとき、
strcpy(s1,s2);

strcpy(&s1,s2);
って同じですか?
516デフォルトの名無しさん:2006/07/31(月) 17:30:14
>>515
strcpy(&s1, s2);はコンパイル時に警告が出ると思うぞ。
s1はchar配列の先頭要素のアドレス、
&s1はchar配列のアドレス、
が得られる。結果は置いておいて、それの意味するところは違う。
string.hで定義されているstrcpyのプロトタイプで求められている引数は
char配列の要素のアドレスだ。
517デフォルトの名無しさん:2006/07/31(月) 17:37:28
>>515
これならいい
strcpy(&s1[0],s2);
s1と&s1[0]の返す値は同じだっておかあちゃんに昔習わなかったか?
518デフォルトの名無しさん:2006/07/31(月) 17:39:00
s1と&s1の違いはs1を1以外の適当な大きさの配列として、
printf("%p,%p\n", s1, &s1);
printf("%p,%p\n", s1+1, &s1+1);
を実行してみれば分かる。
519デフォルトの名無しさん:2006/07/31(月) 17:50:44
>>516,517,518
どうもありがとうございます
皆さん頭いいっすね
520デフォルトの名無しさん:2006/07/31(月) 18:06:32
そんな皆さんを見込んで、もう一つ質問
文 This is a test.を単語ごとに配列に入れて最後にNULLをつけなさい。
といわれたんで(そういわれたわけじゃないけど問題を解釈して)、
char str[][]={"This","is","a","test",NULL};
ってやったら警告出ちゃうんですけど、なぜですか?
試しにポインタ型の文字列でやってみたら、何も言われなかったんですけど。
char *str[]={"This","is","a","test",NULL};
この違いは何?
521デフォルトの名無しさん:2006/07/31(月) 18:11:51
>>520
前者は文法違反です。そんな書き方はない。JavaやC#と違うんだから。
522デフォルトの名無しさん:2006/07/31(月) 18:12:39
>>520
スレ違い。
523デフォルトの名無しさん:2006/07/31(月) 18:18:09
>>520
char str[][]={"This","is","a","test",NULL};
はcharの2次元配列を宣言しようとしているが中途半端なのでコンパイラがエラーを出す。
宣言&初期化するなら、
char str[][5]={"This","is","a","test",NULL};
とかすれ。
char *str[]={"This","is","a","test",NULL};
はcharへのポインタの配列だから、この二つのstrは全然意味が違う。
ポインタや配列をもう一回勉強せい。
524デフォルトの名無しさん:2006/07/31(月) 18:41:32
>>523
あの〜そうやっても
warning: initialization makes integer from pointer without a cast
って出ちゃうんですけど。
まさか警告は無視しろと?
525デフォルトの名無しさん:2006/07/31(月) 18:46:53
>>523
> char str[][5]={"This","is","a","test",NULL};
これ ANSI-C で許されたっけ?

char str[][5]={"This","is","a","test", ""};
なら判るけど。
526デフォルトの名無しさん:2006/07/31(月) 18:51:58
あーここANSI-Cのスレだった。
もちろんNULLはないね。
527デフォルトの名無しさん:2006/07/31(月) 18:53:58
えーとポインタくらいは分かるよ
Thisとかをどこかにとってそこへのポインタの配列入れてるんでしょ?
そのぐらいは・・・

>>525
そうなんですか…
でも最後にNULLが来たらなんちゃらしろってプログラム書かなきゃいけないんですけど
""でもNULL返されます?
528デフォルトの名無しさん:2006/07/31(月) 18:57:17
>>527
char str[][5]は配列の配列だからNULLポインタは使えない。
char * str[]はポインタの配列だからNULLポインタも使える。
詳細は初心者スレでどうぞ。
529デフォルトの名無しさん:2006/07/31(月) 18:57:52
>>527
ポインタ判るなら自明だと思うが NULL は返らないぞ。
530デフォルトの名無しさん:2006/07/31(月) 19:31:03
>>528,529
どうも・・・でなおしてきます
(・ω・)
531デフォルトの名無しさん:2006/07/31(月) 20:55:15
ポインタは分かるという初心者は
大抵ポインタが分かってないの法則
532デフォルトの名無しさん:2006/07/31(月) 23:11:42
例えば1000個の要素を持つ3次元の配列
data[z][y][x] (x,y,z=0〜9)
で、zのサイズを11(z=0〜10)に変更したい場合、
新たにその大きさの配列を確保してデータをコピーすれば可能だと思いますが、
そうではなくて、もともとの配列だけを使って、動的に配列の大きさを変更する
ことって可能でしょうか?
つまりその、上の例で言うと、x*y=10*10の2次元配列がz方向に10階建てになって
いる感じだと思いますが、そこで例えばz=4と5の間に、新しく1階を挿入して
z=11階建てにできますか?
533デフォルトの名無しさん:2006/07/31(月) 23:18:19
realloc
534デフォルトの名無しさん:2006/07/31(月) 23:19:24
メモリを確保しなおさないでやるのは無理
LISTとか使わないと
535デフォルトの名無しさん:2006/07/31(月) 23:37:18
皆さんありがとございます。
>533
realloc すると、途中に挿入することができないように思うのですが、どうでしょうか。
つまり、reallocで10階の上に1階を追加できますが、4階と5階の間に挿入できないのでは
と思います。

>534
LISTっていわゆるリスト構造ってやつですか?
それも考えたのですが、でもそれだと、配列を
data[z][y][x]
のように表現できないですよね。
そのかわり、リストがポインタで連結されているややこしい構造になるのがちょっと
抵抗あります。

何かいい方法ないでしょうか?
536デフォルトの名無しさん:2006/08/01(火) 00:00:27
>>535
C++にしてベクター使え
537デフォルトの名無しさん:2006/08/01(火) 03:52:28
x,yが伸縮しないなら z だけポインタの配列にすれば挿入とかのオーバーヘッドは
かなり抑えられる。けど、(*data[z])[y][z] てな書き方になるので
激しくバグの元。すなおに get(x,y,z) と set(x,y,z,val) つくったほうがいいね。

むしろ x,y,z それぞれ伸縮する場合のデータ構造でいいのあるのか知りたい。
538デフォルトの名無しさん:2006/08/01(火) 08:02:35
>>537
>>でいいのあるのか
日本語でどうぞ。
539デフォルトの名無しさん:2006/08/01(火) 08:33:22
申し訳ないのですが、シェルの組み込みコマンドをプログラム中で使うにはどうすればよいのでしょうか?

cdコマンドを使いたいのですが、exec や system でも出来ないですしどうしたらいいものかと。
検索してみても上手いこと素敵なのが発見出来なかったので、もしどなたか良い場所をご存知でしたら教えていただければ幸いです。
540デフォルトの名無しさん:2006/08/01(火) 08:34:26
おお、さげ忘れました…

ごめんなさい
541デフォルトの名無しさん:2006/08/01(火) 10:05:44
ファイルを出力するのにcdコマンドは無用
542デフォルトの名無しさん:2006/08/01(火) 10:13:19
cdの動作を考えればsystemじゃだめなのは一目瞭然という気もするが。

とりあえずchdir関数じゃだめなの?
543デフォルトの名無しさん:2006/08/01(火) 12:15:40
>>542
このスレ的にはそんな関数ない。

>>539
スレ違い。環境依存容認スレか該当環境専門のスレか初心者スレにでもどうぞ。
544539:2006/08/01(火) 15:43:34
>>541
ファイル出力する訳ではなくて、FTPを実現するプログラムを作ってたので送受信する際の
カレントディレクトリを動かしたいと思っていました。

>>543
あいさ、すみませんでした。
そっちで聞いてみます。ありがとうございます。
545デフォルトの名無しさん:2006/08/01(火) 15:54:22
なんでカレントディレクトリを移動させる必要があると考えるのかが不思議
546デフォルトの名無しさん:2006/08/01(火) 16:13:45
>>541
不思議なら黙っとけカス
547デフォルトの名無しさん:2006/08/02(水) 20:58:24
ファイルのコード変換でibmjからEUCに変える場合って
改行コード追加してやらんと駄目だよね?
ibmjtoeucとか使ってたんだけどソラリス9用にiconv使わんといかんのかなー。
548デフォルトの名無しさん:2006/08/02(水) 21:15:47
スレ違い
549デフォルトの名無しさん:2006/08/03(木) 00:57:58
#include <stdio.h>
main() {
int x,y,z;
printf("数値を2つ入力して下さい : ");
scanf("%d %d",&x,&y);
for(;;) {
if(x%y==0) break;
else { z=x; x=y; y=z%y; }
}
printf("最大公約数 : %d",y);
}

c言語はやり始めて間もない状態です。
最大公約数を求めるプログラムは上記のようになるらしいのですが、for文の(,,)内に条件や初期設定等を示さないのはなぜなのでしょうか?
また、7行目の"break"の意味は「繰り返し作業を終える」と捉えてよろしいのでしょうか?
ご教授の程、宜しくお願い致します。
550デフォルトの名無しさん:2006/08/03(木) 01:00:29
無能が書いたプログラムは読まないようにしましょう
(当然、無能が書いた本も)
551デフォルトの名無しさん:2006/08/03(木) 01:09:49
ということは上記プログラムは正常に作動しないということなのでしょうか?
(現在動作確認できる環境下に無いもので、くだらない質問で申し訳ないです。)
552連投すいません:2006/08/03(木) 01:14:20
因みに>>549はreturnやwhileの使用が禁じられた状態で、for文とif文を中心に遠回りに作成したプログラムであります。
553デフォルトの名無しさん:2006/08/03(木) 01:25:58
こうかいてもいいお。
for (scanf("%d %d",&x,&y); x%y != 0; z=x,x=y,y=z%y);
だが多くの人はこうかく。
scanf("%d %d",&x,&y)
while (x%y!=0) { z=x; x=y; y=z%y; }
理由はそれが見やすいと思うから。うまいひとはどう書けばきれいか常に気を使ってるお。
554デフォルトの名無しさん:2006/08/03(木) 01:27:30
関数にポインタで引数を渡す参照渡しというのがあるのですが
関数が受け取ったアドレスが、変数のアドレスなのか、配列のものなのか区別はしないものなのでしょうか
555デフォルトの名無しさん:2006/08/03(木) 01:37:09
必要ならしますお。配列として扱う関数はいっしょに要素数をもらうのがいっぱんてきですお。
>>553 せみころんがぬけたorz
556549:2006/08/03(木) 01:40:52
>>553
有難う御座いました。
557デフォルトの名無しさん:2006/08/03(木) 01:51:47
>>555 ありがとうございます。
ちょっとテストしてみたのですが

#include <stdio.h>
void add (int *p) {
*p += 10;
*(p+1) += 10;
}
int main (void) {
int a = 10, b = 20;
printf ("変数aの値は%d:アドレスは%p¥n", a, &a);
printf ("変数bの値は%d:アドレスは%p¥n", b, &b);
add (&a);
printf ("変数aの値は%d:変数bの値は%d¥n", a, b);
return 0;
}

変数 aと bのアドレスがとなりあってる場合、関数によって配列でもないのに変数 bの値が書き換えられてしまいます
仮に、配列を扱う関数で、配列の後ろに関係ない変数があった場合、
意図せず変数まで書き換えてられてしまう可能性もあると思うのですが、
そういうのは自分で注意するべきなのでしょうか?
558デフォルトの名無しさん:2006/08/03(木) 01:59:56
VCだとランタイムがチェックしてくれなかったっけ?
559デフォルトの名無しさん:2006/08/03(木) 02:10:23
>>558 VCは使ってないのでよく解らないのです。
560デフォルトの名無しさん:2006/08/03(木) 02:10:30
>>557
そいつはCの弱点なだ。
561デフォルトの名無しさん:2006/08/03(木) 02:17:24
>>560 そうなのですか
文字列のようにNULL文字で制御できる場合以外は、気をつけたほうがよいですね。
どうもありがとうございました。
562デフォルトの名無しさん:2006/08/03(木) 02:21:40
>>557
自分で注意しなくてはならない。
563デフォルトの名無しさん:2006/08/03(木) 03:11:06
>>549
http://pc8.2ch.net/test/read.cgi/tech/1152095097/419
> [5] その他の制限:「return」は使えません。for文とif文を中心によろしくお願いします。
↑へのレス
http://pc8.2ch.net/test/read.cgi/tech/1152095097/421

>>550
お前がバカ
564デフォルトの名無しさん:2006/08/03(木) 03:42:02
↑スルーで
565デフォルトの名無しさん:2006/08/03(木) 03:42:30
>>564 お前が言うな
566デフォルトの名無しさん:2006/08/03(木) 04:20:22
(↑これはループせんでいいです)
567デフォルトの名無しさん:2006/08/03(木) 04:37:19
(↑これはぬるぽせんでいいです)
568デフォルトの名無しさん:2006/08/03(木) 04:47:10
(↑これは再帰せんでいいです)
569デフォルトの名無しさん:2006/08/03(木) 13:57:08
(*゚ー゚)マターリいこうよ
570デフォルトの名無しさん:2006/08/03(木) 14:16:19
ぬるぽく行こうよ
571デフォルトの名無しさん:2006/08/03(木) 19:24:52
K&Rについての質問です。
演習5-5のstrncatなんですが

void strncat(char *str1, char *str2, int n)
{
int i;

while(*str1)
str1++;

for(i = 0; i < n; i++)
*str1++ = *str2++;

*str1 = '\0';
}

とやるとうまくいくんですが、whileの部分を
while(*str1++);
にすると文字列が連結されません。
なにがいけないんでしょうか?
572デフォルトの名無しさん:2006/08/03(木) 19:27:37
なんでって、そりゃポインタのアドレスを先に進めるか、
変数の値を増やすか、ぜんぜんちゃうやろ?ありがちなミスだな。
573デフォルトの名無しさん:2006/08/03(木) 19:46:53
>>572
もっぺんよくみろ
574デフォルトの名無しさん:2006/08/03(木) 19:49:47
紙に[a][b][\0][\0]って書いてwhile抜けたときにどこ指してるか比べてみればわかる
575571:2006/08/03(木) 20:01:21
>>574
str1が\0の次まで進んでしまっているということですね。
whileのあとで str1--; としてみたらうまくいきました。
ありがとうございます。
576デフォルトの名無しさん:2006/08/03(木) 20:21:09
577デフォルトの名無しさん:2006/08/03(木) 22:53:26
おい、スーバープログラマども、教えてください。

int main(void)
{
int a = funcA();
return 0;
}

void funcA(void)
{
int index = 1;
return index++;
}

上のようなコードがあった場合、main の a に入る値は funcA の戻り値です。
この戻り値には、何が入るのでしょうか。

return に、indexの値が入れば、戻り値は1
return に、index++の値が入れば、戻り値は2

どちらが正しいのでしょう。

直感的に、(index++)の結果をreturnする、と解釈し、2だと思いましたが、
実際にVisual C++でテストしたところ、結果は1でした。
もし、return index のあとに index++ となるとしても、return というのは、
関数のコンテキストを離れてしまうわけで、そうすると既にfuncAのスタックとかは
残ってないわけで、何に対して++をするのかわかりません。
もしかして、この++は無効だとしてコンパイラが自動的にはじいているのでしょうか?
混乱してます。
578デフォルトの名無しさん:2006/08/03(木) 23:01:58
>>577
まず、returnで返すのは「値」だ。
この場合、なんの値を返すかと言うと、

  「index++」の演算結果

であって、「index++」そのものを返す訳ではない。
579デフォルトの名無しさん:2006/08/03(木) 23:06:13
>>577 ++index って書いたら幸せになれるよ
580デフォルトの名無しさん:2006/08/03(木) 23:12:13
>>577
#include <stdio.h>

int main(void);
int funcA(void);
void funcB(void);

int main(void) {
  int a = funA();

  printf("a->%d\n",a);

  funcB();
  return 0;
}

int funcA(void) {
  int index = 1;

  return ++index;   //式を評価する前に増加
  //return index++; /式を評価してから増加
}

void funcB(void) {
  int index1 = 0;
  int index2 = 0;

  printf("index++ ->%d\n",index1++);
  printf("++index ->%d\n",++index2);
}
581デフォルトの名無しさん:2006/08/03(木) 23:13:19
戻り値もちゃんと考えようね
582デフォルトの名無しさん:2006/08/03(木) 23:23:33
> もしかして、この++は無効だとしてコンパイラが自動的にはじいているのでしょうか?
はじくかもしれない。
1.戻り値に使用されると決められているレジスタに index の値を入れる。
2.スタック上の index の位置に index+1 をいれる。。
3.return - スタックはもはや無効。2の処理に意味がないと気づいたコンパイラははじくかも。
583デフォルトの名無しさん:2006/08/03(木) 23:29:52
そういや昔、VC で return のところで ++ 使ったら
変になるバグってなかったっけ?
今のだと大丈夫だろうけど。
584デフォルトの名無しさん:2006/08/03(木) 23:52:59
自分が知りたいことが、一体どのジャンルの事なのかよく分かっていなくて
申し訳ないのですが、外部変数やexternについて教えてください

例えばmain.cとfunc.cという2つのソースファイルとmydef.hというヘッダファイルが
あるプログラムで、その中で使っているグローバル変数AAAを、mydef.hの中で
以下のように、二重に宣言しないようにする事があるかと思います。

#ifndef MYDEF
#define MYDEF
  int iAAA;
#else
  extern int iAAA;
#endif

このようなヘッダファイルを、main.c、func.c両方でincludeしている場合に
・iAAAの実体(extern宣言されない方)はどのソースにあるものとされるのでしょうか
・cc -o exe.exe main.c func.c といった一括コンパイルではなく、Makefileを
 使ったりして分割コンパイル→リンクしている場合、それぞれのコンパイルの時は
 プリプロセッサは独立して動作しているので、それぞれのソースで
 毎回「#ifndef MYDEF」が有効になると思うのですが、その場合にmain.cとfunc.cで
 iAAAは二重に宣言されないのでしょうか

用語等、適切ではない部分はご容赦下さい…
585デフォルトの名無しさん:2006/08/03(木) 23:54:06
gcc v3.4.4でコンパイルしたけど弾かれないな
586デフォルトの名無しさん:2006/08/03(木) 23:55:56
PPC Mac だけど gcc -O ならはじかれたよ?
587デフォルトの名無しさん:2006/08/03(木) 23:59:05
>>584
あー、なにか重大な誤解をしていると思うんだが。
複数のソースを同時に指定してもプリプロセッサもコンパイラも別々に動くよ。
だから
> cc -o exe.exe main.c func.c
でもmain.c、func.c両方でiAAAが定義されている。
でもって普通はヘッダーにexternだけ書いてソースに定義を書く。
実体をヘッダに定義するのは気持ち悪いし
ヘッダはextern宣言だけにして実体はcファイルの中でやるほうが綺麗。

もちろん、実体を定義してるファイルにextern宣言のヘッダをインクルードしても問題ない。
589デフォルトの名無しさん:2006/08/04(金) 00:13:50
ほとんどの処理内容が、ヘッダに書かれてて、cppの中身がマクロニ、三個と
#include 行しかないの見たことがある。
書いたのは素人じゃないと思うんだけど、どういう意図があるんだろね。

# boostではないですよ。
590デフォルトの名無しさん:2006/08/04(金) 00:16:01
>>589
このスレにそれを書き込む、お前の意図が知りたい
C++でテンプレートベースのライブラリだと大抵そうだよね
592デフォルトの名無しさん:2006/08/04(金) 00:21:33
>584
普通はヘッダに定義を記述しない。つまり
int AAA;
はどこかの.cに書く。あるソースコードのコンパイルで
extern int AAA;

int AAA;
が同一のコンパイル単位に登場しても問題ない。
593デフォルトの名無しさん:2006/08/04(金) 00:24:17
すみませんが教えてください
ファイル(i.txt)に
0
1
2
と10まで出力させたいんですが以下のプログラムだとうまくいきません
なぜなんでしょうか?お願いします
#include<stdio.h>
#include <stdlib.h>

main(){
int i;
FILE *fp1;

if((fp1 = fopen("i.txt","w"))==NULL){
printf("ファイルが開けません\n");
exit(1);
}
for(i=0;i>10;i++){
fprintf(fp1,"%d\n",i);
}
fclose(fp1);

return 0;
}
594584:2006/08/04(金) 00:29:57
>>587
> 複数のソースを同時に指定してもプリプロセッサもコンパイラも別々に動くよ。
そうなのですか・・・
ソースを同時に指定すれば、定義されたMYDEFがコンパイル中はずーっと
有効なんだろうなあと勝手に想像していました・・・


> でもって普通はヘッダーにexternだけ書いてソースに定義を書く。
>>588
> ヘッダはextern宣言だけにして実体はcファイルの中でやるほうが綺麗。
> >584
> 普通はヘッダに定義を記述しない。つまり
皆様ありがとうございます。勉強になります。

私が挙げたような、#ifdefで実体と外部変数の宣言の処理を分けるというのは
ちょっと変な事をやってしまっていたようですね・・・
595デフォルトの名無しさん:2006/08/04(金) 00:32:04
>>593
for(i=0;i>10;i++){

何コレ?ふざけてるの?
596デフォルトの名無しさん:2006/08/04(金) 00:34:58
ありがとうございます
自分の馬鹿さにびっくりしました
597デフォルトの名無しさん:2006/08/04(金) 01:15:38
そもそもをして、グローバル変数を使うこと自体、もっと慎重になった方がいい。
それには同意せざるを得ない
599デフォルトの名無しさん:2006/08/04(金) 02:28:24
>>597
漏れもそれには同意なのですが、でもコマンドラインパラメータとして与えられた
オプションのフラグを関数の奥のほうまで運んでやる必要がある時とか、
ついついグローバル変数に入れてしまうな

そんな時、グローバル変数でないとするなら、オプションを格納した構造体を
ずーっと持ち回る、くらいの作り方しか分からんのだが、それもどうなのだろうな
おいらなら、オプションは最初に解析しておいてその結果をモジュールローカルに格納し
パブリックな関数を呼び出すインターフェイスにするかな。
どこからでも「書き込める」のがよくない。
601デフォルトの名無しさん:2006/08/04(金) 02:56:54
どこかで意図的に書き込んで奥のほうを騙すやり方の誘惑は強い。
602デフォルトの名無しさん:2006/08/04(金) 21:43:32
関数インターフェースの設計に失敗して直すの面倒な時
に使う
603デフォルトの名無しさん:2006/08/04(金) 23:32:17
printfとputcharの違いってなんですか?
604デフォルトの名無しさん:2006/08/04(金) 23:34:46
>>603
綴りが違う。
605デフォルトの名無しさん:2006/08/04(金) 23:44:07
ようするに、putcharは単純低機能で、printfは複雑高機能。
606デフォルトの名無しさん:2006/08/05(土) 06:02:38
過去ログ半分しか読んでないんで、既出かもしれないけど質問
char Siki[256]="(3+2)*4/5"
と入れてあるときにKeisan(Siki)で4を出力するような関数Keisanって作れませんか
607デフォルトの名無しさん:2006/08/05(土) 06:09:55
作れるけど、初心者にはかなり大変。
608デフォルトの名無しさん:2006/08/05(土) 06:24:35
>>606
bison flex でググってみれ。
609デフォルトの名無しさん:2006/08/05(土) 08:48:47
>>606
手書きなら再帰下降解析で10分で作れる。
610609:2006/08/05(土) 09:10:41
コード書く時間より,
1レスで収めるように改行とかを潰す時間のほうがかかったorz

#include<ctype.h>
#include<stdlib.h>
int addsub(char**);
int atom(char**p){
 int v;if(isdigit(**p))v = strtol(*p,p,0);else if(**p=='(')++*p,v = addsub(p),++*p;
 else{while(**p)++p;return 0;}while(isspace(**p))++*p;
 return v;
}
int pre(char**p){while(isspace(**p)|**p=='+')++*p;
 if(**p=='-'){++*p;return-pre(p);}return atom(p);}
int muldiv(char**p){
 int v = pre(p);
 for(;;)if(**p == '*')++*p,v *= pre(p);else if(**p == '/')++*p,v /= pre(p);
  else return v;
}
int addsub(char**p){
 int v = muldiv(p);
 for(;;)if(**p == '+')++*p,v += muldiv(p);else if(**p == '-')++*p,v -= muldiv(p);
  else return v;
}
int Keisan(char*p){return addsub(&p);}
int main(){
 char Siki[256]="(3+2)*4/5";printf("%d\n",Keisan(Siki));
}
611デフォルトの名無しさん:2006/08/05(土) 13:06:01
>594
>私が挙げたような、#ifdefで実体と外部変数の宣言の処理を分けるというのは
>ちょっと変な事をやってしまっていたようですね・・・

--mydef.h---
#if defined(MYDEF)
int i;
#else
extern int i;
#endif

としておいて、通常使うときはそのまま #include、実体定義用のファイルでは

--mydef.c---
#define MYDEF
#include "mydef.h"

というのならありじゃないかな。mydef.h 1ヶ所だけで管理が可能だし。
612デフォルトの名無しさん:2006/08/05(土) 13:17:45
そんなキモイ事するくらいなら外部リンケージの変数を
一箇所にまとめたcファイル作れ。
613デフォルトの名無しさん:2006/08/05(土) 13:57:17
その昔

#ifndef MYDEF
#define extern
#endif
extern i;

っていうやり方を見たことある。
なにか理由があった気がするが忘れた。
614デフォルトの名無しさん:2006/08/05(土) 13:58:26
#ifdefだった
615デフォルトの名無しさん:2006/08/05(土) 13:59:22
理由:アホな奴がそのコードを書いた
616デフォルトの名無しさん:2006/08/05(土) 20:56:58
memset()の使い方で質問があります。

2次元配列 data[y][x] があったとして、
この配列を初期化する場合に、

memset( data, 0, y*x);

とやっても問題ないでしょうか?
自分でコード書いた限りでは上手く動いているようなのですが、
実際のところはどうなのでしょう?
617デフォルトの名無しさん:2006/08/05(土) 21:03:15
今後、自分だけの価値観だけでアホだの無能だのバカにするだけで
自分の意見を言わないような >>615 みたいなのは放置な。うざい
618デフォルトの名無しさん:2006/08/05(土) 21:07:02
>>616
配列の型がchar なら問題ない。
619デフォルトの名無しさん:2006/08/05(土) 21:08:54
>>616
memset(data, 0, y*x*sizeof(char))
みたいに型サイズも入れた方がいいんじゃないかな
620デフォルトの名無しさん:2006/08/05(土) 21:16:35
>>617
お前がまず放置しろよ
621デフォルトの名無しさん:2006/08/05(土) 21:18:34
>>618
それを書くなら、問題のある型を書きましょう。
622デフォルトの名無しさん:2006/08/05(土) 21:21:30
>>619
charならsizeofは不要。
sizeof (char)は常に1と決まっているから。
623616:2006/08/05(土) 21:26:10
みなさんレスありがとうございます。
配列は unsigned char なものを使ってます。
データ型を指定する癖をつけていこうと思います。
624デフォルトの名無しさん:2006/08/05(土) 21:28:34
戻り値が二次元配列になる関数はどうやって作成したらよいのでしょうか。
関数ポインタや配列とポインタについては調べたのですが、よくわかりません。
どなたかご教示ください。
625デフォルトの名無しさん:2006/08/05(土) 21:32:45
>>617
stdafx.hでもやってることだし
626デフォルトの名無しさん:2006/08/05(土) 21:37:38
>>624
僕の天才的関数で一発だb
void** a(void b[2][2])return b;
627デフォルトの名無しさん:2006/08/05(土) 21:37:58
>>613
そもそもそれバグありなんだが、それ以外にも問題ありすぎだろ。
628デフォルトの名無しさん:2006/08/05(土) 22:11:28
>>626
ありがとうございます!早速組み込んでみたいと思います。
629デフォルトの名無しさん:2006/08/05(土) 22:14:52
>>628
こらこら釣られるな。
630デフォルトの名無しさん:2006/08/05(土) 22:17:45
>>629
ですよね・・・・void**てなんだろ と思いましたし(void b[2][2])って意味わからないし・・。
どなたか本当の答えを教えてください。
631デフォルトの名無しさん:2006/08/05(土) 22:20:43
>>630
Cでは配列を返せない。

で、void型変数というのは型を特定しないこと。
632デフォルトの名無しさん:2006/08/05(土) 22:22:54
・呼ぶ側は、二次元配列となる変数を宣言する
・呼ばれる関数の中でも二次元配列となる変数を宣言する
・呼ばれる関数でメモリを確保したり0で初期化したりする
・呼ばれる関数での戻り値は、配列の先頭アドレス
・呼ぶ側は、宣言した二次元配列のアドレスを、関数からの戻り値にあるアドレスに書き換える

int main(int argc, char **argv){
633606:2006/08/05(土) 22:29:26
>>610
ありがとうございます
今の自分のレベルでは無理っぽいみたいで、内容も把握しきれませんでした
607の指摘の通り、初心者の身には難しいようで、もう少し精進して自力で組めるようになりたいと思います
634デフォルトの名無しさん:2006/08/05(土) 22:45:35
>>631
そうでしたか。Cでは配列は返せないのですね。voidについてもわかりました。ありがとうございます。
>>632
なるほど。配列は返せないので作った配列のアドレスを返すのですね。がんばってみます。

みなさんありがとうございました。
635デフォルトの名無しさん:2006/08/05(土) 22:54:02
>>623
sizeof(char)は1だから、必然的にsizeof(unsigned char)も1。
従ってsizeof(char)やsizeof(unsigned char)は書く必然性がない。
#そもそも内部でcharを書き込む処理をするのだから当然と言えば当然なのだが。
636デフォルトの名無しさん:2006/08/06(日) 01:16:13
あるプログラムを作成し、コンパイルしたのですが、
『インクルードファイル’stdio.h’をオープンできない』
というエラーが出ました。
他のパソコンだと普通にコンパイルできるのですが・・・。
原因がまったくわかりません。
どなたか教えてください。
637デフォルトの名無しさん:2006/08/06(日) 01:19:57
stdio.h自体が存在しないか、
stdio.hがあるフォルダへパスが通ってない
638デフォルトの名無しさん:2006/08/06(日) 01:20:58
>>636
コンパイルしたパソコンにちゃんとコンパイラ、開発環境が入ってっかぁ〜?
639デフォルトの名無しさん:2006/08/06(日) 01:25:03
>>636
初心者スレ、或いは該当環境のスレへどうぞ。
640デフォルトの名無しさん:2006/08/06(日) 01:37:29
>611
だめだろ、ふつうに。なんのために
extern int foo;
int foo;
で定義、宣言が両方あっても問題ないようになってると思ってんだ?
641デフォルトの名無しさん:2006/08/06(日) 01:38:19
実はフリースタンディング環境の処理系だったということが
あるあ…ねーよwww
BCCってちゃんと自分でパス通さないと使えなかったような
643デフォルトの名無しさん:2006/08/06(日) 01:54:31
#include <stdio.h>
#include <time.h>
int main (void) {
int ans;
clock_t start, end;
start = clock ();
puts ("55 かける 55 はいくつでしょう?");
scanf ("%d", &ans);
if (ans == 55*55)
puts ("正解です");
else
puts ("間違ってます");
end = clock ();
printf ("%.1f秒かかりました¥n", (double)(end - start)/CLOCKS_PER_SEC);
return 0;
}

上のようなプログラムで、計算にかかった時間を表示させようとしたのですが、
どんなに時間をかけても、「0.0秒かかりました」としか表示されません。
ためしに printf ("%d, %d", start, end); で表示させても
start, end ともに「0」でした。
どこか問題があるのでしょうか?
644デフォルトの名無しさん:2006/08/06(日) 01:59:06
>>643
その程度の演算、今のコンピュータなら1msと掛からずに処理できる。
645デフォルトの名無しさん:2006/08/06(日) 02:02:04
>>643
いや、俺は出るけど?

>>644
お前は一体何を言ってるんだ?
646デフォルトの名無しさん:2006/08/06(日) 02:03:24
ユーザー入力部(scanf)があるのに
コンピュータの性能も糞もねぇだろw
647デフォルトの名無しさん:2006/08/06(日) 02:04:17
明らかに読んでなかった

吊ってくる
648デフォルトの名無しさん:2006/08/06(日) 02:10:36
>>645
出ますか...
自分 mac なんですけど、環境による影響ってないですよね...なんでだろう
649デフォルトの名無しさん:2006/08/06(日) 02:14:42
ちょうど処理に2^32秒かかったんじゃね?
650デフォルトの名無しさん:2006/08/06(日) 02:19:48
>>649
何度やっても「0」なんです
651649:2006/08/06(日) 02:22:01
マジレスキタワァ*・゜゚・*:.。..。.:*・゜(n‘∀‘)η゚・*:.。. .。.:*・゜゚・* !!!!!

コンパイラの問題なんじゃね?
652デフォルトの名無しさん:2006/08/06(日) 02:26:06
>>643
scanf()の前と後ろに
printf("%f\n", (double)clock());
入れたらどうなる?
653デフォルトの名無しさん:2006/08/06(日) 02:29:21
>>649
スイマセン本当は意味解ってなかったです。
コンパイラですか...おそらく GCC 4 なんですが、これがダメなんでしょうか?
654デフォルトの名無しさん:2006/08/06(日) 02:35:02
>>652
やってみました。
とりあえず入力までに5秒くらい間をおいてみたのですが
scanf の前、後ろとも「0.000000」でした。
655デフォルトの名無しさん:2006/08/06(日) 03:18:25
それ明らかにちゃんと機能してないわけだが
656デフォルトの名無しさん:2006/08/06(日) 06:53:19
おれ今ちょうどマカーなので試してみた。ゼロといわれた。
頭に volatile int i; for (i = 100000000;i;i--); をいれてみた。
72といわれた。ちなみにCLOCKS_PRT_SECは100と小さい。
scanf()の入力待ちはselect()かなんかしててCPU食わない。なのでゼロが
かえってきてるってことではないかと。
657デフォルトの名無しさん:2006/08/06(日) 06:54:55
-CLOCK_PRT_SEC
+CLOCK_PER_SEC
まっくのキーボードに慣れてないせいにしとく。。
658デフォルトの名無しさん:2006/08/06(日) 07:03:50
man 3 clock
...
clock() はプログラムの使用したプロセッサ時間の近似値を返す。

つまり>>644が正解。
659デフォルトの名無しさん:2006/08/06(日) 07:08:20
リロード… orz
660611:2006/08/06(日) 10:23:34
>640
---mydef.h---
extern int i;

---mydef.c---
#include "mydef.h"
int i;

として他のソースでも #include "mydef.h" しろ、という意味?自分で書くならこう書くけど。
で、>611 みたいに書いた場合のデメリットって、キモイ以外に何かある?
661デフォルトの名無しさん:2006/08/06(日) 10:30:34
>660
書き込んだ後で気づいた。型が違ってる場合にエラーが出るか否かが違うな。
じゃ、これでどうだ。…キモ度があがったような気がするが。

---mydef.h---
#if defined(MYDEF)
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN char c;
EXTERN int i;

#undef EXTERN

---mydef.c---
#define MYDEF
#include "mydef.h"
662デフォルトの名無しさん:2006/08/06(日) 12:01:03
>>660
初期化子が置けない。
663デフォルトの名無しさん:2006/08/06(日) 12:20:36
15年くらい前にexternをdefineしたことあるよ。externつけて宣言したら定義書けなかったんではないかと
回想してみた。はっきり覚えてないんだけどAIXのCでANSI準拠だったと思う。
定義専用のCファイル作ればいいんだけど、ちゃんと両方に書かないといけないから同期が面倒だったんだわ。
664デフォルトの名無しさん:2006/08/06(日) 12:25:25
>>663
同期が面倒になるほどグローバル変数を使うのか、お前は。
665デフォルトの名無しさん:2006/08/06(日) 13:07:21
当時はへっちゃらだったなあ。
666663:2006/08/06(日) 13:21:43
たぶんこれみて始めたんだ。Software Design読んでたからな。
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.2.4.html
こんないい方法があるんだよってな感じで紹介されてるw
筆者に代わって弁明しとくけど、少なくとも当時はかなりの良書だった。
667デフォルトの名無しさん:2006/08/06(日) 13:36:46
visual studio使ってるんだが、
func.cで作った関数をmain関数のあるmain.cで呼び出すにはどうしたら良いんだ?
ソースを2ファイル以上に分けて記述する方法がわからん・・・
668デフォルトの名無しさん:2006/08/06(日) 13:49:27
ヘッダファイルに関数プロトタイプを書け
669667:2006/08/06(日) 14:13:38
>>668
できた。ありがとう
これでヘッダファイルに処理書かなくてすむ
670デフォルトの名無しさん:2006/08/06(日) 18:15:48
>661
なおさらだめなコードだと思う。俺の部下が書いてきたら速攻でつき返す。
というかインクルードファイルには通常多重インクルード防止の
ガードマクロを用意するのが普通だが、その辺の配慮とかは?
要はそのインクルードファイルを使うやつがいろんなことを配慮しなきゃ
いけないようなのはよくない、というのが最近の流れだな。
671デフォルトの名無しさん:2006/08/06(日) 18:19:24
まあ、グローバル関数でも .h と .c の2カ所に同じような事書いてんだから、
グローバル変数で同じように2カ所に書いたところで今更なんだって話だな。
672デフォルトの名無しさん:2006/08/06(日) 19:11:11
>>666の本には初期化子がある場合のこともガードマクロのこともちゃんと書いてたぞ
中途半端に紹介するのはよくないな
673デフォルトの名無しさん:2006/08/08(火) 05:03:56
>>632
またまた質問ですみません。
・呼ぶ側は、宣言した二次元配列のアドレスを、関数からの戻り値にあるアドレスに書き換える
とありますが、戻り値にあるアドレスに書き換えるとはどうすればよいのでしょうか。
674デフォルトの名無しさん:2006/08/08(火) 08:01:14
#include <stdio.h>
int (*echo(int p[][2]))[2] { return p; }
int main(void) {
int dim[2][2] = { { 1, 2 }, { 3, 4 }, };
int (*p)[2] = echo(dim);
printf("%d¥n", p[1][1]);
return 0;
}
675デフォルトの名無しさん:2006/08/08(火) 17:06:05
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
676デフォルトの名無しさん:2006/08/08(火) 17:36:21
2の乗数で乗除するとき。
R5G5B5をアンパックするとき。
ソースに2ちゃんねるのレスを埋め込むとき。
暇をつぶすとき。
677デフォルトの名無しさん:2006/08/08(火) 18:23:17
>>675
そのコピー、まだ持ってたの?w
678デフォルトの名無しさん:2006/08/08(火) 19:11:01
>>674
解答ありがとうございます!
よくわからない部分もありますが、それはもっと勉強しようと思います。
ありがとうございました。
679デフォルトの名無しさん:2006/08/09(水) 00:24:40
10進数→16進数に変換し、ファイルに出力するプログラムなのですが
ファイルへのヘキサ出力の方法を教えてください。
下記のようなコードを記述したのですが、例えば、「1024」という
数値を入力した場合、ファイル出力への期待する結果は、
「0x0400」なのですが、現在、「0x30343030」という形で
数字が狂ってしまうのです。(1→31という風に扱われています。)
何卒、ご教授ください。

[ソース]---------------
#include<stdio.h>
int main()
{
FILE *outputFile;
unsigned int a;
unsigned char Hex[256];

/* 出力ファイルオープン (バイナリ出力 上書きモード) */
outputFile = fopen( "aaa.txt", "wb+" );
/* 変換対象の数字 */
a = 1024;
/* ヘキサに変換し、文字列で受ける */
sprintf( Hex, "%02X", a );
/* ファイル出力 */
fprintf( outputFile, "%s", Hex );
fclose( outputFile );
return 0;
}
680fputc(a >> 8, fp); fputc(a, fp);:2006/08/09(水) 00:30:24
>>679
初心者スレへどうぞ。
681デフォルトの名無しさん:2006/08/09(水) 00:53:45
>> 680さん
ありがとうございました。
名前のところにあったとおり
記述をしたところ動きました。

色々試行錯誤していたのですが
このやり方に気づきませんでした。
仰るとおり勉強不足でした。
もっと努力します。
本当にありがとうございました。
682デフォルトの名無しさん:2006/08/09(水) 21:40:08
ファイルを読込んで半角スペースで区切られた文字列からfooを含んだ行だけを
出力したいのですが
どうしたらできますか。



hoge.txt
内容
abc def ghi foo
jkl nmo pqr
stu vwx y foo

結果
abc def ghi foo
stu vwx y foo
683デフォルトの名無しさん:2006/08/09(水) 22:03:48
>>682
宿題丸投げなら宿題スレへ行け。
丸投げするつもりが無ければ、どこで何に悩んでいるのか書きなさい。
684デフォルトの名無しさん:2006/08/09(水) 22:15:26
grep " foo"
685デフォルトの名無しさん:2006/08/09(水) 22:49:39
open FH, "hoge.txt";
while(<FH>) {
  if(/ *foo */) {
    print;
  }
}
686デフォルトの名無しさん:2006/08/09(水) 22:49:43
教えてください。

int pthread_create(pthread_t * thread, pthread_attr_t *
attr, void * (*start_routine)(void *), void * arg);

第3引数の宣言なんですが、関数へのポインタという
理解でよいでしょうか。

紛らわしいですが、解釈すると。
start_routine は voidへのポインタの引数を持ち
voidへのポインタを返す関数へのポインタ。
でよいでしょうか。
687デフォルトの名無しさん:2006/08/09(水) 22:51:40
あってるが、voidへのポインタという日本語はおかしい。
688デフォルトの名無しさん:2006/08/09(水) 22:52:32
よい
689デフォルトの名無しさん:2006/08/09(水) 22:53:37
>> 687
ありがとうございます。
では、void * はどのような表現が適切でしょうか。
690デフォルトの名無しさん:2006/08/09(水) 22:55:17
ヴォイドポインター
691デフォルトの名無しさん:2006/08/09(水) 22:56:00
void ポインタ
692デフォルトの名無しさん:2006/08/09(水) 22:56:15
>> 690
なるほど。ありがとうございます。
693デフォルトの名無しさん:2006/08/09(水) 23:24:02
>>689
「なんかポインタ」が正しい。
694デフォルトの名無しさん:2006/08/10(木) 00:13:45
682ですが、
>>685でOKですか?
自分なりに検索しながら考えて、これでいけると思ったのですが、どうも上手くいきません^^);
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *fp;
char s[256];
char *sp
char str[] = "foo";

if ((fp = fopen("hoge.txt", "r")) == NULL) {
printf("file open error!!\n");
exit(1);
}

while (fgets(s, 256, fp) != NULL) {

sp = strstr(s, str);
if(sp != NULL){
printf("%s\n", s);
}

}
fclose(fp);

return 0;
}
695デフォルトの名無しさん:2006/08/10(木) 00:31:10
>>694
256(俗にマジックナンバーと言われる)は#defineしといたほうがいい
696デフォルトの名無しさん:2006/08/10(木) 00:56:46
お〜〜〜〜〜
>>695
こうしたら、上手くいきました、しかしなぜ256では駄目なんですか?

#include <stdio.h>
#include <string.h>
#define READ_DATA_SIZE 256
int main(void)
{
FILE *fp;
char s[READ_DATA_SIZE];
char *sp;
char str[] = "foo";

if ((fp = fopen("hoge.txt", "r")) == NULL) {
printf("file open error!!\n");
exit(1);
}
while (fgets(s, READ_DATA_SIZE, fp) != NULL) {
sp = strstr(s, str);
if(sp != NULL){
printf("%s\n", s);}
}
fclose(fp);
return 0;
}
697デフォルトの名無しさん:2006/08/10(木) 11:18:50
>>696
二箇所に出てくる256が、変えたくなったときに両方とも同時に変えなければならない性質なら
マクロなりconst定数(但しC99)にしておくべき。
但し、>696の場合はfgets(s, sizeof(s), fp)とするのが常道であり、
その場合は必ずしも積極的にマクロにしておく必要がない。
#でもしておいた方が意味を持たせると言う点では可読性が高いので好ましい。
698デフォルトの名無しさん:2006/08/10(木) 13:56:59
sizeofに括弧は必要ありません。
699デフォルトの名無しさん:2006/08/10(木) 14:41:22
>>698
常に不要なら書かないという選択肢もあるが、
必要な場合もあるから書く香具師が多い。
そんなことくらい、大抵の香具師は知っている。
700デフォルトの名無しさん:2006/08/10(木) 14:42:51
sizeof が演算子だと知って知識を自慢したいんだろ。
701デフォルトの名無しさん:2006/08/10(木) 15:33:19
これはANSIの質問でないかもしれませんが、まちがっていたらごめんなさい。
わりと大きなプログラムを作る場合に、
プログラム全体を通して使う
エラー番号とエラーメッセージ
をあらかじめヘッダーとか初期設定の関数とか、あるいはファイルなどで定義しておいて、
それらをプログラム中で使うような方式が、一般的かどうか知りませんが、
わりとよく使われているのでは、と思うのですが、
私も、そういう方式を真似してみたいのですが、どこかに参考となるような
ソースコードありませんかね?
よろしく。
702デフォルトの名無しさん:2006/08/10(木) 15:43:55
>>701
グローバルにenumとconst char* []を用意しておくだけ。
703デフォルトの名無しさん:2006/08/10(木) 16:41:03
>702
ありがとうございます。
わたしもそんな感じで作ってみようかと思ったのですが、
例えば、メッセージの数が増えて100個くらいになったとすると、
enumの並びと char *[]の並びがずれて、混乱するとか
そういう問題ってありませんか?
704デフォルトの名無しさん:2006/08/10(木) 17:57:48
>>703
errordef.h:
  MSG(NO_ERROR, "no errors"),
  MSG(xx_NOT_FOUND, "not found"),
  ...

errors.h:
  enum ErrorCode {
  #define MSG(e, m) e
  #include "errordef.h"
  #undef MSG
  };

errors.c:
  #include "errors.h"
  const char *Messages[] = {
  #define MSG(e, m) m
  #include "errordef.h"
  #undef MSG
  };
705デフォルトの名無しさん:2006/08/10(木) 18:07:09
>704
おお素晴らしい。これなら、メッセージの数が増えても混乱しませんね。
世の中には、優秀な人がいるもんだと感心しています。
さっそく利用させていただきます。ありがとうございました。
706デフォルトの名無しさん:2006/08/10(木) 20:03:36
ぜんぜんすばらしくないよ。
707デフォルトの名無しさん:2006/08/10(木) 21:39:49
>>706
どのへんが?
708デフォルトの名無しさん:2006/08/10(木) 21:56:34
>>666の本に書いてるような理由とか?
709デフォルトの名無しさん:2006/08/10(木) 22:08:53
自分で定義した関数への二次元配列の受け渡しってどうしたらできますか?
710デフォルトの名無しさん:2006/08/11(金) 00:11:46
ポインタについて質問です。
よく関数で
sample(char **ptr){
.......
}
というようなものを見かけるのですが、実際に**ptrが何を指すのかいまいちわかりません。

char型をさすポインタをさすポインタなんだろうなーというくらいで
K&Rを読んでいると
「*pとp[]は同じ」
のようなことが書いてあって、だいぶ混乱してきました。
ひょっとして
function(**ptr)

function(*ptr[])
と等価なのでしょうか?
つまり**ptrは「ポインタが格納された配列」と読み替えていいのでしょうか?
よろしくおねがいします。
711デフォルトの名無しさん:2006/08/11(金) 00:29:37
ポインタ変数をさすポインタです。
それ以上でもそれ以下でもありません。
712デフォルトの名無しさん:2006/08/11(金) 00:39:08
>>709>>710
>>1を読んでから質問しろ
713デフォルトの名無しさん:2006/08/11(金) 01:06:13
>>712
何命令してんだよ?お前に聞いてねーし、答える気がないならいちいちレスするな
役立たず
714デフォルトの名無しさん:2006/08/11(金) 01:17:12
おー、夏らしくて清清しいね。
715デフォルトの名無しさん:2006/08/11(金) 01:41:24
「K&R 5.9ポインタ対多次元配列」の辺りも読んでみるといいと思うよ。
716デフォルトの名無しさん:2006/08/11(金) 01:45:39
>>710
function(**ptr)

function(*ptr[])

function(ptr[][])
は等価で、すべて
function(**ptr)
として扱われる。
717デフォルトの名無しさん:2006/08/11(金) 01:52:53
>>716
嘘付け。

>function(ptr[][])

こんなのがコンパイル通るわけがない。JavaやC#じゃないんだから。
718デフォルトの名無しさん:2006/08/11(金) 02:08:43
**ptrで貰って*ptr->hogeとかしてヲッチ汁
719デフォルトの名無しさん:2006/08/11(金) 23:41:25
>K&Rを読んでいると
>「*pとp[]は同じ」
>のようなことが書いてあって、だいぶ混乱してきました。
 本当にいるんだな、こういうK&Rの被害者。
http://kmaebashi.com/programmer/pointer.html
その他
空の []について

-----------------------------
関数定義の仮引数としては
char s[];
および
char *s;
はまったく同一である。われわれは後者がよいと思うが、それはこのほうが引数がポインタであることをより明確に示しているからである。
--- K&R P.121
アーグググググググ! アーグブイ! アーグシー! K&R第2版から、この部分だけは破り捨ててしまえ! これが通用するのは、 関数定義の引数定義という特殊な状況だけだという点を読み飛ばす危険が高すぎる...
---エキスパートCプログラミング P.238
-----------------------------

**ptr と *ptr[]
が等価になるのは「仮引数のとき」のみ。
この文法規則はあきらかにCの悪い点だと思う。

その他:
http://www.amy.hi-ho.ne.jp/lepton/program/mail/19990628.html
http://www.amy.hi-ho.ne.jp/lepton/program/p3/prog327.html
720デフォルトの名無しさん:2006/08/11(金) 23:57:10
>アーグググググググ! アーグブイ! アーグシー!
これ見るたびに美味しんぼ思い出す。グワバババババ!
721デフォルトの名無しさん:2006/08/12(土) 00:24:06
Cは始めの一歩から混乱してるからねぇ。

int main(int argc, char **argv)
int main(int argc, char *argv[])
722名無し:2006/08/12(土) 18:09:18
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//プレイヤーの手を表示
main() {
int player = 0, computer;

//乱数の種をまく
srand(time(NULL));
printf("【ジャンケンゲーム】");

//プレイヤーの手の入力
printf("ジャンケン・・・(グー:1、チョキ:2、パー:3)>");
scanf("%d", &player);

//コンピュータの手の入力
computer = rand()%3+1;
printf("コンピュータは");
if(computer == 1) {printf("グー\n");}
else if(computer == 2) {printf("チョキ\n");}
else if(computer == 3) {printf("パー\n");}

//勝ち負け判定と結果表示
if(player == computer) {printf("あいこです");}
else if(player == 1 && computer == 2) {printf("プレイヤーの勝ちです");}
else if(player == 2 && computer == 3) {printf("プレイヤーの勝ちです");}
else if(player == 3 && computer == 1) {printf("プレイヤーの勝ちです");}
else {printf("コンピュータの勝ちです");}
return 0;
}
723名無し:2006/08/12(土) 18:09:57
上は単純なジャンケンゲームのプログラムである。
このプログラムは、自分の手を選択するときに「1,2,3」以外の数字を入力すると
コンピュータはグー
コンピュータの勝ちです。
このように表示され、コンピュータが勝ってしまう。
さぁ、「1,2,3、」以外の数字を入力したときに
コンピュータはグー
プレイヤーの不正によりコンピュータの勝利
こういった具合に実行されるようにプログラムを書き換えなさい。
724デフォルトの名無しさん:2006/08/12(土) 18:19:26
main() {
int player = 0, computer;

//乱数の種をまく
srand(time(NULL));
printf("【ジャンケンゲーム】");

//プレイヤーの手の入力
printf("ジャンケン・・・(グー:1、チョキ:2、パー:3)>");
scanf("%d", &player);

//コンピュータの手の入力
computer = player;
printf("コンピュータは");
if(computer == 1) {printf("グー\n");}
else if(computer == 2) {printf("チョキ\n");}
else if(computer == 3) {printf("パー\n");}

//勝ち負け判定と結果表示
if(player == computer) {printf("あいこです");}
else if(player == 1 && computer == 2) {printf("プレイヤーの勝ちです");}
else if(player == 2 && computer == 3) {printf("プレイヤーの勝ちです");}
else if(player == 3 && computer == 1) {printf("プレイヤーの勝ちです");}
else {printf("プレイヤーの不正によりコンピュータの勝利");}
return 0;
}
725デフォルトの名無しさん:2006/08/12(土) 18:25:19
//勝ち負け判定と結果表示
if(player > 3 || player == 0) {
printf("プレイヤーの不正によりコンピュータの勝利");
}
else if(player == computer) {
printf("あいこです");
}
(以下略)
726デフォルトの名無しさん:2006/08/12(土) 18:37:37
//プレイヤーの手の入力
printf("ジャンケン・・・(グー:1、チョキ:2、パー:3)>");
scanf("%d", &player);
if( ! (player==1 && player==2 && player==3)){
printf("コンピュータはグー\n"); // ←いるのか、これw
printf("プレイヤーの不正によりコンピュータの勝利");
return 0;
}
(以下略)
727名無し:2006/08/12(土) 18:40:02
>>726
いらないと思われ。
728デフォルトの名無しさん:2006/08/13(日) 00:36:36
>>719
「完全制覇」のページひととおり読んでみた。
K&Rは書かれた時代のハードの事を考えれば、しょうがないかな、って部分もあるし
そのほうが現実的だなって部分もある。(たとえばポインタと配列では一般に前者が速いとか)
現在の環境を踏まえて振り返って批判するのは、ちょっとアレだな、とおもう。

宣言の書きかたについては、まぁ、やっちゃったよね、ってかんじだ。
729デフォルトの名無しさん:2006/08/13(日) 05:22:50
質問です.
x86 の movntq をつかったような、キャッシュの汚染をしない memcpy もどき
の関数って用意されて無いんでしょうか?

また、こういった関数がほしい場合、自分でアセンブリ記述するのが普通なん
でしょうか?
730デフォルトの名無しさん:2006/08/13(日) 05:34:30
>>729
このスレ的には有り得ない。そもそも標準Cにキャッシュの概念そのものがない。
731デフォルトの名無しさん:2006/08/13(日) 05:42:14
>>730
C99にキャッシュについての記述があるけどな。
732デフォルトの名無しさん:2006/08/13(日) 07:09:51
restrictedとかvolatile関係で?
733デフォルトの名無しさん:2006/08/13(日) 10:25:16
main関数の中に、
extern unsigned long型を
宣言することは出来ないんですか?
734デフォルトの名無しさん:2006/08/13(日) 10:59:10
unsigned long ColorBit_test[8][8]={
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}
};

ねえこの宣言の仕方なんか間違ってる?
>>733
やってみたら?

>>734
なんでそんなこと聞くの?
736デフォルトの名無しさん:2006/08/13(日) 11:23:49
>>735
こんな警告が出ます

p5.c:80: error: variable-sized object may not be initialized
p5.c:81: warning: excess elements in array initializer
p5.c:81: warning: (near initialization for `ColorBit[0]')
p5.c:81: warning: excess elements in array initializer
p5.c:81: warning: (near initialization for `ColorBit[0]')
p5.c:81: warning: excess elements in array initializer
p5.c:81: warning: (near initialization for `ColorBit[0]')
737デフォルトの名無しさん:2006/08/13(日) 13:15:08
unsigned long ColorBit_test[8][8]={
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933,},
};
738名無し:2006/08/13(日) 13:35:52
さっきから、2chに書き込めないので
テスト。
739名無し:2006/08/13(日) 13:43:22
>>738
どうやら書き込めたようだな。
お前はまた、大人への階段を一歩上がったんだ。
おめでとう。
740デフォルトの名無しさん:2006/08/13(日) 13:47:27
>>737
それでもおんなじエラーが出るんだけど…
741デフォルトの名無しさん:2006/08/13(日) 13:53:46
n=4:1234,1243,1324,1342,1423,1432,2134,2143,2314,2341,2413,2431・・・
のように、1〜n(実行時に決定される、100を超えない)の順列全通りを表示するプログラムのアルゴリズムを教えてください。
742デフォルトの名無しさん:2006/08/13(日) 14:00:04
>>740
定義とは別にどっかで宣言してませんか?
>>741
宿題は自分でやれ
743デフォルトの名無しさん:2006/08/13(日) 14:14:31
>>736
そのメッセージには ColorBit とか書いてあるんだが、
本当に ColorBit_test の部分に問題があるのか?
744デフォルトの名無しさん:2006/08/13(日) 14:17:39
C言語の宿題やってる俺がマジレス

#include<stdio.h>
int main(int argc, char **argv)
{
unsigned long ColorBit_test[8][8]={
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}
};
puts("動いたにょ");
return 0;
}
745名無し:2006/08/13(日) 14:26:32
流れを変えて悪いが、C言語でウィンドウを作ることは可能か?
746デフォルトの名無しさん:2006/08/13(日) 14:27:38
>>742
宣言してません
>>743
あ、ちょっと書き直したんです。気にしないでください。
ColorBitでもColorBit_testでも同じ症状です。
747デフォルトの名無しさん:2006/08/13(日) 14:29:29
>>745
このスレとしては
コンソールにテキストでなら可能でし
748デフォルトの名無しさん:2006/08/13(日) 14:37:10
>>747
MS-DOSの頃のIDEはやってたよな
749デフォルトの名無しさん:2006/08/13(日) 15:03:01
原因が分かった

extern int Width;
extern int Height;

main(){
Width=8;Height=8;
int w=Width,h=Height;
unsigned long ColorBit[h][w]={
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}
};

これだと警告が出る。
なぜ?
750デフォルトの名無しさん:2006/08/13(日) 15:06:01
main(){
#define w 8
#define h 8

unsigned long ColorBit[h][w]={
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933},
{0xffffff,0xffffff,0xffeeaa,0xffccaa,0xaabb99,0x160394,0xa83720,0xcc9933}
};

751デフォルトの名無しさん:2006/08/13(日) 15:09:55
Win3.1+MS-Cでは自力でWinMainから何から書いてた。
Unixならどうすんだろうね。
OX-Libraryしか使ったこと無いからワカンネ。
752デフォルトの名無しさん:2006/08/13(日) 15:11:08
extern って使っちゃ駄目なの?
753デフォルトの名無しさん:2006/08/13(日) 15:13:29
externしてる変数の実態は何処に?
754デフォルトの名無しさん:2006/08/13(日) 15:17:41
>>749のまんま

文の最初でexternして、
直後のmainの最初で=8してる。

あとは下のほうで定義してる関数に使ってる。
755デフォルトの名無しさん:2006/08/13(日) 15:18:47
externどうのでなくで、配列サイズのhとwは定数でないとだめ
ColorBit[h][w]
     ~~~~~~
C99なら話は別なんだけど
756デフォルトの名無しさん:2006/08/13(日) 15:27:05
いちいちC99の話をする奴、ウザイな
757デフォルトの名無しさん:2006/08/13(日) 15:37:49
そんなのいいじゃんと思ったが、C99はANSI-Cじゃないんだよな。
差別すんのもいかがなもんかと思いつつ、何気に決定的な違いも多いし
さあどうしたもんか。
758デフォルトの名無しさん:2006/08/13(日) 15:40:03
>>755 d!!

あと余談だけどさ
どうして関数の外でextern定義すると、

p5.c:6: warning: `Width' initialized and declared `extern'
p5.c:7: warning: `Height' initialized and declared `extern'
p5.c:8: warning: `ColorBit' initialized and declared `extern'

って警告されちゃうの?
759デフォルトの名無しさん:2006/08/13(日) 16:01:33
hoge.c:
int Width=8;
p5.c:
extern int Width;

変数 Width の実体は hoge.c にあって、
p5.c からはそれを参照しているにすぎない。

初期化は hoge.c で行なうべきなのだが、
p5.c で初期化が行われているからだと思う。

Width は extern にすべき変数なのかな?
760デフォルトの名無しさん:2006/08/13(日) 16:21:19
>>759
なるほど〜
いや、これなんです。↓
ttp://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H9a2/pm07.html
勉強してたんだぉ
はじめからexternって書いてあったんだ
画像値を設定するプログラムは別に書くって想定だったんだな、きっと。
とn!
761デフォルトの名無しさん:2006/08/14(月) 01:36:57
>>756-757
このスレタイの「ANSI」は、C89に限定するためのものではなく
標準Cであることを示すためのものであったはずで、
C99 は ISO だろ、などという下らない突っ込みは却下。
762デフォルトの名無しさん:2006/08/14(月) 01:49:13
なんなら次スレの名前を【ANSI-C】 C言語なら俺に聞け! Part 129 【ISO C】【JIS C】とするという手もある。
763デフォルトの名無しさん:2006/08/14(月) 02:27:50
いい加減にしないと、_Complexとかrestrictとか平気で使うぞ。
764デフォルトの名無しさん:2006/08/14(月) 02:47:59
つーか>>737だと8を直に書き込んでるじゃん
>>746といい勝手にソース書き換えてエスパーに期待してたら
分かるものも分からなくなるに決まってるだろ
765デフォルトの名無しさん:2006/08/15(火) 21:53:05
こんな感じでどうかね?
【ISO/JIS/ANSI】 標準C 【環境依存お断り】
766デフォルトの名無しさん:2006/08/15(火) 21:57:06
ここで環境依存な質問する奴は
自分の質問内容が環境に依存する事を知らないと思います先生
767デフォルトの名無しさん:2006/08/15(火) 22:40:51
2辺りに何が標準で何が非標準かと書くべきか?
768デフォルトの名無しさん:2006/08/15(火) 23:04:23
誰かしら誘導するからどっちでもよかろ
769デフォルトの名無しさん:2006/08/15(火) 23:12:35
【どんと来い】C【超環境依存】
770デフォルトの名無しさん:2006/08/16(水) 01:26:52
もとのタイトルが跡形もなくなるのはどうかと
【ISO/JIS/ANSI/標準C】 C言語なら俺に聞け! Part 129
771デフォルトの名無しさん:2006/08/16(水) 19:05:31
fgetsなどでは、char型のポインタを返しますが、このポインタが指すメモリはどのように確保されているのでしょうか。
772デフォルトの名無しさん:2006/08/16(水) 19:08:12
ソース嫁
773デフォルトの名無しさん:2006/08/16(水) 19:25:11
>>771
マニュアルページを読め。
要は、引き数をそのまま返すかNULLを返すかだ。
774デフォルトの名無しさん:2006/08/16(水) 19:37:33
アドレス帳の作り方を是非
775771:2006/08/16(水) 19:47:32
呆けてました。

第一引数が必要なサイズが確保されたメモリへのポインタだということが何故か飛んでいました。
すいませんでした。
776デフォルトの名無しさん:2006/08/16(水) 21:15:49
>>771
OSががんばってる
777デフォルトの名無しさん:2006/08/17(木) 15:59:02
オーエス!オーエス!
778デフォルトの名無しさん:2006/08/18(金) 03:15:05
しかしOSのアロケーションを生で使っている処理系ばかりではない。
779デフォルトの名無しさん:2006/08/18(金) 09:58:23
同じパソコンにインストールしてあるLinuxとwindows2000で、全く同じソースを
同じコンパイラーでそれぞれでビルドして実行したら、実効速度に差は出るものでしょうか。
780デフォルトの名無しさん:2006/08/18(金) 10:37:23
>>123
そりゃまぁOSのAPIなんかを呼んでいれば当然実行されるコードは異なるわけだから。
781sage:2006/08/18(金) 14:27:50
配列のキャストについて質問です。
int *x1;
char *c1;
*x1 = 0x3456;
c1 = (char *) x1;
printf( "x1: %x c1[0]: %x c1[1]: %x\n", *x1, *c1, *(c1+1));

(結果 x1: 3456 c1[0]: 56 c1[1]: 34)

のように、2バイトの0x3456を1バイトずつに分割したらどうして
c1には34,56の順に入らず56,34の順に入ってしまうんでしょうか?
782デフォルトの名無しさん:2006/08/18(金) 14:28:51
>>781
モトローラのPCでやれ
783デフォルトの名無しさん:2006/08/18(金) 14:31:11
>>781
ラージエイリアンとスモールエイリアン
784デフォルトの名無しさん:2006/08/18(金) 14:32:17
>>781
つ[エンディアン]
785デフォルトの名無しさん:2006/08/18(金) 14:33:36
ファットエイドリアンとスリムエイドリアン
786デフォルトの名無しさん:2006/08/18(金) 15:04:44
VIPエンディアンとラウンコエンディアン
787デフォルトの名無しさん:2006/08/18(金) 15:08:06
int i = 0x3456;
short s;
memcpy(&s, &i, sizeof (s));
こういうのが期待通り動くほうがいいかな〜と思ったからじゃないかとおれは思う。
788sage:2006/08/18(金) 15:08:57
あ、そういうことだったんですね。
Intelだからリトルでした。
789デフォルトの名無しさん:2006/08/18(金) 22:11:23
なんでビッグエンディアンで統一しないのかね〜
本当にリトルエンディアンは使いづらい。
790デフォルトの名無しさん:2006/08/18(金) 22:20:15
リトルエンディアンの方が、CPUに取って都合の良いこともあるのだよ
791デフォルトの名無しさん:2006/08/18(金) 22:21:27
え、逆じゃね?
ビッグエンディアンって扱いにくいにも程があるだろ。
ビッグエンディアンの利点があるなら教えてくれ。

とりあえず、リトルエンディアンの利点は
int32_tからint16_tやint8_tにキャストするのは単に上位ビットを無視するだけですむ。
792デフォルトの名無しさん:2006/08/18(金) 22:26:17
stdlib.h の rand 関数(一応、環境は VisualStudio.NET 2002 )についてなんですが
rand() だけを延々実行しつづけた場合、実行回数が int の上限値に達する前であっても
一度出てきた数字が再度出てくるということはありえますよね?
793デフォルトの名無しさん:2006/08/18(金) 22:30:58 BE:104838473-2BP(201)
>>791
上位ビットを無視するってのは、リトルでもビッグでも同じだとおもうが。。。
794デフォルトの名無しさん:2006/08/18(金) 22:31:34
エンディアンはメモリ上の配置の話だろ。
intN_t から intM_t への変換は(レジスタに収まる限り)関係ないんじゃないか?

エンディアンが問題になるようなコードは、どうせ未定義か、
よくて実装定義な動作になるだろうし。
795デフォルトの名無しさん:2006/08/18(金) 22:33:54
>>791
ビッグエンディアンは人にやさしい(人が理解するのと同じ順番でメモリに格納されるから)
796デフォルトの名無しさん:2006/08/18(金) 22:39:16
>>792
規格上はありえるんだけど、そういう実装はあんまりないだろうなぁ。
797デフォルトの名無しさん:2006/08/18(金) 22:40:59
今、LANのドライバ開発をしているけど
LANコントローラ(LAN91C111)自体はリトルエンディアンで設計してあり
実際に搭載するCPUはSH-2はビッグエンディアンで、正直作るのにめんどくさい。

しかもレジスタアクセスはバイトスワップでデータアクセスはそのまま。
(接続によってはレジスタアクセスはそのままで、データアクセスはバイトスワップする場合もある)

I/Oレジスタアクセスする際にバイトスワップするべきか
I/Oレジスタの定義ファイルをリトルエンディアン用とビッグエンディアン用の二つを作るべきか・・・
2つだとメンテが面倒だがスワップの必要がない分ちょっと処理が早くなるかもしれないけど。

ところで誰かSH-2にLAN91C111を搭載して、コード作った人といる?
798デフォルトの名無しさん:2006/08/18(金) 22:43:50
>>792
全部の数字がでるまで各数字が一回しか出ない数列を乱数列と呼ぶ人間は見たことがない。
799デフォルトの名無しさん:2006/08/18(金) 22:46:36
>>797
えーと、一度スレタイ読むことをおすすめします。
800デフォルトの名無しさん:2006/08/18(金) 22:51:00
>>797
エンディアンの違いを吸収するインターフェースを決めて、
それぞれのエンディアン用に実装を書くのがいい。

そこから先はスレ違いだから、ここで話続けないでね。
801デフォルトの名無しさん:2006/08/19(土) 00:03:10
すみません。まるっきり場の雰囲気を呼んでいませんでしたね。
後から自分で見ても、何だこの書き込みは・・・と思いました。


802ふいんき:2006/08/19(土) 10:53:33
間違って呼ばれたのは私ですか?
803デフォルトの名無しさん:2006/08/19(土) 15:04:01
>>791
おまえさん、どっち派だ?

void foo(char *c, int *i)
{
*c = (char)*i; //1
*c = *(char *)i; //2
}

# ビットマスクも気にはなるが話がそれるんであえて外している
804デフォルトの名無しさん:2006/08/19(土) 15:25:03
Cのスレなんで1だがアセンブラなら通常2かな。いやおれ791じゃないかも。
805デフォルトの名無しさん:2006/08/19(土) 16:14:31
>>803
漏れは、1
1と2で結果が異なる場合ってある?

int *(*(*i)())[5] とした場合iは何を指してるか教えて、
これってどのような手順で解釈するんですか? ポインタって難しい。
教えて君ですまそ。
806デフォルトの名無しさん:2006/08/19(土) 16:30:20
ヒント:エンディアン
807デフォルトの名無しさん:2006/08/19(土) 16:37:38
そういうのを実際に使うソースを見たことがないが、もしあったら日本語に変換する。
iはポインタで(それが指すものは)
関数で戻り値がポインタで(それが指すものは)
要素5の配列で(それの中身は)
ポインタで(それが指すものは)
int
こういうやりかた書いてたのはエキスパートCプログラミングだったかなあ
まちがってたらごめぽ
808デフォルトの名無しさん:2006/08/19(土) 16:43:54
K&Rのど真ん中に書いてあるだろ、そんなの
809デフォルトの名無しさん:2006/08/19(土) 16:52:28
そうなん?英語のK&Rしか持ってなくて探すのが大変。ちょっと探してみるが。

ついでにやりかたを説明しとくぞ。変数名のとこからはじめて
右に向かって解釈、なくなったら左に向かって解釈だ。
括弧はこの順番を変えるものだ。
int *i[] で練習すると
iは要素数不定の配列で中身は
ポインタで指すものは
int
これで怖いものなしだ。
810デフォルトの名無しさん:2006/08/19(土) 17:01:57
K&R の 5.12 Complicated Declarations にありますた。
 x is a function returning a pointer to an array of pointers to function returning char
 char (*(*x())[])()
だってさ。
811デフォルトの名無しさん:2006/08/19(土) 17:32:37
812805:2006/08/19(土) 17:38:30
みなさま有難うございます。
これは、ポインタの演習問題で、これが正しく解釈できる位だとポインタの解釈に関しては及第点だと言われた。

漏れのint *(*(*i)())[5]の解釈手順は
(*i): iはポインタです。
(*i)():iは関数をポイントしている。
(*(*i))():関数の戻り値はポインタである。
(*(*i)())[5]:戻り値のポインタは要素5の配列をポイントしている。
int *(*(*i)())[5]:配列の要素はint型のポインタ(int *型)である。

まとめると、ポインタ変数iはint *型を5つ持つ配列を指すポインタを返す関数を指すポインタである
と漏れは解釈したのですが、自信が無かったんで質問したしだいです。何か解釈あってそうでうれしーーです。
逆に、このようなポインタ変数を宣言しろと言われれば、むりぽ。
813デフォルトの名無しさん:2006/08/19(土) 17:44:23
cdecl
814デフォルトの名無しさん:2006/08/19(土) 18:02:22
そんな複雑な変数宣言出てくるようなソースは読みたくないな。
815デフォルトの名無しさん:2006/08/19(土) 18:08:50
K&Rは変数定義の定義を完全に説明しているがわかりにくい。これ読んでいっぱつで理解できたら
エスパー認定。
816791:2006/08/19(土) 18:31:59
>>803
そりゃ普通に前者だな。
エンディアンが絡む処理は言うまでもなく環境に依存しているから必要なとき以外する必要はない。

俺が言いたいのは>>789がリトルエンディアンが使いづらいと言う以上、
ビッグエンディアンがリトルエンディアンに勝っている環境に依存した点が存在するはずだろ。
それが何なのか教えてくれと聞いているだけ。

俺はいままでリトルエンディアンは賢いなと思ってた事は数多くある。
でも、ビッグエンディアンは便利だなと思ったことがないからな。そこが疑問になったわけ。

まぁ、C言語の範囲からはどうみても外れるからもういいや。ゴメン
817デフォルトの名無しさん:2006/08/19(土) 18:57:13
>ビッグエンディアンがリトルエンディアンに勝っている環境に依存した点が存在するはずだろ。

どっちもどっちということもあるな
だが、それでは「使いにくい二もほどがある」という主張は通らない
818デフォルトの名無しさん:2006/08/19(土) 21:08:00
>>795 が言ってるが、16進ダンプ眺める場合BIGのが直感的でわかりやすい。慣れの問題だが。
BIG/LITTLEどっちでも動くCPUがけっこうある(MIPSとかARMとか)ことから、CPUにとっては些細な問題なのだろうが
ならば「統一してくれ」という意見ももっとだ。ISO9660の仕様なんかは悲惨すぎる。
819デフォルトの名無しさん:2006/08/19(土) 21:08:54
ごもっと。
820デフォルトの名無しさん:2006/08/20(日) 02:08:47
>>818
> ISO9660の仕様なんかは悲惨すぎる。
しかもアライメントを合わせていないから結局1バイトずつ読まなくてはならず
両方のインデックスを持っている意味がないという間抜け仕様
821デフォルトの名無しさん:2006/08/20(日) 02:16:06
ステキ仕様♥
822デフォルトの名無しさん:2006/08/20(日) 22:55:50
case文の値に他のファイルで定義した const int を使用したいのですが
どうしたらよいでしょうか
823デフォルトの名無しさん:2006/08/20(日) 23:06:37
>>822
無理。 case に指定する値は定数式じゃないと駄目。
残念ながら他のファイルで定義した const int は定数式になれない。
const int を #define で置き換えられればいける。
824822:2006/08/20(日) 23:18:19
>>824
ありがとうございました。
if〜else ifにしました。
これだとbreak;なしの連続処理が出来ないですけど
仕方ないです。
825デフォルトの名無しさん:2006/08/20(日) 23:26:07
C++なら、ヘッダでconstを付けて定義すれば、それを定数として扱えるはず。
826822:2006/08/20(日) 23:30:10
>>825さん
extern 宣言の方にも const 付けているんですけどね…。
値は別の定数 + 定数というものなので define だとだめなんです。。
827デフォルトの名無しさん:2006/08/20(日) 23:40:38
ビットフラグじゃあかんの?
828デフォルトの名無しさん:2006/08/21(月) 00:10:08
enumは?
829デフォルトの名無しさん:2006/08/21(月) 00:15:55
>>826
define だと駄目な理由になってないような気がする。
830デフォルトの名無しさん:2006/08/21(月) 02:18:13
【就職】「中韓などアジアの優秀な人材を、もっと日本企業に」 留学生2000人に無償奨学金月20〜30万円…経産省・文科省[08/20]★7
1 :試されるだいちっちφ ★ :2006/08/21(月) 00:42:25 ID:???0
★アジア留学生に奨学金、日本で就職促す 2千人に国支給

 中国、韓国などアジア諸外国の優秀な人材に、日本企業にもっと入ってもらおうと、
日本の大学で学ぶ留学生への無償奨学金制度を07年度から経済産業・文部科学
両省が始める。大学・大学院に、採用意欲のある企業と提携して、留学生向けの専門
講座やビジネス日本語講座などの2年間の特別コースを新設してもらい、その受講生
1人あたり、住居費分、学費免除分、生活費など月計20万〜30万円相当の支給を
検討中だ。支援対象は約2000人を想定している。

 特別コースは企業の中核を担える人材の育成が目標で、電機・IT業界、環境関連
産業など特定分野の企業群と提携し、それらのニーズにあった専門性の高い授業を
想定。また、留学生の日本企業就職率が伸びない理由となっている、日本語の力不足
や企業風土の特徴をあまり知らないことなどを解消するため、特別コースには実用性
の高い日本語会話の授業や日本の企業文化などを教える授業のほか、インターンシップ
制度も盛り込んでもらう。両省が授業内容を審査し、奨学金制度を適用するかどうか
決める。

 両省は関連予算として07年度予算の概算要求に約60億円を盛り込む方針。この中
には、同じ目的で、既存の国費留学制度を使っている留学生らが無料参加できる就職
支援プログラムも加わる。

 経産省によると、04年度は約3万人の留学生が日本の大学・大学院を出たが、日本
国内で就職した留学生は約5700人にとどまった。留学生支援策の拡充で、アジアの
優秀な人材の定着を増やそうとしている。

朝日新聞 2006年08月20日06時24分
http://www.asahi.com/job/news/TKY200608190397.html
前スレ(立った日時:2006/08/20(日) 07:02:40)
http://news19.2ch.net/test/read.cgi/newsplus/1156074203/
831jyo:2006/08/21(月) 13:51:39
計算トレーニングプログラムを作成したいですが?
計算は、足し算、引き算、掛け算、割り算を選択する。
桁数は1桁、2桁をはじめに選択する。
計算式の数値はランダムで表示する。
計算式及び、答えを配列に保存し、終了後に全て計算式と答えを表示する。
問題は10問とする。
そのときの点数を表示する。
結果表示の時、一緒にかかった時間も表示する
832デフォルトの名無しさん:2006/08/21(月) 14:07:46
>>831
そうか、じゃ作れ

=== 終了 ===
833デフォルトの名無しさん:2006/08/21(月) 14:34:09
>作成したいですが?
質問の全てを「?」に集約されても、何を訊きたいのか判らない。
834デフォルトの名無しさん:2006/08/21(月) 14:42:16
>>833
きっと、「作成したいですか?」のTypoだよ。
835デフォルトの名無しさん:2006/08/22(火) 13:25:00
2-3木への挿入の関数insertは、2つの節点a,bの、a以下とaからbの間とb以上で場合分けしてそこからまた再帰的にinsert関数使うんでしょうか?
836デフォルトの名無しさん:2006/08/22(火) 13:45:12
ただの分木ならどこにでも挿入していいはずだが。
ちゃんと説明しろ。
837jyo:2006/08/22(火) 15:56:43
教えるなら教えるえらそうな顔するなぼげ
838デフォルトの名無しさん:2006/08/22(火) 16:53:12
教えるつもりは毛頭ない。
839デフォルトの名無しさん:2006/08/22(火) 18:23:31
プログラムに与えた引数をうまく保管しておいて、その後の処理でスマートに使いたいのですが、
皆さんどのようにされていますか?
何らかの構造体とか定義しておいて、その中に、引数の情報を保管しておくとか、そういう作戦が
よいですか?
今までは、自作のgetopt()みたいなのを、作っていて、それでやっていたのですが、
本物のプログラマーの皆さんはどんな方法でやられているのか、お教え願いたいです。
よろしく。特に、複数のプロジェクトがあっても、汎用的に使えるような
方法があれば、お教え願いたいです。
840case-by-case:2006/08/22(火) 18:25:42
出たな偽物
841デフォルトの名無しさん:2006/08/22(火) 20:31:27
今週の始めに、やさしいC入門っていうのを買ってきたのですが
そのなかに、小さい型への代入と言うのがありキャストをしているのですが
サンプルでは
float a=10.5; int b; b=a;
みたいなことをやっています。 これだと、小数点以下が切り捨てられるだけなのですが
int a=100000; short int b; b=(short)a;
とすると、わけの分からない数字が出ます。
これは何故なのでしょうか? その本には小さい型に代入すると、情報が一部失われると書いていますが
全く違う数字になっています。
842デフォルトの名無しさん:2006/08/22(火) 20:33:30
>>839
初期設定の読み込みと書き込みが出来るクラスつくる。まず初期設定読み込んでから
引数で上書きできるようにする。場合によりけりだけどな。
ただしおれはニートだ。
843デフォルトの名無しさん:2006/08/22(火) 20:33:45
一部失われてるから
844デフォルトの名無しさん:2006/08/22(火) 20:36:00
186a0 => 86a0
845デフォルトの名無しさん:2006/08/22(火) 20:49:35
>>839
case by case
846デフォルトの名無しさん:2006/08/22(火) 22:08:04
>>841
小さいほうの型で表すことができる値の範囲から外れている場合、結果は不定。
どんな値になってもおかしくはない。
847デフォルトの名無しさん:2006/08/22(火) 23:25:30
ポインタのポインタとかポインタのポインタのポインタとかってあるじゃないですか。
あれって、いくつ上のポインタを参照してもちゃんとアドレス持ってるんですか?
物理的なイメージがわかないんだけど。。ポインタのポインタくらいならわかるけど
848デフォルトの名無しさん:2006/08/22(火) 23:26:40
>>847
「上」「アドレス持ってる」の意味がわからん。
849デフォルトの名無しさん:2006/08/22(火) 23:27:17
>>847
アセンブラ勉強するといいよ
850デフォルトの名無しさん:2006/08/22(火) 23:36:02
>>847
いちばん(・∀・)イイ!!のは、ハードウエアでデコーダ作ってみること
74393 と 74139 と LED マトリクスで何か表示させたりしてみると
アドレスって根本的に本質的に何なのかを体でおぼえることができる
851デフォルトの名無しさん:2006/08/22(火) 23:47:40
>>847
ポインタ
 ポインタが指す先にある中身を見ると、実データが入っている
ポインタのポインタ
 ポインタのポインタが指す先にある中身を見ると、実データが入っている
 ポインタは、「ポインタのポインタ」のアドレスを指し示している
ポインタのポインタのポインタ
 ポインタのポインタのポインタが指す先にある中身を見ると、実データが入っている
 ポインタのポインタは、「ポインタのポインタのポインタ」のアドレスを指し示している
 ポインタは、「ポインタのポインタ」のアドレスを指し示している
ポインタのポインタのポインタのポインタ
 ポインタのポインタのポインタのポインタが指す先にある中身を見ると、実データが入っている
 ポインタのポインタのポインタは、「ポインタのポインタのポインタのポインタ」のアドレスを指し示している
 ポインタのポインタは、「ポインタのボインタのポインタ」のアドレスを指し示している
 ポインタは、「ポインタのポインタ」のアドレスを指し示している
852デフォルトの名無しさん:2006/08/22(火) 23:50:00
僕のちんこもポインタになりそうです
853デフォルトの名無しさん:2006/08/22(火) 23:54:29
ポインタを安易にアドレスに結びつける説明は疑ったほうがいい。
たとえばアドレスはそこにあるデータの型について無頓着だ。
854デフォルトの名無しさん:2006/08/22(火) 23:56:40
>>853
そうだね
B のポインタがまさにそう
855デフォルトの名無しさん:2006/08/22(火) 23:57:15
>>851
ちと違わね?

ポインタ
 「ポインタ」が指す先にある中身を見ると、実データが入っている
ポインタのポインタ
 「ポインタ」が指す先にある中身を見ると、実データが入っている
 「ポインタのポインタ」には、「ポインタ」のアドレスが入っている
ポインタのポインタのポインタ
 「ポインタ」が指す先にある中身を見ると、実データが入っている
 「ポインタのポインタ」には、「ポインタ」のアドレスが入っている
 「ポインタのポインタのポインタ」には、「ポインタのポインタ」のアドレスが入っている
ポインタのポインタのポインタのポインタ
 「ポインタ」が指す先にある中身を見ると、実データが入っている
 「ポインタのポインタ」には、「ポインタ」のアドレスが入っている
 「ポインタのポインタのポインタ」には、「ポインタのポインタ」のアドレスが入っている
 「ポインタのポインタのポインタのポインタ」には、「ポインタのポインタのポインタ」のアドレスが入っている
856デフォルトの名無しさん:2006/08/23(水) 00:05:58
>>849
>>850
メモリ上でどういったことをしてるか物理的に理解するべしってことですよね。。
ハードウェアでデコーダを作る…すいません何をすればいいのかすらわかりません。。
アセンブラは興味あるんでちょっとかじってみようかなとおもいました。

>>851-855
なんとなく実態のばしょ差しているって言うのはわかるんですが、Cだとポインタ型って定義すると
領域が確保されて数値が入るじゃないですか。てことはポインタのポインタにも、
ポインタのポインタのポインタにもポインタのポインタの…にも領域が確保されてるのか??
でもそれだといくらメモリがあっても足らないからそんなわけないし…
じゃあポインタのポインタのポインタの…x100のアドレスの数値が入ってる領域って
一体どこにあるんだ〜って思った次第です。こういうの理解されてる方からしたら
何いってるんだこの人って感じなのかもしれないです
857デフォルトの名無しさん:2006/08/23(水) 00:14:11
>>856
> ポインタのポインタのポインタにもポインタのポインタの…にも領域が確保されてるのか??
確保されてるっつーか、確保しなきゃならねえんだから、億劫がらずにmallocしてやれよ

> でもそれだといくらメモリがあっても足らないからそんなわけないし…
ポインタのポインタの…を何重までやれるかっつーのは処理系によるような気がするが
その気になりゃヒープの限りメモリの限り、そのポインタのポインタの…にmalloc
できるんじゃね?
858デフォルトの名無しさん:2006/08/23(水) 00:36:25
>>856
何いってるんだこの人。別スレでやってほしいかなぁ。
859デフォルトの名無しさん:2006/08/23(水) 00:41:18
日本語でおk
860デフォルトの名無しさん:2006/08/23(水) 00:48:18
そういや、ポインタとアドレスには何の関係もないって暴れてた奴がいたよなぁ
861デフォルトの名無しさん:2006/08/23(水) 01:00:45
オレは、理解なんかしなくていいと思う
そう、理解なんかしなくても使えればそれでいいんだ
862デフォルトの名無しさん:2006/08/23(水) 01:18:32
ポインタ
  プログラム上で使用する、何らかのオブジェクトを指し示す為の値。

ポインタのポインタ
  ポインタの内、指し示してるオブジェクトがポインタであるもの。
863デフォルトの名無しさん:2006/08/23(水) 03:20:57
まさに「何いってるんだこの人」てかんじなのだが。おそらく正攻法の説明では847を救うことはできまい。
誰かエスパーのひと >>847 >>856 の頭の中身を解説してくだしい。
864デフォルトの名無しさん:2006/08/23(水) 05:43:43
execl関数について教えて下さい。

execl関数のマニュアルを読むと、
The exec family of functions replaces the current process image
with a new process image.
とあります。
直訳すると、現在のプロセスイメージを新しいプロセスイメージに置き換える。
ということになると思います。

いまいちよくわからないのですが、
execl関数を使うシュチュエーションってどういう状況があるでしょうか?
865デフォルトの名無しさん:2006/08/23(水) 06:06:11
おそらく>>856

int *p;

と宣言するとポインタ以外にint型の領域も一緒に確保されると思ってる初心者。
866デフォルトの名無しさん:2006/08/23(水) 06:09:54
だめだこりゃ
867デフォルトの名無しさん:2006/08/23(水) 06:19:20
>>864
UNIX系OSは今でもinit以外のすべてのプロセスはfork()+exec()で作られてんじゃね?
windowsではほとんど使うこと無いなあ。あるプロセスの環境変数変えて実行したいとかstdoutを強制的に
ファイルにして実行したいとかかな。
868デフォルトの名無しさん:2006/08/23(水) 06:19:42
>>864
環境依存スレに池。標準Cにexeclなんて関数はない
869デフォルトの名無しさん:2006/08/23(水) 06:26:48
MSDNには
Visual C++ 2005 では、この POSIX 関数は使用しないでください。代わりに ISO C++ 準拠の _execl を使用してください。
て書いてるな。標準って難しいぜ。
870デフォルトの名無しさん:2006/08/23(水) 10:39:07
>845
>case by case
やはり、そうですかね。
でも、何かうまい方法があるのではと、期待していたのですが。
。。。
871デフォルトの名無しさん:2006/08/23(水) 11:01:30
>>839
C++ 的にはプログラム全体を統轄するクラスに保持しとくことになるんだが、
C 的にはグローバル変数に保持しとけばいいんじゃないかと思う。
872デフォルトの名無しさん:2006/08/23(水) 11:26:11
コマンドプロンプトが
C:\Documents and Settings\○○(本名)>
なんですが、テキスト(10日でおぼえるC言語入門教室)は

D:\>

なんです。この違いは何なのでしょうか。
本名表示されているのですがセキュリティ上大丈夫ですか?
873デフォルトの名無しさん:2006/08/23(水) 11:40:03
ハゲワラ
874デフォルトの名無しさん:2006/08/23(水) 11:58:52
>>872
その○○はPCのユーザ名。
詳しくはWindowsのコマンドプロンプトについてだから、板違い。
本買うなりググるなり聞くなりしろ。
875デフォルトの名無しさん:2006/08/23(水) 21:20:43
>>870
どんな状況でも上手く出来る方法など、ある訳がない。
実生活の話などに置き換えて考えればわかるはずだ。
876デフォルトの名無しさん:2006/08/24(木) 14:51:22
質問です。
main(int argc, char *argv[])
で、各argv[0], argv[1], argv[2] ,,,,が受け取れる文字列の長さ
には上限がありますか?
877デフォルトの名無しさん:2006/08/24(木) 15:45:39
>>876
ない
が、渡す側(シェルとかコマンドプロンプト)には限界がある。
そっちは環境依存なので違う板で聞くといい
878デフォルトの名無しさん:2006/08/24(木) 17:38:16
ハード的に。
879デフォルトの名無しさん:2006/08/24(木) 19:12:30
何がだ。
880デフォルトの名無しさん:2006/08/24(木) 21:06:54
>875
ttp://www.aihara.co.jp/~taiji/option/index-j.html
これは、なかなか秀逸だと思うが。
881856:2006/08/24(木) 23:27:25
根本的な勘違いをしてました
int n;
&&&&&…&n;
でnのポインタのポインタの…ぽいんたのアドレスが取れるとなぜか思ってました。
やってみたらできなかったです。どうもすいません
882デフォルトの名無しさん:2006/08/24(木) 23:55:10
>>876
仮にその「上限」がわかったとして
その値に依存するコードは間違いなくクソ
883デフォルトの名無しさん:2006/08/25(金) 00:05:54
ポインタ越しに文字列操作するのってどうやるんでしょうか?

void main(){
int score=200;
char str[100];
MemoryNewScore(score,str);
printf("%s",str);
}
void MemoryNewScore(int score,char *str){
char newstr[100];
time_t t;
t = time(NULL);
sprintf(newstr,"%d\t\t%s\n",score, ctime(&t));
str=newstr;
}

こんな感じに書いたけどうまくいかない。
884デフォルトの名無しさん:2006/08/25(金) 00:15:36
>>883
最後に strcpy(str, newstr) を入れる。

885デフォルトの名無しさん:2006/08/25(金) 00:25:26
文法上のイディオムばかり暗記しまくっても
それらから本質に帰納できるかどうかは当人の天才的ひらめきに強く依存する
886デフォルトの名無しさん:2006/08/25(金) 00:29:31
>>883
ていうか

void MemoryNewScore(int score,char *str){
time_t t;
t = time(NULL);
sprintf(str,"%d\t\t%s\n",score, ctime(&t));
}

でいいんちゃう?駄目なのかな
887デフォルトの名無しさん:2006/08/25(金) 00:32:17
>>885
天才的ひらめきっつーか、暗記したものを組み合わせて自分が目的とするものへと
応用していけるかどうか、だろうな
暗記なんてしなくってもよく、自分が必要としているネタがどの本に、とかどのURLに
書いてあったかを憶えていれば問題ないだろ

それが、プログラムを作っていける(どんな言語でもどんなソースでも構わないけど)か
作っていけないかを分ける「センス」っつーやつなのではないかと
888デフォルトの名無しさん:2006/08/25(金) 00:34:42
>>884 の方法でもいいけれど、
そもそもMemoryNewScore関数内で
char newstr[100]; とローカル変数を用意する必要がないのでは。
sprintf(str,"%d\t\t%s\n",score, ctime(&t));
}
じゃいかんのか、と。

もちろん
static char newstr[100];
でもできるけれども、出力引数を使い、データを格納する領域は
関数呼び出し元が確保しておくのが自然のような気がする。
889デフォルトの名無しさん:2006/08/25(金) 00:34:54
本質や根底は必要ないという主張は伝わったよ
同調はできないが
890デフォルトの名無しさん:2006/08/25(金) 00:38:13
>>884
>>886
>>888
ありがとうございます。勉強になりました。
891デフォルトの名無しさん:2006/08/25(金) 00:51:05
>>883
滅茶苦茶だな。
引数をローカル変数のアドレスで上書きするだけで何が起こると思ってるんだか。
892デフォルトの名無しさん:2006/08/25(金) 02:12:24
とりあえず本棚は用意した方がいいと思うぞ。
893デフォルトの名無しさん:2006/08/25(金) 10:53:50
2つのテキストファイルの内容を比較し、同じか違うかだけを判定したいのですが、
ファイルサイズ分の文字列を用意してガバっとfread後、strcmpで出来ますか?
それともおとなしくDOSコマンドfcとかを呼び出した方が確実でしょうか?
894デフォルトの名無しさん:2006/08/25(金) 11:19:14
>>893
1文字ずつ取得して比較するのをwhileでまわせばいいんでないか
intだからifだけでいけるし
895デフォルトの名無しさん:2006/08/25(金) 11:23:13
文字単位でやるか行単位でやるかは自由だが、>>893みたいにファイル全部メモリに読み込むってのは
無茶だろう。
896デフォルトの名無しさん:2006/08/25(金) 11:36:13
>>895
ファイル全部メモリに読み込むのが無茶かどうかは時と場合によるだろ。
897デフォルトの名無しさん:2006/08/25(金) 11:49:28
まあ俺ならファイルサイズ比較して、ハッシュ比較して、
その後ようやく全部比較し始めるけどな。
898デフォルトの名無しさん:2006/08/25(金) 12:19:53
894-897
ありがとうございます。緊急だったので助かりました。
ひとまず1文字ずつ比較しましたが
パフォーマンス見ながらいろいろやってみます。

やはりサイズ→タイムスタンプ→ハッシュ比較が一般的のようですね。
ちょっと調べてみます。
899デフォルトの名無しさん:2006/08/25(金) 12:20:14
>>897
釣れますか?
900デフォルトの名無しさん:2006/08/25(金) 12:24:24
>>898
タイムスタンプは内容と関係ない。
あと、ハッシュをどうやって計算しているかも考えろ。
901デフォルトの名無しさん:2006/08/25(金) 15:15:34
int num[4];
という配列があって、これには0〜63のうちの4つの数字(重複有)が入っています。
この中の2番目に大きい値と3番目に大きい値を表示しようと考えているのですが、どうしたらよいのでしょうか。
要素が4つしかないのにわざわざソートするのも大仰なんで、できればそれ以外の方法でお願いします。
902デフォルトの名無しさん:2006/08/25(金) 15:32:59
void func(int ary[2]={int a,int b}){}

int main(void)
{
int a=0;
int b=1;
func(a,b);
return 0;
}

こういうような、関数を呼ぶ側では変数を渡して、関数側ではそれを配列の要素として受け取るようなことってできますか?
903デフォルトの名無しさん:2006/08/25(金) 15:41:15
コンパウンドリテラル=C99
904902:2006/08/25(金) 16:07:26
>>903
まさにこれでした。
ありがとうございました。
905デフォルトの名無しさん:2006/08/26(土) 00:00:19
>>901
わざわざソートしない方法を考えるのも大げさなんで、できればソートする方法でお願いします。

1,2,2,2 のとき、1番大きい値は 2 で、2番目に大きい値といったらやっぱり 1 だよな?
906デフォルトの名無しさん:2006/08/26(土) 00:20:55
vc と gcc で printf("%s", 0); の出力が "(null)" になる事を知って驚愕。
この挙動は実装依存ですか??
907デフォルトの名無しさん:2006/08/26(土) 00:27:27
>>901
ソートする方法と
ソートしない方法の
両方を検討することこそ、

 そ の 宿 題 

のテーマじゃないのか?
908デフォルトの名無しさん:2006/08/26(土) 00:30:26
>>906
いや、未定義だろ。
と思って規格を見たんだが、
"the argument shall be a pointer to the initial element of an array of character type."
となっていて、ヌルのときの動作は特に書いてなかった。

まぁ、未定義なんだろうな。
909デフォルトの名無しさん:2006/08/26(土) 01:05:48
某ネトゲで、(null)って名前のアイテムがあって
初めて気が付いた俺がいる。
910906:2006/08/26(土) 01:12:57
>908
確かにページフォルトか何かで死んでもしょうがない感じですね。
規格書を調べて頂いて、ありがとうございます。
911デフォルトの名無しさん:2006/08/26(土) 01:24:19 BE:179723366-2BP(201)
DOSの時代はNULLに書き込んでも落ちなかったな。
それで、プログラムが終了するときに、ご丁寧にNULLに書き込んでますよってメッセージがでるの。
912デフォルトの名無しさん:2006/08/26(土) 03:57:30
>>911
メモリモデルによる。
データがfarまたはhugeポインタなら落ちることもあった
913デフォルトの名無しさん:2006/08/26(土) 05:30:05
>>911
そのためにデータセグメントの最初の8バイトは予約されていたわけだな。
つーか、当時のOSはアクセス例外なんて対応してなかったのさ。
914デフォルトの名無しさん:2006/08/26(土) 07:32:16
>>869
それは処理系定義の関数は「_」1文字で始めなければいけないという意味であって、
_execl 自体が ISO C++ で規定されているわけではない。
915デフォルトの名無しさん:2006/08/26(土) 09:15:56
a[10]={1234567890}って十個配列があったとします。
1234567890
↓↓↓↓↓↓↓↓↓↓
4567890ヌヌヌ    ヌ=NULL
上記みたいに3つ横にずらしたいと思っているのですが
何かいい方法はありますか?
916デフォルトの名無しさん:2006/08/26(土) 09:18:19
一番いい方法は宿題スレで聞くこと
917デフォルトの名無しさん:2006/08/26(土) 09:20:15
了解
918デフォルトの名無しさん:2006/08/26(土) 09:46:46
宿題スレに誘導するな。テンプレがないとあそこは答える物好きが
少ないからな。
919デフォルトの名無しさん:2006/08/26(土) 09:51:20
>>918
安心しろ答えておいた。言語指定がないからC++だけどなww
920デフォルトの名無しさん:2006/08/26(土) 09:52:51

理由との間につながりが見えんな
921デフォルトの名無しさん:2006/08/26(土) 10:00:24
つか見当違いな解答してるな
無能乙
922デフォルトの名無しさん:2006/08/26(土) 10:14:10
>>914
処理系定義の関数って何だ?
しかも、C スレで ISO C++ とは??
923デフォルトの名無しさん:2006/08/26(土) 18:52:05
foo(const char *x, ...)
な関数の中から、
bar(int a, int b, const char *x, ...)
という関数を呼ぶにはどうすれば良いのでしょうか?

; 以下のようなマクロの仕様は避けたいです。
#define foo(略
924デフォルトの名無しさん:2006/08/26(土) 19:07:05
foo(const char *x, ...)
{
bar(0, 0, x);
}
925デフォルトの名無しさん:2006/08/26(土) 19:18:48
va_list
926923:2006/08/26(土) 19:28:42
>>924
それだと foo("x", 1, 2) のように呼び出したときにうまくいきません。

>>925
bar が va_list を引数にとる場合はそれで良いと思うんですが、そうじゃなく
て ... の場合、どうやるんでしょうか?
927デフォルトの名無しさん:2006/08/26(土) 19:36:29
>>926
int arg1, arg2;
va_list args;
va_start(args , 2);
arg1 = va_arg(args , int);
arg2 = va_arg(args, int);
va_end(args);

bar(arg1, arg2, x);
928927:2006/08/26(土) 19:39:13
あ、勘違い。取り下げる。
929927:2006/08/26(土) 19:40:48
俺だったら、そんなあちこちに可変引数を取る関数があるなら、
int argc, char* argv[]
を仮引数にするな。
930923:2006/08/26(土) 19:43:19
えっと bar の方はライブラリの関数で変更不可で、
printf のようなフォーマットを行う関数なので
>>929 のようなインターフェースも避けたいです・・・
931デフォルトの名無しさん:2006/08/26(土) 19:46:49
>>930
だったら、defineでやるしかないよ
932デフォルトの名無しさん:2006/08/26(土) 21:25:06
>>926
そういうことになるから、可変個引数を取る関数は、
printf/vprintfのように...とva_listのそれぞれを引数にとる版、両方定義するのが鉄則。
933デフォルトの名無しさん:2006/08/26(土) 21:47:05
>>930
>えっと bar の方はライブラリの関数で変更不可で、

そんならアセンブラだな
綺麗事いっててもベンダが仕様を変えてくれるまで納期は待ってくれないだろ
934デフォルトの名無しさん:2006/08/26(土) 22:11:12
アセンブラだとどうやれば出来るのかわかってるかい?
「アセンブラだと何でも出来るから、とりあえずアセンブラと言っておく」
みたいな人もいるから困るね。

>>930
スタックフレームを、丸ごとそのままコピーすればよい。
多少でも規格に沿うようにしたいのなら、
va_listで受けて、必要充分な数のint変数に代入し
それを全て引数としてbar()に渡すという手がある。
また、「規格には沿わないが、現存する普通の処理系なら問題ない」という
レベルで良いならば、
va_argで大きな(例えばint20個)サイズの構造体を受け取ったことにして
それをそのままbarに渡せばよい。
935923:2006/08/26(土) 22:19:45
> va_argで大きな(例えばint20個)サイズの構造体を受け取ったことにして
> それをそのままbarに渡せばよい。
これでいきたいと思います。皆さんアドバイス有り難うございました。
936デフォルトの名無しさん:2006/08/26(土) 22:25:17
>>934
フレームポインタがあることを前提に話しているようだが・・・
937デフォルトの名無しさん:2006/08/26(土) 22:36:52
俺ならアセンブラで・・・
より、ずっとまともな回答でしょ。
938デフォルトの名無しさん:2006/08/26(土) 22:58:07
>また、「規格には沿わないが、現存する普通の処理系なら問題ない」という

互換性の範囲も想定せずに「普通の処理系」とか言ってる頓珍漢の何が「まし」なのか知らんが
痛いコード書いてそうだな
939デフォルトの名無しさん:2006/08/26(土) 23:07:09
と、
「アセンブラで」「納期が」
という痛いことを言うだけで、何の解決策も示せなかったくせに
「フレームポインタがどうの」といちゃもんをつけることだけに腐心している
最底辺のコーダーが申しております。
940デフォルトの名無しさん:2006/08/26(土) 23:08:14
>>939
悔しさは別のところではらしてね
941デフォルトの名無しさん:2006/08/26(土) 23:11:33
「納期が迫ってるんだからアセンブラで書けよ」と言ってる事からすると
「必要が無いのにアセンブラで書く」のは「痛いコードではない」というわけですね。
942939:2006/08/26(土) 23:12:35
>>940
いや、俺は全然悔しくないけど。
943デフォルトの名無しさん:2006/08/26(土) 23:14:09
悔し紛れの書き込みをしているのがどちらなのかなんて、一目瞭然でしょ。
944デフォルトの名無しさん:2006/08/26(土) 23:17:33
>>936>>938
可変引数の受け渡しに、スタックを使っていない処理系を挙げていただけますか?
俺は今まで見たことがありませんので。
945デフォルトの名無しさん:2006/08/26(土) 23:20:25
この痛さは、他スレでもよく見かけるよな。
946デフォルトの名無しさん:2006/08/26(土) 23:25:04
>>944
あー、フレームポインタを知らなかったのか
947デフォルトの名無しさん:2006/08/26(土) 23:33:45
あのー、「フレームポインタ」と「スタックフレーム」は違いますが。
フレームポインタを最適化で省略しても、>>934のやり方は正常に動きますよ?


ところで、あなたのお勧めの「アセンブラ」とやらでは、どうやって解決するんですか?
>>934と同様の方法以外に無いと思いますが。
もし、引数を追加しないで済むのであれば、ジャンプ一発で済むでしょうけどね。
でも、>>923は追加してますよ。
948デフォルトの名無しさん:2006/08/26(土) 23:36:31
>va_argで大きな(例えばint20個)サイズの構造体を受け取ったことにして
                ^^^^^^
                 ↑
              こういう変な仮定をせずに済むように用意されているものだが・・・
949デフォルトの名無しさん:2006/08/26(土) 23:40:38
それもこれも可変個引数しか用意していない
糞ライブラリが全部悪いんじゃ〜ヽ(`Д´)ノ

はい、次の方どうぞ〜
950デフォルトの名無しさん:2006/08/26(土) 23:42:30
すみません、具体的なコードを教えてもらえますか?
951デフォルトの名無しさん:2006/08/26(土) 23:44:43
>>948
アセンブラだと、その仮定をせずに解決できるのか?
952デフォルトの名無しさん:2006/08/26(土) 23:47:29
えっと、
>スタックフレームを、丸ごとそのままコピーすればよい。
を具体的にどう書くのか知りたいのですが・・・
953デフォルトの名無しさん:2006/08/26(土) 23:50:03
>>952
その具体的なやり方が、続きに書いてある内容だろ。
954デフォルトの名無しさん:2006/08/26(土) 23:56:20
>>953
>va_listで受けて、必要充分な数のint変数に代入し
>それを全て引数としてbar()に渡すという手がある。
これですか?intにおさまらない型の場合もあると思うのですが。
955デフォルトの名無しさん:2006/08/27(日) 00:06:10
いや、別に収まらなくても大丈夫だろ。
変数の中身を書き換えるわけじゃないんだから、複数個のintに分割されるだけ。
もちろん、intの受け渡しにパディングが入るようなら問題だが
普通はそうならない型がintになるように、処理系は作られている。
956デフォルトの名無しさん:2006/08/27(日) 00:07:05
以前どこかで、
myprintf(const char* format, ...)
の中で、formatと...をprintfに渡すテクニックを見たことがあるような気がするけど、
思い出せないし、見つからない・・・。
957デフォルトの名無しさん:2006/08/27(日) 00:09:32
>>955
なるほど、そうなんですか。
ありがとうございました。
958デフォルトの名無しさん:2006/08/27(日) 00:09:43
>普通はそうならない型がintになるように、処理系は作られている。

>>923 の処理系が何かを確認せずに言ってるんだよな、この人・・・
959デフォルトの名無しさん:2006/08/27(日) 00:12:27
>>958
いちいちうざいな、こいつ
問題になる処理系を知ってるなら書け
960デフォルトの名無しさん:2006/08/27(日) 00:20:03
忠言耳に逆らう
961デフォルトの名無しさん:2006/08/27(日) 00:21:31
>>960
消えろ、クズ
962デフォルトの名無しさん:2006/08/27(日) 00:22:20
そのような機能はサポートしていません
963デフォルトの名無しさん:2006/08/27(日) 00:22:31
>>958
・アセンブラでの解決法(>>948の制限をなくす方法)
・可変引数の受け渡しにスタックを使わない処理系

さっさと書いてくださいよ。
口だけで何言っても、説得力ゼロですよ。
964デフォルトの名無しさん:2006/08/27(日) 00:24:44
>>956
>>935のやり方なら、過去スレで見たような。
965デフォルトの名無しさん:2006/08/27(日) 00:25:21
>・アセンブラでの解決法(>>948の制限をなくす方法)

おいくらで?


>・可変引数の受け渡しにスタックを使わない処理系

これはあなたが何の脈絡もなく突然言い出したことで
こちらにはいかなる責任関係も存在しないものと判断しています
966デフォルトの名無しさん:2006/08/27(日) 00:26:20
必死さだけは伝わってくるんだけどね、説得力がね。
967デフォルトの名無しさん:2006/08/27(日) 00:26:32
逃げたw
968デフォルトの名無しさん:2006/08/27(日) 00:27:08
いや、もうそろそろ「完全勝利宣言」が出るよ。
969923:2006/08/27(日) 00:27:18
なんか私の質問がきっかけでもめてしまってすみません・・・
970デフォルトの名無しさん:2006/08/27(日) 00:29:42
気にするな
971デフォルトの名無しさん:2006/08/27(日) 00:29:45
挑発してもだめです
ちゃんとお代を頂いているお客様とあなたたちは違います
コードを書いて欲しければ正式に商談をして下さい
972デフォルトの名無しさん:2006/08/27(日) 00:34:37
もう>>923は納得したんだろ?

はい次の質問ドゾー。
973デフォルトの名無しさん:2006/08/27(日) 00:49:46
>>971
どこの会社ですか?

プライドだけは高くても、それに能力が追いついていない
そんな無能が偉そうな顔をしている会社とは、取引をしないよう啓蒙していく必要があるので
是非会社名を教えてください。

まさか個人じゃないですよね?
974デフォルトの名無しさん:2006/08/27(日) 00:52:23
あーあ、こいつもうざいな。
975デフォルトの名無しさん:2006/08/27(日) 00:52:44
営業妨害を予告する人に協力する必要がどこにあるのかもわからない人は
別な意味で苦労が多そうですね
976デフォルトの名無しさん:2006/08/27(日) 00:55:00
もっとも、コードの規模と用途からして仮に真面目に商談させて頂いても
ご用命いただけるような金額にはならなさそうですが・・・・
977デフォルトの名無しさん:2006/08/27(日) 00:58:13
最後に書かないと気が済まないんだね。


中身の無い書き込みだけで、勝ったつもりになりたいから。
978デフォルトの名無しさん:2006/08/27(日) 00:59:14
自分でもわかってるけど
プライドが邪魔してるんだよね。かわいそうに。
979デフォルトの名無しさん:2006/08/27(日) 01:01:04
ごめ、ちょっと酒はいっててアフォやっちまった
980デフォルトの名無しさん:2006/08/27(日) 01:01:16
日本人のメンタリティじゃないな。多分朝鮮人だろう。
981デフォルトの名無しさん:2006/08/27(日) 01:28:35
うげー、差別意識まで持ち出したぞ、こいつ・・・・
技術的なやりあいで主張がとおらなかったからってそこまでするかよ
恐れ入った
982デフォルトの名無しさん:2006/08/27(日) 01:40:12
主張が通らなかったって何のことだろう?
技術的なやりあいって、何一つ実証できない妄言を垂れ流して
実例を挙げろといえば逃げること?
983デフォルトの名無しさん:2006/08/27(日) 01:50:19
少なくともコードを示して貰えないという入力に対する出力が朝鮮人になるような
ぶっ壊れたロジックが有用と評価された流れは見あたらないようだが・・・
984デフォルトの名無しさん:2006/08/27(日) 01:59:03
商談がまとまらないたびごとに相手方を中傷するようなことを繰り返していると
別な意味で苦労が多そうだね
985デフォルトの名無しさん:2006/08/27(日) 02:05:00
なんか全部同一人物が書いてると思ってるみたいだし。
986デフォルトの名無しさん:2006/08/27(日) 02:06:04
自演と分身を使い分けながら差別用語を織り交ぜた恫喝を繰り返すパターンは
この前、公の席でジャップ発言してたバカたれとやり口が似てるんだよな
987デフォルトの名無しさん:2006/08/27(日) 02:12:55
悔しくて眠れないんだね。
恥の上塗りを繰り返すからいけないんだよ。
988デフォルトの名無しさん:2006/08/27(日) 02:17:55
>va_argで大きな(例えばint20個)サイズの構造体を受け取ったことにして
                ^^^^^^
                 ↑
              上塗りする必要もないほどの赤っ恥もあったがなw

わずか数行のアセンブラを他人に依頼するようなら仕方ないが
989デフォルトの名無しさん:2006/08/27(日) 02:22:24
ここはCスレだが、それを差し引いてもひどい無知・・・までは構わんが、痛い態度が格好のおもちゃなんだよ
990デフォルトの名無しさん:2006/08/27(日) 02:57:20
誰のことだろう?
991デフォルトの名無しさん:2006/08/27(日) 03:25:35
>>956
vprintf()というオチではないだろうか?
992デフォルトの名無しさん:2006/08/27(日) 07:47:47
この程度の大きさならmallocで確保するより、ある程度の大きさをもった配列を宣言したほうがいい
などのように書かれた文献をいくつか見かけたのですが、この「この程度」というのはだいたいどのくらいなのでしょうか?
int型で10,000くらいまでは「この程度」のうちに含まれることを確認しているので、1,000,000くらいかな、と思っているのですが
993デフォルトの名無しさん:2006/08/27(日) 09:14:42
>>992
なんで自分が確認してる数値よりも100倍も大きいと思うの?
994デフォルトの名無しさん:2006/08/27(日) 11:41:55
なんとも奇々怪々な話だな
995デフォルトの名無しさん:2006/08/27(日) 13:28:10
次スレ頼む
996デフォルトの名無しさん:2006/08/27(日) 15:44:34
次スレ
【ANSI-C】 C言語なら俺に聞け!  Part 129
http://pc8.2ch.net/test/read.cgi/tech/1156661024/
997デフォルトの名無しさん:2006/08/27(日) 18:24:08
あんたら埋めなさいよ
998デフォルトの名無しさん:2006/08/27(日) 18:25:04
埋め
999デフォルトの名無しさん:2006/08/27(日) 18:27:55
(*´Д`)y−~~~ウマー!
1000デフォルトの名無しさん:2006/08/27(日) 18:28:26
1000ならANSI撲滅
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。