C言語なら俺に聞け(入門篇) Part 36
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/09/15(月) 11:40:35教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題を片付けます 115代目
http://pc11.2ch.net/test/read.cgi/tech/1217741118/
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 35
http://pc11.2ch.net/test/read.cgi/tech/1219761846/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
0002デフォルトの名無しさん
2008/09/15(月) 12:43:24それをその速さで貼れるってことは
お前それをコピってずっと待機してたんだろ?
リロードしまくって。誰かスレ立てるの待って。
まじきめーな。氏ねよハゲ。z
0003デフォルトの名無しさん
2008/09/15(月) 14:45:56i=++i; も未定義なの?
0004デフォルトの名無しさん
2008/09/15(月) 14:53:150005デフォルトの名無しさん
2008/09/15(月) 16:21:12二つの副作用完了点の間で同じ値(この場合i)を二度変更しようとする試みは全て未定義とされている
0006デフォルトの名無しさん
2008/09/15(月) 16:34:28ってことはa = i + i++はおk?
0007デフォルトの名無しさん
2008/09/15(月) 17:24:29あんたは、一つの法律で禁止されていないことは全て合法だとでも言い出すのか?
0008デフォルトの名無しさん
2008/09/15(月) 17:49:15使うときはどちらが便利なのでしょうか?
0009デフォルトの名無しさん
2008/09/15(月) 17:53:170010デフォルトの名無しさん
2008/09/15(月) 18:11:58Cで、a=a+1はありえない。
0011デフォルトの名無しさん
2008/09/15(月) 19:39:58ループなんかでカウンタとして使ってるなら++を使え。
あとで足す数が変わる可能性があるなら+を使え。
0012デフォルトの名無しさん
2008/09/15(月) 19:46:390013デフォルトの名無しさん
2008/09/15(月) 19:51:350014デフォルトの名無しさん
2008/09/15(月) 19:57:45001513
2008/09/15(月) 20:01:32書き方をするやつにあれこれCの記述を伝授するのが面倒。
動くんだしいいよ。
+=とかおしてて「なんでなんで?」で時間食うのがもったいない。
0016デフォルトの名無しさん
2008/09/15(月) 20:01:500017デフォルトの名無しさん
2008/09/15(月) 21:44:300018デフォルトの名無しさん
2008/09/15(月) 21:57:19仮に識別子の数が問題だとしても、算出元と変更先を両方同じものに書き換えるときに便利なのか、
片方だけないしそれぞれ別のものに書き換えるとき便利なのかの違いでしかない
まあ俺は++使うけど
0019デフォルトの名無しさん
2008/09/15(月) 22:06:09++か+=かってのは、状況にもよるけど。
0020デフォルトの名無しさん
2008/09/15(月) 22:23:450021デフォルトの名無しさん
2008/09/15(月) 22:33:250022デフォルトの名無しさん
2008/09/15(月) 22:57:08確定的にaに1加える場所なら++を使う。
aに何か加えることが確定的で現在その値が1なら+=を使う。
単に現在aの新しい値が元のaから算出されるだけなら= +を使う。
0023デフォルトの名無しさん
2008/09/15(月) 23:10:46イテレータとか。
0024デフォルトの名無しさん
2008/09/15(月) 23:20:270025デフォルトの名無しさん
2008/09/15(月) 23:29:500026デフォルトの名無しさん
2008/09/15(月) 23:30:480027デフォルトの名無しさん
2008/09/15(月) 23:38:570028デフォルトの名無しさん
2008/09/15(月) 23:49:36より良い書き方とされるa += 1、さらに良い書き方とされるa++と++aが存在するから。
0029デフォルトの名無しさん
2008/09/16(火) 00:02:03別にダメではない
嫌う人間が多いだけ
0030デフォルトの名無しさん
2008/09/16(火) 00:08:49まぁ同じ意味だし、好みの問題とは言うけど、読みやすさとか考えるとやっぱり a+=1, a++, ++a の方がいいと思う
0031デフォルトの名無しさん
2008/09/16(火) 00:12:47それくらいの違いしか無い
0032デフォルトの名無しさん
2008/09/16(火) 00:23:310033デフォルトの名無しさん
2008/09/16(火) 00:55:28003424
2008/09/16(火) 01:29:45ソースレベルでのわかりやすさ・なじみやすさ・効率が
主な理由だと理解しました。
>>26 さんの回答は、実行ファイルになった段階でも
場合によっては違いが出てくるとおっしゃっているようにも思えますが、
正直いまの私には十分には理解しきれませんでした。
0035デフォルトの名無しさん
2008/09/16(火) 01:52:250036デフォルトの名無しさん
2008/09/16(火) 02:15:260037デフォルトの名無しさん
2008/09/16(火) 03:42:47ソースコードに何回も同じことが重複して登場するのは悪
だから a+=1 か a++ にしる!
0038デフォルトの名無しさん
2008/09/16(火) 15:02:530039デフォルトの名無しさん
2008/09/16(火) 15:11:49そう作られているから。memcpy()と言う関数の振りをしているが、
その実体がCの関数かどうかは実装依存。
逆に言えば、コンパイラベンダが鎬を削るポイントでもある。
0040デフォルトの名無しさん
2008/09/16(火) 15:21:04CPUは一発でデータをブロック転送できるから。
古いCPUだとブロック転送するよりスタックにいれられるだけいれて並べてくほうが速かったりすることもあるけど、
いまどきブロック転送の方が速い。
0041デフォルトの名無しさん
2008/09/16(火) 20:04:201) lpMetSect->lpSharedInfo->lAvailableCount--;
2) lpMetSect->lpSharedInfo->lAvailableCount -= 1;
3) lpMetSect->lpSharedInfo->lAvailableCount = lpMetSect->lpSharedInfo->lAvailableCount - 1;
(3)は左辺と右辺を見比べて、同じ変数かどうか確認しなきゃならないだろ。
0042デフォルトの名無しさん
2008/09/16(火) 20:06:54実装依存って言えばそうかもしれんけど、それ言ったら、標準関数全部そうだろ。
0043デフォルトの名無しさん
2008/09/16(火) 20:07:53そんなもん間違うようなやつはそもそも1個でも間違うよ
0044デフォルトの名無しさん
2008/09/16(火) 20:16:24読みやすさだよ。
0045デフォルトの名無しさん
2008/09/16(火) 23:49:55しかし私の使っているコンパイラではNULL == 0は真になるので
popの返り値がNULLであるか、0であるかを判別することができません
エラーチェックのために新たに変数を設ける以外の解決法があったらぜひご教示願います
それにしてもなぜこのコンパイラにはNULL == 0が真になるなどという奇怪な仕様が採用されたのでしょうか?
まったくもって不愉快で、理解に苦しむ仕様です
0046デフォルトの名無しさん
2008/09/16(火) 23:56:54戻り値のほうはリターンコードだけにすれば?
0047デフォルトの名無しさん
2008/09/17(水) 00:12:44NULLはポインタが無効である(いかなるオブジェクトも指示していない)ことを表すために使うものだから、
そもそもintなどポインタ型と併用することを考慮されていない。コンパイルエラーになる処理系も存在する。
一般的には、>>46のいうように引数で返すか、
あるいは本来の戻り値と可否の2つを構造体でまとめるなどという方法を取るしかない。
よその言語では、こういう用途にもNULL(あるいはそれに相当するもの)が使えるものあるんだけどね。
0048デフォルトの名無しさん
2008/09/17(水) 00:21:420049デフォルトの名無しさん
2008/09/17(水) 00:24:43ポインタで移動できるみたいだから、そう思うんだけど。
0050デフォルトの名無しさん
2008/09/17(水) 00:28:32int pop(void);
のほうが体裁がいいんだろうな。
それだったら
int isempty(void); /* 0以外: スタックが空 0:スタックが空でない */
を作ってそれでチェックするというのもあり。
if (!isempty()) {
val = pop();
}
0051デフォルトの名無しさん
2008/09/17(水) 00:33:36そうでないといけないという決まりはないが、そうなっていることが多い。
というかそういうやつでは、可変個でないやつも同じように置かれていて、
その配置を応用しているという作りになっている。
0052デフォルトの名無しさん
2008/09/17(水) 00:37:320053デフォルトの名無しさん
2008/09/17(水) 01:12:510054デフォルトの名無しさん
2008/09/17(水) 01:22:17「charより大きな整数を返す関数にして、エラー値としてcharに収まらない数を返す」
と同じ。
0055デフォルトの名無しさん
2008/09/17(水) 01:28:160056デフォルトの名無しさん
2008/09/17(水) 01:30:430057デフォルトの名無しさん
2008/09/17(水) 01:33:114) --lpMetSect->lpSharedInfo->lAvailableCount;
これも追加しておいてくれお
0058デフォルトの名無しさん
2008/09/17(水) 02:19:060059デフォルトの名無しさん
2008/09/17(水) 03:00:01スタックを構造体で定義して、push, pop, isemptyの引数として渡したいな。
同時に複数のスタックが使えるようになるし。
0060デフォルトの名無しさん
2008/09/17(水) 10:47:380061デフォルトの名無しさん
2008/09/17(水) 11:46:15#include <stdio.h>
int main(void)
{
int c;
while(c = (getchar() != EOF)) {
printf("%d", c);
}
printf("%d", c);
}
このプログラムで、EOF以外を打つと「11」と、「1」二回繰り返されているようなんですが、
なんで繰り替えすのですかね?
c = (getchar() != EOF)←のような条件自体初めての形ですので動きが解らなくて><
0062デフォルトの名無しさん
2008/09/17(水) 11:52:330063デフォルトの名無しさん
2008/09/17(水) 11:53:08printf("ループ内 %d", c);
}
printf("ループ外 %d", c);
}
0064デフォルトの名無しさん
2008/09/17(水) 11:54:20cに名に入れたか考えてみろ
0065デフォルトの名無しさん
2008/09/17(水) 11:58:48いや、ループは抜け出してないから、ループ内のprinftが繰り返されてるみたいなんですよ。
>>64
getcharでaを入力したとしたら、cには1が入りますよね?
ってことは1を一回表示したら、またgetcharで入力待ちになると思うんですが……二回繰り返した後に入力待ちになってるんです><
0066デフォルトの名無しさん
2008/09/17(水) 12:04:220067デフォルトの名無しさん
2008/09/17(水) 12:06:26改行も1文字分
0068デフォルトの名無しさん
2008/09/17(水) 12:12:080069デフォルトの名無しさん
2008/09/17(水) 12:13:37>>65
なるほど、やっと理解できました!
でもgetcharは一文字入力なんですよね?
なんというか根本が解ってない感じだw
んー、まずaでループに入り1を出力、次に改行文字でループに入り1を出力……ってことですかね?
0070デフォルトの名無しさん
2008/09/17(水) 13:02:33「次に改行文字でループに入り」というよりは、
「次に得るのが改行文字なのでループから脱出せずに」だけれど。
0071デフォルトの名無しさん
2008/09/17(水) 13:13:40打った文字はEnterを打つまで入力されない
Enterを打つと打った文字+改行が入力されて、getcharでそれを1文字ずつ取り出せる
0072デフォルトの名無しさん
2008/09/17(水) 13:25:230073デフォルトの名無しさん
2008/09/17(水) 13:27:060074デフォルトの名無しさん
2008/09/17(水) 13:28:030075デフォルトの名無しさん
2008/09/17(水) 13:29:13ちゃんと元のコード読め
0076デフォルトの名無しさん
2008/09/17(水) 13:29:21そこに括弧ついてんのかよ!
0077デフォルトの名無しさん
2008/09/17(水) 13:34:130078デフォルトの名無しさん
2008/09/17(水) 13:34:39ドンマイ!
0079デフォルトの名無しさん
2008/09/18(木) 01:15:59微妙に意味がちがう。
a = 1;
b = ++a;
b = a++;
では結果がちがう。
func ( a++, a+1, ++a)
のとき、funcの引数がどんなになるか挙動不明。
0080デフォルトの名無しさん
2008/09/18(木) 01:23:59単体で使った場合を聞いてたのにいまさらなにをw
しかも後半は引数がどうなるか不明つーより未定義動作じゃねーか
0081デフォルトの名無しさん
2008/09/18(木) 07:41:19rubyではunpack("s*")を使うのはしってるんですけど。
0082デフォルトの名無しさん
2008/09/18(木) 07:52:47rubyのunpackは変換が目的だから、Cの場合はその必要が無い。
例えば、(今ぐぐって見つけた)リファレンスマニュアルの例だとこうなる。
unsigned char foo[] = {1, 2, 0376, 0375};
unsigned short * bar = (unsigned short *) foo;
printf("%u, %u\n", bar[0], bar[1]);
0083デフォルトの名無しさん
2008/09/18(木) 14:27:04すみません、なんでこのプログラムはEOFを入力すれば終了するのでしょうか?><
0084デフォルトの名無しさん
2008/09/18(木) 14:35:22!= EOF が偽になって getline が 0 を返すから > 0 が偽になって main を抜けるのでは?
0085デフォルトの名無しさん
2008/09/18(木) 17:36:330086デフォルトの名無しさん
2008/09/18(木) 17:44:22使えません
0087デフォルトの名無しさん
2008/09/18(木) 17:46:510088デフォルトの名無しさん
2008/09/18(木) 17:48:51ありがとうございました
0089デフォルトの名無しさん
2008/09/18(木) 19:09:38あるサンプルソースコードを入手して、
~~.slnを実行して、デバッグしたら動きました。
ファイル入出力をしようと思って、
メイン関数が書いてある.cファイルで#include <iostream>とすると、
1>c:\program files\microsoft visual studio 8\vc\include\cstdio(35) : error C2059: 構文エラー : ':'
1>c:\program files\microsoft visual studio 8\vc\include\cstdio(36) : error C2143: 構文エラー : '{' が ':' の前にありません。
が大量に出てきてしまいました。
インクルードしただけです。
何がいけなかったのでしょうか?
0090デフォルトの名無しさん
2008/09/18(木) 19:11:44C++なので、スレ違いでした。
去ります。すみません。
0091デフォルトの名無しさん
2008/09/18(木) 20:27:31そりゃダメだろ
0092デフォルトの名無しさん
2008/09/19(金) 02:10:430093デフォルトの名無しさん
2008/09/19(金) 16:34:15WindowsXPで、BCC DevelopperとBorland C++ Compiler 5.5.1を使用しています。
プロジェクトを一つ作り、そのプロジェクト内で複数のC言語ファイルを作成しているのですが、
一番最初に作成したC言語のファイルしか、コンパイル、メイク、実行ができません。
どうすれば他のC言語のファイルをコンパイル、メイク、実行する事が出来るのでしょうか?
0094デフォルトの名無しさん
2008/09/19(金) 16:36:570095デフォルトの名無しさん
2008/09/19(金) 16:42:270096デフォルトの名無しさん
2008/09/19(金) 16:45:33BCC Developerのプロジェクト管理機能の使い方に関する問題だよな?
0097デフォルトの名無しさん
2008/09/19(金) 16:49:56…
int a
if(a)
…
この場合のifの条件aとはどういう意味ですか?
0098デフォルトの名無しさん
2008/09/19(金) 16:51:44とまったく同じ意味
0099デフォルトの名無しさん
2008/09/19(金) 17:02:270100デフォルトの名無しさん
2008/09/19(金) 17:06:59何が不満なんだ?
0102デフォルトの名無しさん
2008/09/19(金) 20:22:190103デフォルトの名無しさん
2008/09/19(金) 23:18:370104デフォルトの名無しさん
2008/09/19(金) 23:25:16だよ。
0105デフォルトの名無しさん
2008/09/19(金) 23:32:500106デフォルトの名無しさん
2008/09/20(土) 02:58:12char buf="cjd";
for(i=0;i<buf[i];i++);
上記for文の境界条件はマイナーですか?
0107デフォルトの名無しさん
2008/09/20(土) 03:07:020108デフォルトの名無しさん
2008/09/20(土) 03:08:48文字列の長さだけまわしてるつもりなら、それはおかしいだろ。
0109デフォルトの名無しさん
2008/09/20(土) 03:19:360110デフォルトの名無しさん
2008/09/20(土) 03:40:45char *buf = "cjd";
だったしても、そんな書き方するヤツはプログラムやめたほうがいい。
0111デフォルトの名無しさん
2008/09/20(土) 04:37:52#ifdef WIN32
#endif
で処理を分岐するんですが
MACは、何を指定すればいいでしょうか?
0112デフォルトの名無しさん
2008/09/20(土) 04:45:32決まってなければ、自由に
0113デフォルトの名無しさん
2008/09/20(土) 05:01:24邪魔です
0114デフォルトの名無しさん
2008/09/20(土) 05:02:350115デフォルトの名無しさん
2008/09/20(土) 05:03:100116デフォルトの名無しさん
2008/09/20(土) 05:05:27知らないならすっこんでろっつーの
0117デフォルトの名無しさん
2008/09/20(土) 05:12:30そんなもの決め事だから
0118デフォルトの名無しさん
2008/09/20(土) 05:13:41#ifdef MACOS
#endif
0119デフォルトの名無しさん
2008/09/20(土) 09:49:46K&R、つまりC言語を設計した人にC言語を辞めろと申すか?
0120デフォルトの名無しさん
2008/09/20(土) 10:09:36いいから見直せ
0121デフォルトの名無しさん
2008/09/20(土) 10:09:56比較することにどんな意味があるんだ?
0122デフォルトの名無しさん
2008/09/20(土) 10:19:19(使用中の処理系での)コードとそれが何文字目かということに、
何らかの関係があるんだよ。
0123デフォルトの名無しさん
2008/09/20(土) 11:00:24すまん早とちりしてた
>>106のおかしなプログラムに対するレスだったのか
0124デフォルトの名無しさん
2008/09/20(土) 12:34:34は関数で末尾にセミコロンが付くと正確には文になるのですか?
そういった場合printf文というのが適切なのですか?
0125デフォルトの名無しさん
2008/09/20(土) 12:39:44その通り
正確には単文
Pascalはセミコロンが文と文の区切りに使われるが
C言語はセミコロンは文の終了を表す
0126デフォルトの名無しさん
2008/09/20(土) 15:46:13○式文
pascal 厨が下手に口を出すからボロが出る
文と複合文はあっても単文はない
0127デフォルトの名無しさん
2008/09/20(土) 15:47:28馬鹿ですか?
{}で囲まれたのが複文
そうでないのが単文
0128デフォルトの名無しさん
2008/09/20(土) 16:00:490129デフォルトの名無しさん
2008/09/20(土) 16:03:28お前がアフォ
0130デフォルトの名無しさん
2008/09/20(土) 16:05:350131デフォルトの名無しさん
2008/09/20(土) 16:20:470132デフォルトの名無しさん
2008/09/20(土) 16:25:48C言語 式文 複合文 の検索結果 約 162 件中 1 - 30 件目 (0.32 秒)
0133デフォルトの名無しさん
2008/09/20(土) 16:27:27JIS X3010:2003の何ページのどこここにあります、ってやってくれ
無駄にスレを伸ばすな
0134デフォルトの名無しさん
2008/09/20(土) 16:39:25おまえの情報源はそんなものか
お里が知れるな
0135デフォルトの名無しさん
2008/09/20(土) 16:41:200136デフォルトの名無しさん
2008/09/20(土) 16:43:07お前も煽ってばかりいないで>>133のアドバイスのように
ちゃんと答えてやれ
答えられないと証拠も無いのに、と言われるだけだぞ
0137デフォルトの名無しさん
2008/09/20(土) 16:52:58俺だって、ちゃんと「式文」と教えただろうが無礼者め
0138デフォルトの名無しさん
2008/09/20(土) 16:55:05それは証拠にならない
規格書のどこに書いてあるか言ってみろ
0139デフォルトの名無しさん
2008/09/20(土) 16:56:520140デフォルトの名無しさん
2008/09/20(土) 16:57:540141デフォルトの名無しさん
2008/09/20(土) 16:58:450142デフォルトの名無しさん
2008/09/20(土) 16:59:30ってあったら文はa = 10, b = 10 , c++でおk?
0143デフォルトの名無しさん
2008/09/20(土) 17:00:46式文って式+セミコロンのこと?
0144デフォルトの名無しさん
2008/09/20(土) 17:06:44厳密には「;」まで含む。
0145デフォルトの名無しさん
2008/09/20(土) 17:08:15バカがいると聞いて来ますた
0146デフォルトの名無しさん
2008/09/20(土) 17:09:500147デフォルトの名無しさん
2008/09/20(土) 17:12:07メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
例えば、以下のようにしても勝手に開放されているように思えるのですが、
これはOSが面倒みてくれている、という解釈で正しいですか?
char *c;
c = (char *)malloc(1000000);
return 0; //開放せずに終了
char *c;
c = (char *)malloc(1000000);
c[1000000] = 'a'; //ここで異常終了
0148デフォルトの名無しさん
2008/09/20(土) 17:14:55OSによる
これこそ環境依存
0149デフォルトの名無しさん
2008/09/20(土) 17:15:32大丈夫OSが何とかしてくれる
と思ってて問題ないよ
0150デフォルトの名無しさん
2008/09/20(土) 17:17:37はい
>メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
>確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
いいえ
>これはOSが面倒みてくれている、という解釈で正しいですか?
OSによる
0151デフォルトの名無しさん
2008/09/20(土) 17:18:000152デフォルトの名無しさん
2008/09/20(土) 17:20:34>確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
はい
0153デフォルトの名無しさん
2008/09/20(土) 17:37:530154デフォルトの名無しさん
2008/09/20(土) 17:38:580155デフォルトの名無しさん
2008/09/20(土) 17:39:480156デフォルトの名無しさん
2008/09/20(土) 17:45:070157デフォルトの名無しさん
2008/09/20(土) 18:00:35>>147
にある状況はwindows、unix系ではOSが何とかしてくれる
でもプログラムのやりようによっては解放されないこともある(mutexとかなんとかで)
ってことで大丈夫でしょうか
0158デフォルトの名無しさん
2008/09/20(土) 18:00:56ありがとうございます。
常駐するようなもの以外は、それほど過敏になることはないんですかね。
0159デフォルトの名無しさん
2008/09/20(土) 18:01:13そいつはメモリリークというより、リソースリークじゃね?
閑話休題
mallocだと大体のPC環境だと後始末してくれる処理系になってるけど、
共有メモリとかでリークすると、プロセスが終了しても残ったりすることもある。
0160デフォルトの名無しさん
2008/09/20(土) 18:32:09Cに規格書はない
もしかして規格票って言いたかったのか?
0161デフォルトの名無しさん
2008/09/20(土) 18:34:530162デフォルトの名無しさん
2008/09/20(土) 18:44:550163デフォルトの名無しさん
2008/09/20(土) 19:04:020164デフォルトの名無しさん
2008/09/20(土) 19:08:24某エディタのソースコードにあって、
文字列か文字の幅を返す関数にそのfor文が使われていました。
0165デフォルトの名無しさん
2008/09/20(土) 19:11:06単なる和訳だろ。
0166デフォルトの名無しさん
2008/09/20(土) 19:20:07それはない
0167デフォルトの名無しさん
2008/09/20(土) 19:20:40英語のものを日本語で呼んではいけないのか。
0168デフォルトの名無しさん
2008/09/20(土) 19:26:05非標準の邦訳が通じなければ説明責任はそれを言った者にある
ただし別にわかってやれたからって、こちらに利益はないので説明がしたければどうぞご勝手に
0169デフォルトの名無しさん
2008/09/20(土) 19:27:28ちなみに
DWORD CMyEdit::GetTextWidth(LPCWSTR pstr)
{
DWORD i,n;
for(i=n=0;i<pstr[i];i++){
if(IsMB(pstr + i))n+=2;
else n++;
}
return n;
}
0170デフォルトの名無しさん
2008/09/20(土) 19:28:140171デフォルトの名無しさん
2008/09/20(土) 19:31:090172デフォルトの名無しさん
2008/09/20(土) 19:32:22「文字列か文字の幅を返す関数」ではないな
0173デフォルトの名無しさん
2008/09/20(土) 19:37:49i<pstr[i] じゃなくて pstr[i] になってない?
0174デフォルトの名無しさん
2008/09/20(土) 19:40:40誰がそんな糞コード撒き散らしてんだよ
0175デフォルトの名無しさん
2008/09/20(土) 19:42:26なってないです。
MyEditというソフトウェアのソースコードMyEditUtil.cppの493行目を見ればわかります。
0176デフォルトの名無しさん
2008/09/20(土) 19:45:030177デフォルトの名無しさん
2008/09/20(土) 19:52:37バグだろ。
0178デフォルトの名無しさん
2008/09/20(土) 19:54:480179デフォルトの名無しさん
2008/09/20(土) 20:06:01フルパッケージのほうもダウソしてみたら、やっぱりMyEdit.chm の『使用許諾契約書』を読めって書いてあるけど、使用許諾のページが開けないじゃん。
0180デフォルトの名無しさん
2008/09/20(土) 20:10:370181デフォルトの名無しさん
2008/09/20(土) 20:14:56アーカイブ壊れてるんじゃね?
myedit_v116_full.zip md5 c514e4e1d2680235ab7c61bfd8aed4c0
MyEdit.chm md5 1b63a35be248d1921acd47eb06d50ef1
0182デフォルトの名無しさん
2008/09/20(土) 20:20:24MyEdit.chmを入れ忘れてるだけじゃね?
0183デフォルトの名無しさん
2008/09/20(土) 20:21:25grepしたら、そのメソッド、どこからも呼ばれてないみたいだから、やっぱバグだろな。
0184デフォルトの名無しさん
2008/09/20(土) 20:28:32>>183
エディタのexeの方のソースってどっかにあった?
dllの方だけだと、多分クラスライブラリのインターフェースな関数だと思うから、
grepしても引っかからないのは当たり前っぽいんだけど。
あのエディタでGetTextWidth()が使われてないかはどうにも。
が、まぁ、バグっぽいってのは同意だがねー。
0185デフォルトの名無しさん
2008/09/20(土) 20:31:520186デフォルトの名無しさん
2008/09/20(土) 20:34:00本体のソースは入ってなかったのか。
そんなまじめに見てなかったよ。
0187デフォルトの名無しさん
2008/09/20(土) 23:06:150188デフォルトの名無しさん
2008/09/20(土) 23:07:11マクロ
CSTL あたりを参考にどうぞ
0189デフォルトの名無しさん
2008/09/21(日) 00:30:45割り算で
7÷32 の余りは 0 なんですか?
てっきり、余りは7だと思ってたんですが・・・
0190デフォルトの名無しさん
2008/09/21(日) 00:32:327 % 32
0191デフォルトの名無しさん
2008/09/21(日) 00:33:370192デフォルトの名無しさん
2008/09/21(日) 00:33:41数学の質問(算数か?)は専門スレへ
C言語の話なら割り算とあまりの計算のそれぞれで使う記号は何を使ってます?
0193デフォルトの名無しさん
2008/09/21(日) 00:50:01商なら7/32、余りなら7%32 でプログラム組んでみたのですが…
プログラム
printf("i=%dのとき i/32=%d…%d 余り/8=%d \n",i,i/32,i%32,(i%32)/8);
これを出力すると
i=0のとき i/32=0…0 余り/8=0
i=1のとき i/32=0…1 余り/8=0
i=2のとき i/32=0…2 余り/8=0
i=3のとき i/32=0…3 余り/8=0
i=4のとき i/32=0…4 余り/8=0
i=5のとき i/32=0…5 余り/8=0
i=6のとき i/32=0…6 余り/8=0
i=7のとき i/32=0…7 余り/8=0
i=8のとき i/32=0…8 余り/8=1
i=9のとき i/32=0…9 余り/8=1
i=10のとき i/32=0…10 余り/8=1
i=11のとき i/32=0…11 余り/8=1
i=12のとき i/32=0…12 余り/8=1
i=13のとき i/32=0…13 余り/8=1
i=14のとき i/32=0…14 余り/8=1
i=15のとき i/32=0…15 余り/8=1
i=16のとき i/32=0…16 余り/8=2
となってしまいまして…(@@;
0194デフォルトの名無しさん
2008/09/21(日) 00:54:51算数はできますか?
0195デフォルトの名無しさん
2008/09/21(日) 00:59:20それでいいと思うけど、どうなるはずだと思ってるの?
0196デフォルトの名無しさん
2008/09/21(日) 01:00:10その処理はなんらおかしくないw
0197デフォルトの名無しさん
2008/09/21(日) 01:06:250198193
2008/09/21(日) 01:08:43普通に合っていますね…。
商/ と 余% をごっちゃにしていました…。
しょうもない質問してすいませんでした!(*_*)
0199デフォルトの名無しさん
2008/09/21(日) 01:15:510200デフォルトの名無しさん
2008/09/21(日) 01:30:36配列までしか知らない俺も心配になる。大丈夫か?
0201デフォルトの名無しさん
2008/09/21(日) 01:35:20勘違いなんて誰にでもあるだろう
0202デフォルトの名無しさん
2008/09/21(日) 01:38:04まーな
|| と && と != を使った条件判断ってあまりくまないから
時々テストの段階で思ったように動かなくて後で気がつくってことはある。
0203デフォルトの名無しさん
2008/09/21(日) 01:43:56&と混ぜて使うと少し紛らわしい
0204デフォルトの名無しさん
2008/09/21(日) 03:06:33あぁああああ…ああ…あっあっー!あぁああああああ!!!C++C++C++ぅううぁわぁああああ!!!
あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん
んはぁっ!C++様の桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!!
間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!!
小説12巻のC++様かわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!!
アニメ2期放送されて良かったねC++様!あぁあああああ!かわいい!C++様!かわいい!あっああぁああ!
コミック2巻も発売されて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!!
ぐあああああああああああ!!!コミックなんて現実じゃない!!!!あ…小説もアニメもよく考えたら…
C + + 様 は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!!
そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!ベル研究所ぉおおおお!!
この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?表紙絵のC++様が僕を見てる?
表紙絵のC++様が僕を見てるぞ!C++様が僕を見てるぞ!挿絵のC++様が僕を見てるぞ!!
アニメのC++様が僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ!
いやっほぉおおおおおおお!!!僕にはC++様がいる!!やったよケティ!!ひとりでできるもん!!!
あ、コミックのC++様ああああああああああああああん!!いやぁあああああああああああああああ!!!!
あっあんああっああんあAda様ぁあ!!シ、Cー!!C#ぅうううううう!!!C++0xぅううう!!
ううっうぅうう!!俺の想いよC++へ届け!!ベル研究所のC++へ届け!
0205デフォルトの名無しさん
2008/09/21(日) 10:44:560206デフォルトの名無しさん
2008/09/21(日) 12:28:44#include <string.h>
void manko( unsigned long la ,char* str )
{
unsigned long msk = 0x80000000;
for( int i = 31; i >= 0; --i )
{
*(str + 31 - i) = ( msk & la ) ? '1' : '0';
msk >>= 1;
}
*(str + 32) = '\0';
}
0207デフォルトの名無しさん
2008/09/21(日) 12:40:30関数の名前を見た瞬間に読む気をなくした
0208デフォルトの名無しさん
2008/09/21(日) 13:02:470209デフォルトの名無しさん
2008/09/21(日) 13:19:14#include <string.h>
void main( void )
{
unsigned long msk = 0x80000000;
unsigned long la = 0x84218421;
unsigned char strings[33];
unsigned char* str;
int i,j;
str = &strings;
j = 0;
for( i = 31; i >= 0; --i )
{
*(str + 31 - i) = ( msk & la ) ? '1' : '0';
printf("%c", *(str + 31 - i) );
msk >>= 1;
if( j >= 3 )
{
printf(" ");
j = 0;
} else {
j++;
}
}
*(str + 32) = '\0';
}
0210209
2008/09/21(日) 13:19:57メモリ見れる環境なら直接見る、見れないならprintfで出してみる。
ま、結論いっちゃうと、"la"で貰った値をビット毎に評価して、真なら"1"を、偽なら"0"を
"str" に書き込んでる。
実行してみるとわかるが、"la" のどのビットが立ってるかがわかる、ということ。
0211デフォルトの名無しさん
2008/09/21(日) 15:28:030212デフォルトの名無しさん
2008/09/21(日) 15:56:26のようなローカル変数があったとして
そのような変数の宣言は定義を兼ねますので、
口頭で説明する場合はどちらの用語を使用するのが適切でしょうか?
あと上記のような宣言(定義)は初期値が不明ですので、このような宣言(定義)の
特別な呼び方などありましたら教えてください。
0213デフォルトの名無しさん
2008/09/21(日) 16:14:56強いて言えば宣言だと思う
あとは単に「初期化されていない」で十分
0214デフォルトの名無しさん
2008/09/21(日) 16:54:19C言語なら、定義の場合は定義と言っとけば大体問題ない。
あと、宣言が定義を兼ねてるのではなく、
ある種の宣言を特別に定義と呼ぶだけなので、
宣言と言ったところで別に問題ないと思う。
ていうか、どっちが適切かなんか文脈次第だろがよ。
漠然と聞かれても「どっちでも良い」としか言いようない。
0215デフォルトの名無しさん
2008/09/21(日) 17:42:400216デフォルトの名無しさん
2008/09/21(日) 17:57:46帰れよ
0217デフォルトの名無しさん
2008/09/21(日) 18:05:170218デフォルトの名無しさん
2008/09/21(日) 18:08:15みんな知ってるね
0219デフォルトの名無しさん
2008/09/21(日) 18:08:58C言語どころか日本語の通じないかたはお帰りください
0220デフォルトの名無しさん
2008/09/21(日) 18:14:23どの日本語が通じなかったんだ?
0221デフォルトの名無しさん
2008/09/21(日) 18:22:32日本語を理解できることは、このスレで議論する論客として最低限の資格だ
質問する気にしても、人にものを尋ねるときの態度がまるでなっておらず、質問者として最低限の資格もおまえは備えていない
繰り返すがチンパンジーには無理な問題だ
あきらめて帰れ
0222デフォルトの名無しさん
2008/09/21(日) 18:23:02自己分析がよくできてるね
0223デフォルトの名無しさん
2008/09/21(日) 18:24:21そんなに悔しかったのか、よかったな
0224デフォルトの名無しさん
2008/09/21(日) 18:32:470225デフォルトの名無しさん
2008/09/21(日) 18:45:10>どの日本語が通じなかったんだ?
どの、というより全体的に意味の取り方がおかしいと思われる。
どこをどう取ったら「宣言と定義は混同してよい」という結論になるんだ?
日本語が理解出来て無いとしか思えない。
0226デフォルトの名無しさん
2008/09/21(日) 19:21:16以前から私が作りたかった、ショートカット作成プログラムをぜひとも作りたいのです。
でも、やり方とかMSDNを調べてもわかりません。具体的に手順を書かせていただきますと。
1.コンソールアプリから2つフォルダのフルパスを入力する。
2.WindowsAPIで書いたショートカット作成関数を呼び出してお互いのフォルダにお互いのフォルダの
ショートカットを作成する。
そこで、ショートカット作成のWindows32APIのMSDNの調べ方もしくは
関数そのものを教えて欲しいのです。すみませんが、教えてください。よろしくお願いします。
0227デフォルトの名無しさん
2008/09/21(日) 19:23:11http://pc11.2ch.net/test/read.cgi/tech/1221446107/
0229デフォルトの名無しさん
2008/09/21(日) 21:28:19で、定義と宣言は混同しても文脈次第でどっちでも良いのか、悪いのか?
0230デフォルトの名無しさん
2008/09/21(日) 21:29:07せっかくだからジャンクションを作ってみてはどうだ?
0231デフォルトの名無しさん
2008/09/21(日) 23:14:08混同はしてはいけないけど、定義も宣言であるから、
文脈によってはどちらを使っても正しい表現になる場合もある。
どちらを使っても良い場合があるという事から、すなわち混同してよいと解釈したわけ?
やっぱり日本語が理解出来て無いようだね。
0232デフォルトの名無しさん
2008/09/21(日) 23:26:46* A function is only defined if its body is given
* so this is a declaration but not a definition
*/
int func_dec(void);
/*
* Because this function has a body, it is also
* a definition.
* Any variables declared inside will be definitions,
* unless the keyword 'extern' is used.
* Don't use 'extern' until you understand it!
*/
int def_func(void){
float f_var; /* a definition */
int counter; /* another definition */
int rand_num(void); /* declare (but not define) another function */
return(0);
}
0233232
2008/09/21(日) 23:42:20定義(definition)は変数やマクロや関数のボディを定義(define)すること
ではあるまいか?
0234デフォルトの名無しさん
2008/09/21(日) 23:43:450235デフォルトの名無しさん
2008/09/22(月) 00:13:30JISより抜粋。
>識別子の定義(definition)とは、宣言のうち次のものをいう。
>・オブジェクトに対しては、そのオブジェクトの領域を確保する宣言
>・関数に対しては、関数本体を含む宣言
>・列挙定数または型定義名に対しては、その識別子の(唯一の)宣言
余談だけど、C++だとまたもうちょっと違う。
0236デフォルトの名無しさん
2008/09/22(月) 08:50:57(func2) a, b を array[0], array[1] に置き換えた以外は func1 と同じ
このような時,func1 と func2 の振る舞いは変わりますか?
int func1(void)
{
register int a, b;
何か a, b をたくさん使う処理
}
int func2(void)
{
register int array[2];
何か array[0], array[1] をたくさん使う処理
}
0237デフォルトの名無しさん
2008/09/22(月) 10:37:59振舞いは変わらない。それで変わったら困るでしょ。
func2の方は最適化が阻害されて遅くなるコンパイラとかあるかもね。
0238デフォルトの名無しさん
2008/09/22(月) 16:16:39やっと少しお勉強してきたようだな
たったそれだけのために何時間かかってるんだよ ぼけ
文脈によってはなんて逃げてないで、どういう場合かはっきりしろ
現状、その逃げによって意味をなしていない
>ある種の宣言を特別に定義と呼ぶだけなので、
>宣言と言ったところで別に問題ないと思う。
○ 教えてくださいお願いします
0240デフォルトの名無しさん
2008/09/22(月) 16:52:09お帰りください
0241デフォルトの名無しさん
2008/09/22(月) 16:53:00お前が帰れカス
0242デフォルトの名無しさん
2008/09/22(月) 16:56:21これはひどい
>>238
お前さんこそそんな支離滅裂なレスを考えるのに17時間もかけたのかい
てなことになるな
0243デフォルトの名無しさん
2008/09/22(月) 17:09:28registerストレージクラスをどう解釈するかは処理系依存なのでなんともいえません。
0244デフォルトの名無しさん
2008/09/22(月) 17:45:22くわしく
0245デフォルトの名無しさん
2008/09/22(月) 17:58:350246デフォルトの名無しさん
2008/09/22(月) 18:20:18bar[r][c] = hoge;
↑これって
foo bar[row * col];
bar[r * col + c] = hoge;
に等しいのか、それとも
foo (bar[col])[row];
(bar[row])[col] = hoge;
なのか、どっちなんでしょう?
あと下のbarにsizeofするとsizeof(foo) * row * colに等しくなります
下のやつはbar[col]へのポインタの配列だから sizeof(foo*) * rowになると思うのですがなぜこうならないんでしょうか?
0247デフォルトの名無しさん
2008/09/22(月) 18:22:03詳しくも何も、規格票には「アクセスを可能な限り高速にすることを示唆する」とかなんかしか書いてなくて、
レジスタに割り当てろとも、アクセスを高速にしろとも要求されていない。
0248デフォルトの名無しさん
2008/09/22(月) 18:26:58即レスがトレードマークな常駐野郎にしては遅かったから変だと思ったんだよ
0249デフォルトの名無しさん
2008/09/22(月) 18:28:54配列はポインタではない。キミは何かを勘違いしてる。
次の3つは等しい:
foo bar[row][col];
int (bar[row])[col];
typedef foo foos[col];
foos bar[row];
これは縦と横が反対になっている:
foo (bar[col])[row];
これは明らかに違う:
foo bar[row * col];
0251デフォルトの名無しさん
2008/09/22(月) 18:35:30>下のやつはbar[col]へのポインタの配列だから
違うよ
foo (bar[col])[row] は foo[row] が col 個の配列
つまり foo bar[col][row] と同じ
foo[col] へのポインタ row 個の配列が欲しければ
foo (*bar[row])[col]
と書くけど、普通使わないと思うよ
foo へのポインタを row 個持つ配列
foo *bar[row]
の方がよく使う
0252デフォルトの名無しさん
2008/09/22(月) 18:40:17今はregister付けても大体無視されるよな
0253デフォルトの名無しさん
2008/09/22(月) 20:02:14いやそうじゃなくて、それで函数の振る舞いまで変わるの?
0254デフォルトの名無しさん
2008/09/22(月) 20:06:25「無視されます」とかドキュメントに明記してあったりな。
それでも C ではまだ & 付けれないという差があるが、
C++ では & 付けれるようになったんだよな。
0255デフォルトの名無しさん
2008/09/22(月) 20:12:51変わるわけない
>>243が質問の内容を勘違いしてるだけ
0256デフォルトの名無しさん
2008/09/22(月) 20:25:01関数の結果ことなのか、CPUが演算する内容なのか。
0257デフォルトの名無しさん
2008/09/22(月) 20:55:38未定義動作だから何が起こっても不思議じゃないだろ。
0258デフォルトの名無しさん
2008/09/22(月) 21:00:28処理系定義と未定義動作は別です。
register変数がどう解釈されるかは処理系定義です。
0259デフォルトの名無しさん
2008/09/22(月) 21:06:07register付けたら未定義動作ってどんな罠だよww
0260デフォルトの名無しさん
2008/09/22(月) 21:13:54register付きの配列にsizeof以外の演算子が使えることは保証されていない。
0261デフォルトの名無しさん
2008/09/22(月) 21:34:530262デフォルトの名無しさん
2008/09/22(月) 22:00:47なるほどね
でもそれだったら「処理系依存なのでなんともいえない」じゃなくて
「未定義だから結果は予想できない」が正しい答えだね
0263デフォルトの名無しさん
2008/09/22(月) 22:02:120264デフォルトの名無しさん
2008/09/22(月) 22:05:310265デフォルトの名無しさん
2008/09/22(月) 22:07:080266デフォルトの名無しさん
2008/09/22(月) 22:08:51「入門篇で聞くなボケェ」だと思われ
0267デフォルトの名無しさん
2008/09/22(月) 22:13:080268デフォルトの名無しさん
2008/09/22(月) 22:22:07http://pc11.2ch.net/test/read.cgi/tech/1201153965/
0269デフォルトの名無しさん
2008/09/22(月) 22:22:24そうなんですか!知りませんでした
どうもありがとうぐございます
0270デフォルトの名無しさん
2008/09/22(月) 22:37:220271デフォルトの名無しさん
2008/09/22(月) 22:51:15馬鹿は黙ってろ
0272デフォルトの名無しさん
2008/09/22(月) 23:02:44人間の体でいったら盲腸のようなもの
組み込み系用のマイナーなコンパイラを使っているんなら別だが
0273デフォルトの名無しさん
2008/09/22(月) 23:14:46( ・∀・) (´・ω・ ≡ ・ω・`) (・∀・ )
0274デフォルトの名無しさん
2008/09/22(月) 23:33:460275デフォルトの名無しさん
2008/09/23(火) 01:31:14でいいでしょ
0276デフォルトの名無しさん
2008/09/23(火) 05:59:280277デフォルトの名無しさん
2008/09/23(火) 06:49:20そいつが入門者を卒業するためにはできることからやってみるのみ
0278デフォルトの名無しさん
2008/09/23(火) 07:17:40環境はGCCです。
#define a(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, __VA_ARGS__)
#define b(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, ## __VA_ARGS__)
a("x=%d", x);と書いたときは、「fmt」が「"x=%d"」、「...」と「__VA_ARGS__」が「x」に対応するので、
fprintf(stderr, "%s()::" "x=%d", __func__, x); と置換されますが、
a("x")と、引数を1つだけしか書かなかった場合には、
fprintf(stderr, "%s()::" "x", __func__, );
とfprintfの引数リストがカンマで終わってしまいコンパイルエラーになります。
そこで、b(fmt, ...)のように##演算子を使うと、問題のカンマが取り除かれるらしいのです。
##は「パラメータ置換後に、両側の空白文字とともに各##も削除されて、
隣接するトークンが連結され、新しいトークンが形成される」、と
K&R第2版で書いてあるのですが、カンマも取り除かれるようになったのでしょうか?
それとも、これはGCCで通じる特別なものなのでしょうか?
長くなりましたが、よろしくおねがいします。
0279デフォルトの名無しさん
2008/09/23(火) 13:30:250280デフォルトの名無しさん
2008/09/23(火) 15:41:46キャストを使うことができるでしょうか?
実際にやりたいのは
色々なデータのサイズをネットワークバイトオーダーに変えてから
0のバイトを省略して送りたいのです
例えば
00 ab 00 cd
ならば
ab 00 cd
としたいのです
宜しくお願いします
0281デフォルトの名無しさん
2008/09/23(火) 15:45:03に対して
((char *)&a)[1]
とかやればいい
0282デフォルトの名無しさん
2008/09/23(火) 15:56:09char b = (char)(x >> 16)
char c = (char)(x >> 8)
char d = (char)x
0283デフォルトの名無しさん
2008/09/23(火) 15:57:390284デフォルトの名無しさん
2008/09/23(火) 15:59:040285デフォルトの名無しさん
2008/09/23(火) 16:15:15GCCの拡張です。
http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html#Variadic-Macros
0286デフォルトの名無しさん
2008/09/23(火) 16:35:06>>281のようにポインタ使うのでもいいし何度も宣言するようなら共用体使うとか
0287デフォルトの名無しさん
2008/09/23(火) 17:08:550288デフォルトの名無しさん
2008/09/23(火) 17:13:391バイトに縮めば、長さを別に持っていても節約にはなるか。
0289デフォルトの名無しさん
2008/09/23(火) 18:14:15それだとデータの内容が変わってるけど問題は無いの?
送信時に 03 ab 00 cd みたいに長さ情報を付加するの?
かなり高い確率で、受信側で次に送る送信データと連結されてしまうよ
0290デフォルトの名無しさん
2008/09/23(火) 18:45:30みなさんありがとうございます
共用体も初めて聞くので調べてみます
>>284
htonlの後出力する段階でどうしたらいいのかわからなくて
>>287
宿題ではありません
個人的にサーバープログラムを書いています
Cで本格的なプログラムを書くのが初めてなので
>>288>>289
00 00 ff ab 00 cd
みたいな感じで特定のバイト列でサイズのサイズを表し
可変長にしようと考えてます
0291デフォルトの名無しさん
2008/09/23(火) 20:25:250292デフォルトの名無しさん
2008/09/23(火) 20:45:45具体的な例を教えて頂けるとありがたいです
RFCの有名どころくらいしか知らないので
0293デフォルトの名無しさん
2008/09/23(火) 21:26:07頼むから、そのサーバソフトはLAN内でのみ使ってくれよ。
0294デフォルトの名無しさん
2008/09/23(火) 21:26:11負の値が送れないけど
0295デフォルトの名無しさん
2008/09/23(火) 21:28:400296デフォルトの名無しさん
2008/09/23(火) 21:33:140297デフォルトの名無しさん
2008/09/23(火) 21:36:59ああ、なるほど。
0298デフォルトの名無しさん
2008/09/23(火) 21:40:58元データ
00 ab 00 cd
ゼロサプレスしたデータ
00 00 ff ab 00 cd
長くなってるよ
0299デフォルトの名無しさん
2008/09/23(火) 21:49:01C言語とは関係無いじゃん
0300デフォルトの名無しさん
2008/09/23(火) 22:43:23理論的に大きさに制限の無いデータを全部受け取らなくても
サイズを知ることができるデータ構造が欲しいのです
そのような実例があったら是非教えて頂けると嬉しいです
例えばSMTPなんかは改行などが現れるまでデータの大きさが判りません
拡張でSIZEがありますけどサイズ自体が文字列だから
結局その大きさが判りません
無駄になるかもしれないデータを健気に受け取るより
最小のデータ受信で受け取るか判断できるようにして
トータルで無駄を無くす仕組みにしたいのです
>>294>>296
ありがとうございます
UTF-8調べてみます
>>293
初めてのプログラムですしいきなり誰かに使ってもらうつもりは
毛頭ありませんが他の人に見てもらいたいと思って
真面目に取り組んでいるので
宜しければどの辺が駄目か御教授頂ければ幸いです
0301デフォルトの名無しさん
2008/09/23(火) 22:45:07すみません
話し逸れてました
他で相談します
0302デフォルトの名無しさん
2008/09/24(水) 04:35:53でも一番上に定義した変数だけ思ったとおりになってくれません
最初にその変数を使うときはおもいどおりの数なんですが
二度目以降からなぜか中身が変わってしまいます
変数名を変えてみたりしてもダメでした
なぜか一番上に定義した変数だけなんです
どういう可能性がありますか?
0303デフォルトの名無しさん
2008/09/24(水) 04:39:32その構造体を晒してみて
あと、環境とかも
0304デフォルトの名無しさん
2008/09/24(水) 04:54:50構造体は
struct STATUS_D{
int w_x;
int w_y;
int pc_x;
int pc_y;
int pc_sx;
int pc_sy;
int menu_x;
int menu_y;
int data_x;
int data_y;
int time_x;
int time_y;
int m_x;
int m_y;
int c_size_x;
int c_size_y;
char menustr[5][STR_MAX];
int menu_num;
int w_handle;
int wb_handle;
int c_handle[5];
int c_handle_num;
};
です
この一番上のint w_x;の値が変わってしまいます
0305デフォルトの名無しさん
2008/09/24(水) 05:13:31構造体自体には問題ないね。きっとどこかでメモリ破壊をしているんだろう。
0306デフォルトの名無しさん
2008/09/24(水) 05:45:18全然わかんないです・・・
0307デフォルトの名無しさん
2008/09/24(水) 05:48:35前後に文字配列を定義してないですか?
0308デフォルトの名無しさん
2008/09/24(水) 05:51:55それよりこの構造体をどういう風にメモリに確保するか
でも変わるしなあ。
たとえば構造体を配列にしてるとなると構造体内部の配列の
最大値をちゃんと管理してなくてメモリ破壊してるとか。
ただ構造体に情報をセットするのは構造体の先頭の領域から
なら見かけ上正常に動いてるようにも見える。
0309デフォルトの名無しさん
2008/09/24(水) 05:55:220310デフォルトの名無しさん
2008/09/24(水) 06:08:33構造体のint w_x;の値を表示しておき、ステップ実行で値が変わったところを調べる
0311デフォルトの名無しさん
2008/09/24(水) 10:38:33ちゃんとヌルターミネートされてるか、
配列のサイズよりも大きいものを入れる可能性がある場所はないか。
デバッガあるなら>>310の方法で探すのが早いかな
0313デフォルトの名無しさん
2008/09/24(水) 19:34:37#include <stdio.h> //for sprintf
#endif
_DEBUGってなんですか?
0314デフォルトの名無しさん
2008/09/24(水) 19:39:570315デフォルトの名無しさん
2008/09/24(水) 20:47:47VCではデバッグモードでコンパイルすると
_DEBUGが暗黙のうちにdefineされる。
0316デフォルトの名無しさん
2008/09/25(木) 00:48:54len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
}
whileでstrの未処理の値を読み捨てているらしいけど、そこがしっくりこないんだが。
fgetsで読み捨てるって、具体的にどういう処理だ?><
0317デフォルトの名無しさん
2008/09/25(木) 00:53:57モードが何かは知らんけど、読み捨てるって一定条件に達したら
その後データが存在してても読まないだけじゃないの?
0318デフォルトの名無しさん
2008/09/25(木) 00:54:24でもその処理そもそもエンターで入力終了と決め込んでるという点がダメな気もする
0319デフォルトの名無しさん
2008/09/25(木) 00:55:020320デフォルトの名無しさん
2008/09/25(木) 01:01:28実際は
char str[BUFSIZE];
char dummy[4];
int a = 0, b, len;
while(a >= 0) {
printf("a, b = ? ");
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
continue;
}
if(sscanf(str, "%d %d %3s", &a, &b, dummy) != 2) {
printf("input format may be imcomplete\n");
continue;
}
printf("a = %d, b = %d\n", a, b);
}
こんななってる。安全な入力方法の一つだそうで。
オーバー時のwhileの処理は、未処理のまだ残っている値のクリアが目的らしいんだけど、
fgetsでどうクリアするのかがよくわからん><
0321デフォルトの名無しさん
2008/09/25(木) 01:04:18かなり頭の悪いやり方。
0322デフォルトの名無しさん
2008/09/25(木) 01:11:01while(getchar()!='\n')で十分な気はするが。
0323デフォルトの名無しさん
2008/09/25(木) 01:17:36そうそう、それでもいいって書いてあった。
あれか、未処理だった部分がstrに入ってくるんかね?
んで、未処理だった値も処理されてクリアってこと?><
0324デフォルトの名無しさん
2008/09/25(木) 01:21:37読み込みきれなかった分までstrに上書きしながら
順次読み込んでいって、以降するはずだった処理は
全部ぶっ飛ばしてまた最初からと言う方法を取ってる
0325デフォルトの名無しさん
2008/09/25(木) 01:26:05こういうときこそdo{}while使ってやれよw
0326デフォルトの名無しさん
2008/09/25(木) 01:28:40ありがとうございます、なんとなく解りました。
0327デフォルトの名無しさん
2008/09/25(木) 01:32:44ちゃんとみろ、それは的外れだ
0328デフォルトの名無しさん
2008/09/25(木) 01:35:20if内に進んだ最初のwhileの判定はifでしたのとまったく同じだけど?
0329デフォルトの名無しさん
2008/09/25(木) 01:42:13お前continueが見えてないの?
0330デフォルトの名無しさん
2008/09/25(木) 01:43:26この話にcontinue関係ないw
0331デフォルトの名無しさん
2008/09/25(木) 01:48:29これと
>while(str[len - 1] != '\n') {
これの条件判定が同じで、whileの一回目の判定が無駄だって言ってるんだが理解できてる?
0332デフォルトの名無しさん
2008/09/25(木) 01:52:17とソースを書けば一番手っ取り早いよねと横レス
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
do {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
} while(str[len - 1] != '\n');
continue;
}
0333デフォルトの名無しさん
2008/09/25(木) 02:30:550334デフォルトの名無しさん
2008/09/25(木) 02:33:020335デフォルトの名無しさん
2008/09/25(木) 04:16:05超簡単なことなんだけど、C言語の配列って宣言時にしか初期化できないんだっけか?
しばらくC言語やってないもんで。。
よろしく。
0336デフォルトの名無しさん
2008/09/25(木) 07:39:47それとも初期化子の使用のことか?それなら、宣言時にしか使えないな
0337デフォルトの名無しさん
2008/09/25(木) 08:34:04やっぱバグおきますかね?
参考にしてるソースではstrcpy_sとかstrcat_s、sprintf_s使ってるんですが
私BCC使ってるので使えないんです(たぶん)
0338デフォルトの名無しさん
2008/09/25(木) 08:36:50sprintf()でも%sや%fを生で使わなければ随分違うと思うよ。
例えば、%.20sとするとか%10fにするとかいっそ%gを使うとか。
0339デフォルトの名無しさん
2008/09/25(木) 10:27:10_sの方を使ってても同じぐらいバグを出しやすいと思うよ。バグっても
セキュリティホールになりにくいだけで。
C++のstringやらCStringを使うほうがいいです。
0340デフォルトの名無しさん
2008/09/25(木) 11:48:170341335
2008/09/25(木) 13:37:47そうです。初期化子のことです><; やっぱ宣言時にしかつかえないんですね><;
宣言時以降で、array[] = {1, 2, 3, 4, 5}; とかいう文をCでそういえばみないなあとおもって。
Javaとかの高級言語ばっかつかってたから、脳みそパープリンになってました。本当にありがとうございました><;
0342デフォルトの名無しさん
2008/09/25(木) 13:42:52バグ起きるかどうかは自分のコーディング次第じゃない?
strcpy_sはBCCじゃ使えないけど、自分で作ればおk
0344デフォルトの名無しさん
2008/09/26(金) 07:51:180345デフォルトの名無しさん
2008/09/26(金) 08:08:070346デフォルトの名無しさん
2008/09/26(金) 08:11:17そんなのがバグ。
人は間違えるもの、間違えた時の危機管理が問題であって、
完璧に間違えないように作るという方向では、危機を避けることができない
君がやっているのは問題の先送り。トラブルがでてから対処すればいいじゃん。
それが致命傷になる。
0347デフォルトの名無しさん
2008/09/26(金) 12:39:51事故んねえように日頃から心がけることこそ管理しきれない危機への危機管理
どんなにセキュアなシステムでも使う奴がアフォでは結局危ない、という意味で
> 自分のコーディング次第
に賛成
0348デフォルトの名無しさん
2008/09/26(金) 13:17:350349デフォルトの名無しさん
2008/09/27(土) 13:38:21基本まではちゃんとやっていたが、本格的に関数使い出したり二分木のあたりから\(^o^)/
0350デフォルトの名無しさん
2008/09/27(土) 13:38:57処理1;
if ( 条件2 ) {
処理2;
} else {
処理3;
}
} else {
処理3;
}
処理4;
処理3を1箇所にする書き方を教えてください。
0351デフォルトの名無しさん
2008/09/27(土) 14:01:43処理1;
if ( 条件2 ) {
処理2;
} else {
goto label;
}
} else {
label:
処理3;
}
処理4;
0352デフォルトの名無しさん
2008/09/27(土) 14:02:33処理2;
} else {
処理3;
}
処理4;
0353デフォルトの名無しさん
2008/09/27(土) 14:04:29それはアウトだろボケ
0354デフォルトの名無しさん
2008/09/27(土) 14:10:57default:
処理1;
if (条件2) {
処理2;
break;
}
case 0:
処理3;
}
処理4;
0355デフォルトの名無しさん
2008/09/27(土) 14:12:03goto使うならこうだな。
if ( 条件1 ) {
処理1;
if ( 条件2 ) {
処理2;
goto label;
}
}
処理3;
label:
処理4;
0356デフォルトの名無しさん
2008/09/27(土) 14:18:15goto入れる場所違わね?
0357デフォルトの名無しさん
2008/09/27(土) 14:24:280358350
2008/09/27(土) 14:38:050359デフォルトの名無しさん
2008/09/27(土) 14:44:27そのていどwebで十分
0360デフォルトの名無しさん
2008/09/27(土) 15:46:20goto入れる場所変えたらどうにかなるもんでもないでそ。
>>355のgoto文以外の並びじゃどうあがいても無理。
0361デフォルトの名無しさん
2008/09/27(土) 17:27:470362デフォルトの名無しさん
2008/09/27(土) 20:19:290363デフォルトの名無しさん
2008/09/27(土) 21:35:050364デフォルトの名無しさん
2008/09/27(土) 21:44:460365デフォルトの名無しさん
2008/09/27(土) 22:12:52case 0:
処理1;
if( 条件2 ){
処理2;
break;
}
case 1:
処理3;
}
0366デフォルトの名無しさん
2008/09/27(土) 22:17:120367デフォルトの名無しさん
2008/09/27(土) 22:57:130 < hoge
みたいに比較演算子使うときに定数を左辺に持ってくる書き方は
どのようなメリットがあるのですか?
0368デフォルトの名無しさん
2008/09/27(土) 22:59:090369デフォルトの名無しさん
2008/09/27(土) 22:59:50イメージとして数直線があるとき
0370デフォルトの名無しさん
2008/09/27(土) 23:01:03なんかだと数学の書き方にちょっと似る
0371デフォルトの名無しさん
2008/09/27(土) 23:08:130372デフォルトの名無しさん
2008/09/27(土) 23:09:490 ≦ hoge ≦ 10 みたいな書き方からの連想だよね。
0373デフォルトの名無しさん
2008/09/27(土) 23:10:10よう俺
0374デフォルトの名無しさん
2008/09/27(土) 23:12:44自分は代入演算子と間違えないためかと思ってました
>>369
なるほど〜
数直線なんて単語すっかり忘れてました
>>370
そういう使い方もあるのですね
とても参考になりました
ありがとうございます
0375デフォルトの名無しさん
2008/09/28(日) 02:25:391234と連結させたint型に直したい時に
なにか賢い方法ありますか?
0376デフォルトの名無しさん
2008/09/28(日) 02:27:341234と連結させたint型とはなんですか?
10進数の1234ですか。
0377デフォルトの名無しさん
2008/09/28(日) 02:28:140378デフォルトの名無しさん
2008/09/28(日) 02:34:060379デフォルトの名無しさん
2008/09/28(日) 08:17:060380デフォルトの名無しさん
2008/09/28(日) 08:47:23test.exeはどのパスにあるか調べる方法はありますか?
0381デフォルトの名無しさん
2008/09/28(日) 08:50:530382デフォルトの名無しさん
2008/09/28(日) 08:58:32つmain
0383デフォルトの名無しさん
2008/09/28(日) 09:01:41例えばmemcpyはバイト数指定なのに32bit単位でコピーして端数処理もやってるのもあるから、そこそこ速い
0384デフォルトの名無しさん
2008/09/28(日) 09:02:59もうちょい教えてください。やり方判りません
0385デフォルトの名無しさん
2008/09/28(日) 09:40:520386デフォルトの名無しさん
2008/09/28(日) 09:43:21なぜこの方法で渡せるのかわかりません。
[2][2]で受け渡したいです。
void func(int array[][2]); //関数宣言
void mainf(){
int array[2][2]={1,2,
3,4};
func(array)
}
void func(int array[][2]){
}
0387デフォルトの名無しさん
2008/09/28(日) 10:01:23なぜ[][2]で渡せるかは配列の構造を調べてみるべし
0388デフォルトの名無しさん
2008/09/28(日) 10:05:12配列は
最初のアドレスとデータ型さえわかれば
次の番地がわかるってことですか?
そんでNULLまでが範囲ってことですか?
2次元だと添字情報がないと
次の番地がわからないので
書かなきゃいけないってことですね?
日本語でちゃんと説明できませんが
なんとなくわかりました。
0389デフォルトの名無しさん
2008/09/28(日) 10:11:02ただし、範囲のチェックはやってない。
環境変数のPATHのディレクトリを順に参照していってtest.exeを探していくんじゃダメ?
なかったら最後にカレントディレクトリ調べて、それでもなければ利用不可能って事になる。
0391デフォルトの名無しさん
2008/09/28(日) 11:57:31カレントディレクトリは一番最初でしょう。
0393デフォルトの名無しさん
2008/09/28(日) 12:42:250394デフォルトの名無しさん
2008/09/28(日) 13:19:250395デフォルトの名無しさん
2008/09/28(日) 13:21:160396デフォルトの名無しさん
2008/09/28(日) 13:44:400397デフォルトの名無しさん
2008/09/28(日) 15:12:090398くさかべ様
2008/09/28(日) 16:44:190399デフォルトの名無しさん
2008/09/28(日) 16:48:570400デフォルトの名無しさん
2008/09/28(日) 18:18:09使えるときいたのですが、本当ですか?
以前、ボーランドという会社のコンパイラを使おうと思ったのですが
うまくいかなかったので。。
もし、なにも設定しなくてもいいなら、つかってみたいんですが。
よろしくお願いします。
0401デフォルトの名無しさん
2008/09/28(日) 18:21:460402デフォルトの名無しさん
2008/09/28(日) 18:23:06なにも設定したくないならvisualstudioおすすめ
0403デフォルトの名無しさん
2008/09/28(日) 18:26:450404デフォルトの名無しさん
2008/09/28(日) 18:38:190405400
2008/09/28(日) 18:40:10一度プログラムというのをやってみたいと思っていたのです。
visualstudioでググってみましたら、ただらしいですね。そいつでやってみます。
このいたの上にも情報があるみたいですね。ありがとうございました。
0406デフォルトの名無しさん
2008/09/28(日) 19:24:39がんがれノシ
0407デフォルトの名無しさん
2008/09/28(日) 19:31:03まあ、これで覚えろ
きっかけが無いと覚えれないしな。
0408デフォルトの名無しさん
2008/09/28(日) 22:19:16って、argv[]っていう配列へのぽちんたという意味なのか、
ぽちんた変数配列argvっていう意味なのかどっちなの?
教えてエロイ人。
0409408
2008/09/28(日) 22:20:06ぽちんた変数配列argvっていう意味
↓
ぽちんた変数の配列argvっていう意味
0410デフォルトの名無しさん
2008/09/28(日) 22:25:00っていう意味で合ってる
でも実際はchar **argvだけど
0411デフォルトの名無しさん
2008/09/28(日) 22:26:370412デフォルトの名無しさん
2008/09/28(日) 22:34:330413408
2008/09/28(日) 22:56:14細かいところがむずかしいね。ありがとう。よくわかったよ。
0414デフォルトの名無しさん
2008/09/28(日) 23:05:440415デフォルトの名無しさん
2008/09/28(日) 23:26:54改行文字をなくしたいです。どうすればいいですか?
0416デフォルトの名無しさん
2008/09/28(日) 23:28:23最後の改行文字をヌル文字に書き換える
0417416
2008/09/28(日) 23:39:060418デフォルトの名無しさん
2008/09/29(月) 01:29:14*str = "abcde";
ってかいてあったんだ。でも今の本はたいてい char str[80] = "abcde"ってかいてある。
最初の本のことが頭にあったから、char *str1=""; *str2="";と宣言してそれにgetsで読み込ませたら
str1のあとに必ずstr2の文字まで連結されて格納されてしまうんだけど、それはやっぱそういうことで
stdinから読み込ませる文字列を格納するのは、ポインタでなく配列で宣言しなくちゃいけないわけなの?
なんか、こないだ立ち読みしてた本でも文字列はポインタで表現みたいな事が強調してあったから
読み込ませる文字列もポインタに読み込ませればいいのかなとおもったんだけど。
すまそ。寝るのでお礼は明日になります。教えてくれる方、よろしくお願いします。
0419デフォルトの名無しさん
2008/09/29(月) 01:38:11おまえが無茶苦茶してるだけ
眠い上に長くなるから今説明しないけど
0420デフォルトの名無しさん
2008/09/29(月) 01:39:300421デフォルトの名無しさん
2008/09/29(月) 04:15:22struct database {
char boolen;
long data[3];
};
このような構造体を作ってfreadで読み込んだのですが
charのところで4バイト読み込み、最初の1バイトだけ変数に入れて3バイト破棄するという変な動作をします。
printf("%d\n",sizeof(struct database));
で表示させたところ16と表示されどうにもこうにもできません。
どうすればちゃんと1バイトだけ読み込むのか教えてください。お願いします。
0422デフォルトの名無しさん
2008/09/29(月) 04:42:340423デフォルトの名無しさん
2008/09/29(月) 04:45:07*--- char boolean
**** float data[1]
**** float data[1]
**** float data[2]
0424デフォルトの名無しさん
2008/09/29(月) 04:47:514バイト読む->data[0]に格納
4バイト読む->data[1]に格納
4バイト読む->data[2]に格納
とすればおk
0425デフォルトの名無しさん
2008/09/29(月) 05:35:560426デフォルトの名無しさん
2008/09/29(月) 06:15:10しかし>>424,425さんのように手間を惜しまない方が賢明
0427デフォルトの名無しさん
2008/09/29(月) 08:37:49とりあえず、本は買って隅から隅まで読め
0428421
2008/09/29(月) 09:50:01ありがとうございます。
コンパイラの仕様でそうなっているんですか。
やっぱり一気に読むより個別に読んだほうが確実ですね。
0429デフォルトの名無しさん
2008/09/29(月) 09:59:04書くときにも同じことやりそうだし。
0430デフォルトの名無しさん
2008/09/29(月) 14:05:10union chinpo
{
char str1[13];
struct database {
char boolen;
long data[3];
};
ユニオン使って、srt1で一括読み込みすればいいですよ。
0431デフォルトの名無しさん
2008/09/29(月) 14:21:47うそつくな
0433デフォルトの名無しさん
2008/09/29(月) 20:02:24> でも今の本はたいてい char str[80] = "abcde"ってかいてある。
そんなことねーだろ。
0434430
2008/09/29(月) 22:28:12ごめんねごめんね^^
0435デフォルトの名無しさん
2008/09/29(月) 22:31:16せめてやりとりぐらいは呼んでからレスしてね
0436デフォルトの名無しさん
2008/09/29(月) 22:53:58ユニックス的でいかすぜ
0437418
2008/09/30(火) 00:56:23必ず、配列で宣言するようにします><;ありがとうございました。
0438デフォルトの名無しさん
2008/09/30(火) 00:57:38printfで出力しようとおもったら、困りました。出力できませんかね?
0439デフォルトの名無しさん
2008/09/30(火) 00:58:060441デフォルトの名無しさん
2008/09/30(火) 01:36:52影響範囲が大きすぎて触るのが怖い場合は、グローバル変数にアクセスするための関数を作ればおk
#include<stdio.h>
int value=1234;
char string[256]="this is global.";
int *global_value(void){
return &value;
}
char *global_string(void){
return string;
}
int main(void)
{
int value=2345;
char string[256]="this is local.";
printf("value=%d\n", value);
printf("string=%s\n", string);
printf("value=%d\n", *global_value());
printf("string=%s\n", global_string());
return 0;
}
0442デフォルトの名無しさん
2008/09/30(火) 08:42:43ゲーム作ろうとするとグローバルのほうが簡単に書けるような気がするんだけど
0443デフォルトの名無しさん
2008/09/30(火) 08:46:38そのグローバル領域の使い方次第じゃないの?
アクセス速度ばっかり追求しすぎて別ソースに書かれてる
領域へexternでアクセスしてればわかりにくいソースになるし。
速度は犠牲になるけど、別ソースで持ってる領域へアクセスする場合は
アクセス用関数を用意して領域をいじるとかね。
あとは命名規則をしっかり作って、どこ管理の関数・領域かが
一目でわかるようにしてあればexternで触っても問題ないだろうし。
0444デフォルトの名無しさん
2008/09/30(火) 10:25:57in function cvalloc
というエラーが出てプログラムがとまってしまいます。
これを防ぐにはどうしたらいいでしょうか。
0445デフォルトの名無しさん
2008/09/30(火) 10:31:17メモリが足らない、と言ってる
・メモリを増やす
・メモリの使い方を見直して無駄遣いを減らすなり節約するなり
0446デフォルトの名無しさん
2008/09/30(火) 17:25:04そう思うなら、とことんやってみれ
なんでダメなのかもわからん奴が教条主義的に嫌って書いたコードは
おぬしのコードよりダメだぜ、きっと
0447デフォルトの名無しさん
2008/09/30(火) 17:50:35{
int i, j;
for(i = 0, j = 0; i < len_wide*2; i++){
if(wide[i] != '\0')
malt[j++] = wide[i];
}
malt[j] = '\0';
}
int main()
{
TCHAR wide[64] = L"testテストですtest";
char malt[64];
ChangeWtoM(malt, (char*)wide, lstrlen(wide));
printf("%s", malt);
return 0;
}
ワイド文字文字列をマルチバイト文字列に変換する関数を作りたいのです。
いろいろ試してみたのですが上手く行きません。
これは何がいけないのでしょうか。
0448デフォルトの名無しさん
2008/09/30(火) 18:04:050449デフォルトの名無しさん
2008/09/30(火) 18:08:39環境は?汎用的に作ると長くなるから特定したほうがいいかも。
0450447
2008/09/30(火) 18:10:13だと思っているんですけど
0452デフォルトの名無しさん
2008/09/30(火) 18:12:55実際のワイド文字列とマルチバイト文字列を見比べてみ
void p(char *p, int len) {
int i;
for (i = 0; i < len; i++)
printf("%02x ", p[i] & 255);
printf("\n");
}
int main() {
wchar_t *wide = L"testテストですtest";
char *mb = "testテストですtest";
p((char*) wide, wcslen(wide) * 2);
p(mb, strlen(mb));
}
0453デフォルトの名無しさん
2008/09/30(火) 18:13:35文字コードの種類を一度勉強したほうがいいよ。
どうせS-JIS、JIS,
0454453
2008/09/30(火) 18:14:21EUC,UTF系との相互変換とかくらいだろうし
0455デフォルトの名無しさん
2008/09/30(火) 18:17:02VC++なら、CStringを使って、、、っとこれはC++だからスレ違いか。
0456デフォルトの名無しさん
2008/09/30(火) 18:21:52ありがとうございます
アドバイスを元にいろいろ調べてみます
0457デフォルトの名無しさん
2008/09/30(火) 20:00:21たとえば int (*p[5])(int x, int y)っていう関数へのポインタ変数の配列pをつくったとする
この配列に格納できる関数は戻り値がint型で、引数はint型を2つとる関数じゃないと
だめみたいなんだけど、Cでは色んな型の戻り値や引数を持つ関数をたくさん収納できる
配列っていうのは、作成できないんですか?よくわからないけど、void型で宣言しておいてあとでキャストするとかしても
無理なんでしょうか?よろしくお願いしますm(_ _)m
0458デフォルトの名無しさん
2008/09/30(火) 20:19:380459デフォルトの名無しさん
2008/09/30(火) 20:21:150460デフォルトの名無しさん
2008/09/30(火) 20:21:440 <= n && n < 5 として
int r = (*p[n])(ここを); どう書きたいんでい?
0461デフォルトの名無しさん
2008/09/30(火) 20:25:22ヒント:printf()
0462デフォルトの名無しさん
2008/09/30(火) 20:35:110463デフォルトの名無しさん
2008/09/30(火) 20:39:23構造体を連絡用にしてその構造体のポインタ1個だけを引数にする関数にしてしまえばいい。
あとは構造体全体を共用体にでもして引数が変わる関数分用意すればいい。
0464デフォルトの名無しさん
2008/09/30(火) 20:40:47printf("a=%d b=%d",a,b);
って使い方ができるだろ
0465デフォルトの名無しさん
2008/09/30(火) 21:02:50ちなみに戻り値も引数もバラバラな関数群へのポインタを
配列に格納したいというのは、どういったシチュエーション?
>460 が指摘しているように call するときの手間を考えたら
メリットなさげ
0466デフォルトの名無しさん
2008/09/30(火) 21:34:52*エンディアン、MSB/LSBファースト、インテル、モトローラ, 送信値の関係
Big Endian = Motorola = メモリ番地0にMSB = MSBファースト
Little Endian = Intel = メモリ番地0にLSB=LSBファースト
とまでは分かっています。
仮に、10進数60000を0- 1byte(2byte)使い、送信するとします。
60000(10進)=>EA60(16進)
MSB = 0 byte LSB=7byteで定義し、ビッグエンディアンで送信するとき、
バイトの並びはどちらが正しいでしょうか?
�@ EA 60 00 00 00 00 00 00
�A 60 EA 00 00 00 00 00 00
byte 0 1 2 3 4 5 6 7
MSB LSB
あほですいません。ご教授お願い致します。
0467デフォルトの名無しさん
2008/09/30(火) 21:40:3300 00 60 EA
ビッグエンディアンだと
00 00 60 EA
リトルエンディアンだと
EA 60 00 00
0468きもい
2008/09/30(火) 21:45:36くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
0469デフォルトの名無しさん
2008/09/30(火) 21:46:16意味が分からんよ
long x=0x12345678;
short y[2]={0x1234,0x5678};
ビッグエンディアン
x : 12 34 56 78
y : 12 34 56 78
リトルエンディアン
x : 78 56 34 12
y : 34 12 78 56
こうなる
MSB = 0 byte LSB=7byteで定義したら
>>466 の数値をビッグエンディアンで表現すると
00 00 00 00 00 00 EA 60
じゃないかな?
> 0- 1byte(2byte)使い、
これでは定義と両立できない気がする
0470デフォルトの名無しさん
2008/09/30(火) 22:03:17>>469
ご回答ありがとうございます。
Endianの問題はハードウェアに依存し、
MSB/LSBのバイト定義はソフトの問題だと認識してよろしいでしょうか?
MSB=0byteのLittle Endian方式とMSB=7byteのBig Endianは結果的に
同じと理解してもよろしいでしょうか?
0471デフォルトの名無しさん
2008/09/30(火) 22:04:040472デフォルトの名無しさん
2008/09/30(火) 22:07:13すいません。プログラミングの素養は0なんです。
0473デフォルトの名無しさん
2008/09/30(火) 22:10:27>MSB/LSBのバイト定義はソフトの問題だと認識してよろしいでしょうか?
バイトオーダと型の大きさによる
0474デフォルトの名無しさん
2008/09/30(火) 22:13:12言ってることが理解できん。
MSB=0byteってどういう意味なんだ。
0475デフォルトの名無しさん
2008/09/30(火) 22:15:090476デフォルトの名無しさん
2008/09/30(火) 22:16:100バイト目って意味じゃないかな
勿論マのいう 0 番目は一般人の 1 番目相当だがw
0477デフォルトの名無しさん
2008/09/30(火) 22:18:54通常なら、32bit系の場合、
LSB=0 byte目、MSB=4byte目
なんでしょうけど、
これの定義が逆になっている製品があるんです。
スレ違いかもしれませんが、車載LAN (CAN)の話です。
基本的には、シリアル通信なので、この問題は同じかなと思ったのですが・・・
0478デフォルトの名無しさん
2008/09/30(火) 22:20:20訂正です。0ベースで書いてるので、MSB=3byte目ですね。
0479デフォルトの名無しさん
2008/09/30(火) 22:45:290480デフォルトの名無しさん
2008/09/30(火) 23:06:24ビッグエンディアンなら常に
MSB=0byte目
LSB=(型のサイズ)-1byte目
リトルエンディアンなら常に
LSB=0byte目
MSB=(型のサイズ)-1byte目
0481デフォルトの名無しさん
2008/09/30(火) 23:43:09実際に送信する順番という意味では、
ビッグエンディアン、リトルエンディアンにかかわりなく、
LSBが一番先という事になるのでしょうか?
60000(10進)、EA60は、ビッグエンディアン送信で
00 00 EA 60
--------> t
つまりLSBファーストとなり
受信側ビッグエンディアンで読み出し(計算)はそのまま
0000EA60
として扱うという認識でよろしいでしょうか?
0482デフォルトの名無しさん
2008/09/30(火) 23:48:000483デフォルトの名無しさん
2008/09/30(火) 23:48:57わかりました。
0484457
2008/09/30(火) 23:49:06私は、関数ポインタ配列を覚えたててでして、おもしろいから色々と趣味で組んでいます。
ですから、仕事上どうしても必要とか出なくて。。
本当に色々な方に意見を書いていただきましてとても感謝しています。自分としては>>458さんや
>>463さんが教えてくれた可変長引数と構造体&共用体を組み合わせて色々自作してみたいとおもいます。
このたびはありがとうございました。自分で色々と作成すると楽しいです。自分は趣味でやっているので。
色々とわかりだして今が一番楽しい時期です。ありがとうございました。
0485デフォルトの名無しさん
2008/09/30(火) 23:51:10シリアル通信時のバイトオーダーをどちらかにきっちり決めておけばいい
例としてネットワークバイトオーダーはビッグエンディアンと決まっている
0486デフォルトの名無しさん
2008/09/30(火) 23:54:360x00, 0x00, 0xEA, 0x60の順だろう。だからMSBが最初。
0487デフォルトの名無しさん
2008/10/01(水) 00:20:04まだいます。すいません。
>>486
ありがとうございます。
ということは、
ビッグエンディアンはMSB(データの3 byte目)を最初に送信
リトルエンディアンはLSB(データの0 byte目)を最初に送信
ということですね?
>>480の内容と異なる気が・・・
混乱してきました。もっと勉強します。
0488デフォルトの名無しさん
2008/10/01(水) 00:38:20ここをみて勉強してください
http://www.ertl.jp/~takayuki/readings/info/no05.html
0489デフォルトの名無しさん
2008/10/01(水) 00:44:37ありがとうございます。
0490デフォルトの名無しさん
2008/10/01(水) 00:51:38なんでMS+Intelは、こういつもいつも
0491デフォルトの名無しさん
2008/10/01(水) 00:53:07おいおいw
0492デフォルトの名無しさん
2008/10/01(水) 00:55:49MIPSはどっちにでもできるぞ
現にPSPはリトルエンディアンだ。
アライメントはインテルのように甘くはないけど
0494デフォルトの名無しさん
2008/10/01(水) 01:06:11設計時はともかくプログラム的にはあまり気にしないけどさ
0495デフォルトの名無しさん
2008/10/01(水) 02:00:07エンディアン動作モードのビットがMSRに用意されてるとか
>487
486の例で言えば、3バイト目の「60」はどうみてもLSBなんだが……
0496デフォルトの名無しさん
2008/10/01(水) 02:02:19C言語でスタック領域からメモリを動的に取得する方法は何があるでしょうか?
ネットで検索して探したところallocca()という標準?関数があるらしいのですが、
どんな仕様なのか分かっておりません。。
0497デフォルトの名無しさん
2008/10/01(水) 02:04:260498デフォルトの名無しさん
2008/10/01(水) 02:12:390499デフォルトの名無しさん
2008/10/01(水) 02:14:13alloccaは標準でなくて特殊な関数のようですが、あなたの環境にalloccaはありますか?
そもそも、なぜmallocではいけないのでしょうか?スタック領域を使う理由は?
0500デフォルトの名無しさん
2008/10/01(水) 02:33:24スタック領域だろ。 ヒープもスタックも同一のメモリを使う。
0501デフォルトの名無しさん
2008/10/01(水) 02:34:25関数を抜けると消えるし、注意して使わないと領域破壊して関数から戻れなくなる。
普通にmallocすべき
0502デフォルトの名無しさん
2008/10/01(水) 03:07:360503デフォルトの名無しさん
2008/10/01(水) 04:20:11xdawinというソフトで逆コンパイルをしようと思いましたが
エラー ufree: は malloc されていません
とでました。そこで
\アドレス\ void *malloc(size_t ○)
と実行しましたが
too many positional parameter
とでてしまい、再度。結果、サイズが1でも0でもこれが出てしまいます
・エラーを処理しようと思った式が全然ダメ なのか
・サイズがおかしい のか誰か教えてください
0504デフォルトの名無しさん
2008/10/01(水) 04:30:29http://www.linux.or.jp/JM/html/LDP_man-pages/man3/alloca.3.html
これを読むと、ナーバスな関数のような感じだな
longjmpやsiglongjmpを使ったときにメモリの開放が簡単で、それ以外には
使用は推奨されていない。
と書かれている。
0505デフォルトの名無しさん
2008/10/01(水) 04:42:25too many positional parameters
ポジショナルパラメータの数が多すぎるというエラーです。
スクリプトを実行したときの、そのスクリプトに渡すのパラメータの数が
あっていない可能性があります。
としか、お答えできません。
0506デフォルトの名無しさん
2008/10/01(水) 13:27:19スレ違いだと思う
0508デフォルトの名無しさん
2008/10/01(水) 19:20:41{
// 真ん中
center = (left + right) / 2;
printf("%d %d %d\n",center,left,right);
// みつかったら
if(a[center] == key){
printf("\nみつかった %d\n",center);
printf("\n%d\n",a[center]);
break;
}
// みつからなかったら
if(left >= right) {
printf("みつからなかった");
break;
}
if( a[center] < key ) left = center + 1;
if( a[center] > key ) right = center - 1;
// 時を止める
getch();
}
バイナリーサーチのプログラムこれでおk?
0509デフォルトの名無しさん
2008/10/01(水) 19:23:00今回は成功したっぽいけど、間違えているかもしれないから修正あったら頼みます
0510デフォルトの名無しさん
2008/10/01(水) 19:30:510511デフォルトの名無しさん
2008/10/01(水) 19:35:550512デフォルトの名無しさん
2008/10/01(水) 19:38:50バイナリサーチを理解するため。
0513デフォルトの名無しさん
2008/10/01(水) 20:02:46プログラムが正しいかどうか、他人に聞くしかテスト技法を知らんのか
テスト項目の導き方はいろいろある
それが知りたければ便所の落書きより有料情報をあたったほうがいい
0514デフォルトの名無しさん
2008/10/01(水) 20:15:04分かった。
0515デフォルトの名無しさん
2008/10/01(水) 20:34:11typedef union
{
float f;
unsigned char b[4];
} Endian32;
float ConvertF32( void *inData )
{
EndianF32 val;
val.b[0] = ((Endian32 *)inData)->b[3];
val.b[1] = ((Endian32 *)inData)->b[2];
val.b[2] = ((Endian32 *)inData)->b[1];
val.b[3] = ((Endian32 *)inData)->b[0];
return val.f;
}
void test( float inVal )
{
float ret = ConvertF32( &inVal );
fwrite( &ret, sizeof(float), 1, fp );
}
こんな感じでやっています。
1.0を送ると、int型の1が何故か入ってしまいます。
0516515続き
2008/10/01(水) 20:34:400011 1111 1000 0000 0000 0000 0000 0000
ビッグエンディアンにすればこうなるはずなんですが、
0000 0000 0000 0000 1000 0000 0011 1111
なぜか
0000 0000 0000 0000 0000 0000 0000 0001
こうなりますw
同じようなやり方で、intなど整数型は問題なく出来ています。
どこが間違っているんでしょうか?><
0517デフォルトの名無しさん
2008/10/01(水) 20:48:33int main(void){
...
{
int i, j;
for(i...)
for(j...)
}
...
{
int i;
for(i...)
}
...
return 0;
}
見たいな感じでよく書くんだけど、これは機械のほうからすると無駄が多い処理なんでしょうか?
0518デフォルトの名無しさん
2008/10/01(水) 20:57:00そのシステムのエンディアンではない値をfloatとして返すのが間違い。
代入した直後に正規化されたりしてややこしいことになる。
0519デフォルトの名無しさん
2008/10/01(水) 21:13:07代入というのは単にビット列をコピーすることではない
正しい内部表現を持たない値を実数として受け渡そうとしたら
場合によっては例外が送出されてプログラムが停まることもある
>>517
コンパイラの最適化次第
0520デフォルトの名無しさん
2008/10/01(水) 21:16:410521デフォルトの名無しさん
2008/10/01(水) 21:23:410522デフォルトの名無しさん
2008/10/01(水) 21:40:26void test( float inVal )
{
EndianF32 ret = ConvertF32( &inVal );
fwrite( &ret, sizeof(float), 1, fp );
}
とやれば、希望する結果が出るのではなかろうか。
0523デフォルトの名無しさん
2008/10/01(水) 21:54:51コンパイルしてから何かを気にしたとして、それでどうするつもりだ
0524デフォルトの名無しさん
2008/10/02(木) 00:57:10おかしな変数宣言しすぎてメモリ不足になるとか気にしてるのかな?
0525デフォルトの名無しさん
2008/10/02(木) 01:02:050526デフォルトの名無しさん
2008/10/02(木) 01:05:070527デフォルトの名無しさん
2008/10/02(木) 01:17:56a("imi wakaran");
0528デフォルトの名無しさん
2008/10/02(木) 01:32:04a("naniga kawarun daro");
0529デフォルトの名無しさん
2008/10/02(木) 01:34:13え!そういう意味の代入なの?
0530デフォルトの名無しさん
2008/10/02(木) 02:27:15俺は天才、そしてIQは400↑、すげーだろ
0531デフォルトの名無しさん
2008/10/02(木) 03:13:57俺の半分もあるじゃん
0532デフォルトの名無しさん
2008/10/02(木) 03:35:210533デフォルトの名無しさん
2008/10/02(木) 11:21:28エンディアン云々以前に、ポインタを学んだほうが。
>val.b[0] = ((Endian32 *)inData)->b[3];
inData が指してるのは float (多分4バイトしかない) なわけだが。
0534デフォルトの名無しさん
2008/10/02(木) 13:05:06union
0535デフォルトの名無しさん
2008/10/02(木) 13:43:090536515
2008/10/02(木) 13:54:06ありがとうございます。たいへんよく分かりました。
>>522さんのやり方で上手く行きましたー!
>>533
共用体を使うと、そういうことが出来ちゃうんです。
0537デフォルトの名無しさん
2008/10/02(木) 17:12:000538デフォルトの名無しさん
2008/10/02(木) 17:13:160539デフォルトの名無しさん
2008/10/02(木) 17:17:480540デフォルトの名無しさん
2008/10/02(木) 18:04:14一つの領域を複数の型として使えることが共用体の意味だからそのように使えばいい
具体的にはサイズが同じ複数の型からなる配列などがある
intとfloatが不定間隔で現れるようなフォーマットのデータを扱うときに便利
0541デフォルトの名無しさん
2008/10/02(木) 18:09:500542デフォルトの名無しさん
2008/10/02(木) 18:11:370543デフォルトの名無しさん
2008/10/02(木) 18:23:33そういうフォーマットは、たいてい先行するintの値によって
その後いくつfloatが来るのか決まってる
0544デフォルトの名無しさん
2008/10/02(木) 18:34:420545デフォルトの名無しさん
2008/10/02(木) 18:39:360546デフォルトの名無しさん
2008/10/02(木) 18:41:05規則性がなかったら無理
そうじゃなくて、floatが先行してintが混ざる場合もあるという意味
0547デフォルトの名無しさん
2008/10/02(木) 19:39:40コンパイルできません。
visual C++ 2008 express editionです。
ソース
struct list
{
int data;
struct list* next;
};
newcell = malloc( sizeof(struct list) );
0548デフォルトの名無しさん
2008/10/02(木) 19:43:20問題の起こるソースコードとエラーメッセージを書けよ
0549デフォルトの名無しさん
2008/10/02(木) 21:15:01ここのソースコンパイルしようとしたのですが
ttp://www.geocities.jp/ky_webid/algorithm/010.html
1>z:\users\phenix1gou\documents\visual studio 2008\
projects\list\list\source.cpp(77) :
error C2440: '=' : 'void *' から 'LIST *' に変換できません。
って出ます。
0550デフォルトの名無しさん
2008/10/02(木) 21:15:580551デフォルトの名無しさん
2008/10/02(木) 21:17:12newcell = (LIST *)malloc( sizeof(struct list) );
0552デフォルトの名無しさん
2008/10/02(木) 21:17:49.cppにすんな.cにしれ
0553デフォルトの名無しさん
2008/10/02(木) 21:18:13キャストしたらできましたm(’_’)m
0554kazu
2008/10/02(木) 22:38:31練習問題
・数値を複数回入力し、最後に"END"と入力された後、それぞれに対し
80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"
と表示されるプログラムを作成しなさい。
例) 25(enter押下)
90(enter押下)
73(enter押下)
END (enter押下)
25 normal
90 verygood
73 good
という問題なんですが、
正解が分かりません。
本にはヒントとして
1 文字の入力にはgets()という標準関数を使用する。
2 "END"との比較にはstrcmp()という標準関数を使用する。
3 文字を数値に変換するには、atoi()という標準関数を使用する。
4 繰り返し文(for、while文)とbreak文
と載っていました。
どなたか教えていただけないでしょうか?
よろしくお願いします。
0555デフォルトの名無しさん
2008/10/02(木) 22:40:47そういうのは宿題スレで聞け
0556デフォルトの名無しさん
2008/10/02(木) 22:44:44不親切だな
0557デフォルトの名無しさん
2008/10/02(木) 22:51:08char s[10000];
int x[10000];
int i, j;
for (i = 0; i < 10000; ++i) {
gets(s);
if (strcmp(s, "END") == 0) break;
x[i] = atoi(s);
}
for (j = 0; j < i; ++j) {
if (80 <= x[j] ) {
printf("%2d verygood\n", x[j]);
} else if (60 <= x[j]) {
printf("%2d good\n", x[j]);
} else {
printf("%2d normal\n", x[j]);
}
}
0558kazu
2008/10/02(木) 23:35:55親切にありがとうございます。
0559デフォルトの名無しさん
2008/10/02(木) 23:52:06死ねやゴミ
0560デフォルトの名無しさん
2008/10/03(金) 00:42:03stopp stack stack stack stack chr dir 2
sometime printf troff terminal fuu サーバーに接続します ターボコマンドをおねがいします
cdプレイヤーの接続名をきにゅうしてください
PL2 メーカーはマランツ 88 pl2の意味をおかきください
初期モデル
プレイヤーの搭載位置をおかきください マウント22 日本製と認識しました
ではくわしい おんしつを おかきください ひらがなでおかきください
じどうにんしきソフトをきどうしてください きどうご じどうちょうせいに はいります。
おわります どうもありがとうございました。
eth:0 それでけっこうです
エンファシスをクリヤモードにいたします。
0561デフォルトの名無しさん
2008/10/03(金) 00:46:30{ } ヽ_ r'⌒)
ヽ、 ,,-‐‐ ‐‐-、 iヽ、 J
{ 、_(o)_,: _(o)_ヽ/ ヽ/∪
! >:: } / 丶
l /( [三] )ヽノ‐''> < つわぁぁぁああああ!
i⊂}__ `二´‐'´__/__
ヽ ‐- 、二`ヽ/〉⊂ニニ⊃)
| // ̄ ̄)j~U^∪ヽ
ノ ` ‐-L!--‐''(´ )
`i''ー----‐ ''"´ ヽ、__/
! } ` }
!. , -‐- 、. ノ--─ ' はちみつだと思ったら味噌だった〜
ヽ、_{. `ヽi'⌒i
`''‐- 、.. __,!
0562デフォルトの名無しさん
2008/10/03(金) 03:51:38なぜかプログラムをコンパイルして実行すると日本語部分だけ
文字化けしてしまいます
chcpでいろいろとコードいじったりしてみても効果なしです
ググったりしたんですがそう言った情報はまったく載っていません
どなたか教えてください
ちなみにOSはVistaのホームベーシックです
よろしくお願いします
0563デフォルトの名無しさん
2008/10/03(金) 05:25:27VC++かMinGWを使え
0564デフォルトの名無しさん
2008/10/03(金) 09:37:290565デフォルトの名無しさん
2008/10/03(金) 10:44:00make && ./a
と言うのが定石だと思うんですが./aを明示せずにmake自身に
(開発中にテスト的に)実行させるような一般的な表記ってありますか?
とりあえず
make && make run
ってやってます。
0566デフォルトの名無しさん
2008/10/03(金) 10:49:320567デフォルトの名無しさん
2008/10/03(金) 13:49:45意外としられてないけど、.NET FrameworkSDKはコマンドライン開発専用のコマンドラインがあるのにね。
0568デフォルトの名無しさん
2008/10/03(金) 14:16:360569デフォルトの名無しさん
2008/10/03(金) 14:39:110570デフォルトの名無しさん
2008/10/03(金) 14:40:38double hoge[256];
func(hoge);
}
int hoge(double data[])
}
これはアドレス渡しですか?それとも配列のデータをコピーして渡していますか?
0571デフォルトの名無しさん
2008/10/03(金) 14:43:31}
int main() {
double fuga[256];
hoge(fuga);
}
だと思うんだが基本はアドレス渡し
0572デフォルトの名無しさん
2008/10/03(金) 15:27:21アドレス渡しということはメモリの無駄は発生しないということですか?
0573デフォルトの名無しさん
2008/10/03(金) 15:29:27まあ、配列は内部的に見るとポインタで持ってるしなあ。
0574デフォルトの名無しさん
2008/10/03(金) 15:31:57逆に言えば関数内で不用意にいじると配列が破壊される。
0575デフォルトの名無しさん
2008/10/03(金) 15:49:10どうも!
0576デフォルトの名無しさん
2008/10/03(金) 16:15:18配列名と関数名が一緒ってのが気になったのよ
納得できたようでなにより
0577デフォルトの名無しさん
2008/10/03(金) 16:18:130578デフォルトの名無しさん
2008/10/03(金) 16:20:36すいません。適当に書いたんで一緒のなめえになっちゃいました
0579デフォルトの名無しさん
2008/10/03(金) 16:22:20らめえww
0580デフォルトの名無しさん
2008/10/03(金) 16:37:000581デフォルトの名無しさん
2008/10/03(金) 16:43:39書き換えないことが確定的ならconstをつけておけ
0582デフォルトの名無しさん
2008/10/03(金) 16:46:02}
int main() {
double fuga[256];
hoge(fuga);
}
こうですか?
0583デフォルトの名無しさん
2008/10/03(金) 17:09:17そう
>hoge(fuga);
このときhogeに渡っているのは &fuga[0]
つまり配列の先頭の要素のアドレス
constを付けずにhoge内でdataの中身を変更するとfugaの中身も変更される
0584デフォルトの名無しさん
2008/10/03(金) 17:31:43システムを想定せよ、っていう宿題が
でたんですが,何を書けばいいでしょうか?
0585デフォルトの名無しさん
2008/10/03(金) 17:34:53>>1を100回読んでからお帰りください
0586デフォルトの名無しさん
2008/10/03(金) 17:35:130587デフォルトの名無しさん
2008/10/03(金) 19:18:33このエラーはどうすれば回避できますか・・・?
0588デフォルトの名無しさん
2008/10/03(金) 19:19:420589デフォルトの名無しさん
2008/10/03(金) 19:21:46ライブラリにvc80.pdbが含まれてなかったなら諦めるしかない
0590デフォルトの名無しさん
2008/10/03(金) 20:06:02ありがとうございます
0591デフォルトの名無しさん
2008/10/04(土) 04:46:05整数を入力してその整数の桁数を使う必要があるのですが
どのようにして桁数を取り出せば良いのでしょうか?
intの限界の桁までforで調べるという方法しか思い浮かばないのですが
もっと効率の良いやり方はありますか?
0592デフォルトの名無しさん
2008/10/04(土) 04:48:280593デフォルトの名無しさん
2008/10/04(土) 04:52:240594デフォルトの名無しさん
2008/10/04(土) 04:56:17あーそういえばありましたねそんなの
文系なもので忘れてましたwありがとうございます
>>593
どうもです
0595デフォルトの名無しさん
2008/10/04(土) 05:56:140596デフォルトの名無しさん
2008/10/04(土) 06:18:040597デフォルトの名無しさん
2008/10/04(土) 10:41:120598デフォルトの名無しさん
2008/10/04(土) 12:54:31これをint型の255に変換したいんですが
どうしたらいいでしょうか?
atoiだと "123" という文字列は
変換できますが、aとかbとか入ってくると
そこでatoiが終わってしまうし・・・
0599デフォルトの名無しさん
2008/10/04(土) 12:55:35strtol使おう
0600デフォルトの名無しさん
2008/10/04(土) 12:57:02typedef struct {
float x,y;
} FPOINT, * LPFPOINT;
0601デフォルトの名無しさん
2008/10/04(土) 12:58:21その構造体で使えるポインターも同時に宣言
0602デフォルトの名無しさん
2008/10/04(土) 13:00:37typedef struct {
float x,y;
} FPOINT;
typedef FPOINT *LPFPOINT;
0603600
2008/10/04(土) 13:03:07ありがとうございます!
0604デフォルトの名無しさん
2008/10/04(土) 13:03:11- GNU General Public License 2.0
- GNU Lesser General Public License 2.1
のトリプルライセンスの場合、
ソースコードを付ければ、自由に改造や配布して良いんですか
0605デフォルトの名無しさん
2008/10/04(土) 13:09:55unsigned int log10(unsigned int a)
{
unsigned int n = 0;
a /= 10;
while(a)
{
a /= 10;
n++;
}
return n;
}
0606600
2008/10/04(土) 13:10:54float x, y;
} FPOINT*, LPFPOINT;
これでも同じですか?
0607デフォルトの名無しさん
2008/10/04(土) 13:11:38変更した場合は、名前を変える必要がある。
0608デフォルトの名無しさん
2008/10/04(土) 13:12:08だめ。
0609デフォルトの名無しさん
2008/10/04(土) 13:12:36コンパイルできない
0610デフォルトの名無しさん
2008/10/04(土) 13:14:24int FPOINT, *LPFPOINT;
というのと同じ
これを
int FPOINT*, LPFPOINT;
にはできない
この場合の*はポインターを宣言する際に使うのでかならずポインターの前に置かないと駄目。
0611デフォルトの名無しさん
2008/10/04(土) 13:46:26改造した場合、以前の名前と別にしてソースコードを付けたら良いんですか?
あとライセンスは、一つも減らさず、少なくともトリプルライセンスになりますか
0612デフォルトの名無しさん
2008/10/04(土) 13:48:150613デフォルトの名無しさん
2008/10/04(土) 13:51:450614デフォルトの名無しさん
2008/10/04(土) 13:52:440615デフォルトの名無しさん
2008/10/04(土) 15:23:04↓これだとうまくいくんだが
char aaa[]="abcde12345";
char bbb[100];
strcpy(bbb,aaa);
最後のstrcpyを
strcpy(bbb,aaa[2]);
ってな感じにすると強制終了してしまう
aaaの2だから 'c' がbbbにコピーされると
考えてるんだけど・・・
こういう場合、ポインタ使わずには出来ない?
0616デフォルトの名無しさん
2008/10/04(土) 15:25:580617デフォルトの名無しさん
2008/10/04(土) 15:26:07&aaa[2] にすると "cde12345" がコピーされる
'c' だけをコピーしたいなら b[0]=aaa[2]; (必要ならこれも追加 b[1]='\0';)
0618デフォルトの名無しさん
2008/10/04(土) 15:26:240619>>618
2008/10/04(土) 15:27:27はえーな
0620618
2008/10/04(土) 15:28:14というかこれワーニングとかでるだろ?
0621デフォルトの名無しさん
2008/10/04(土) 15:30:110622デフォルトの名無しさん
2008/10/04(土) 15:37:54strcoyの実装例
よく分からなかったらポインタを勉強すべき
char *strcpy(char *s1, const char *s2)
{
char *p = s1;
while (*s1++ = *s2++)
;
return (p);
}
0623デフォルトの名無しさん
2008/10/04(土) 15:51:280624デフォルトの名無しさん
2008/10/04(土) 16:19:18でもおk?
0625デフォルトの名無しさん
2008/10/04(土) 16:23:230626デフォルトの名無しさん
2008/10/04(土) 17:50:290627デフォルトの名無しさん
2008/10/04(土) 20:12:05int A[10]={5,0,0,0,3,0,0,0,2,9};
int sum=0;
for(i=0;i<10;i++){
if(A[i]!=0){
sum+= A[i]*A[i];
}
}
このプログラムはIF文によって速くなりますか?
0628デフォルトの名無しさん
2008/10/04(土) 20:13:06測定誤差の範囲内
0629デフォルトの名無しさん
2008/10/04(土) 20:14:44何がしたいかさっぱり・・・
エスパーな読みだと配列の0は処理をしたくないってことなら
for(i=1;i<10;i++){
sum+= A[i]*A[i];
}
0630デフォルトの名無しさん
2008/10/04(土) 20:16:400631デフォルトの名無しさん
2008/10/04(土) 20:18:50配列の長さ増やして試した方が良いけど
普通は比較より代入のが遅いうえに、掛け算もすることになるので
ifつけたほうが早いんじゃないかとはおもう
0がその割合なら
0633デフォルトの名無しさん
2008/10/04(土) 20:27:050634デフォルトの名無しさん
2008/10/04(土) 20:29:39・プロファイラやタイマを使って計測
・使ってるCPUとコンパイラごとにアセンブラを吐かせて確認
これに尽きる。
妄想であれこれ言ってもどうにもならない。
速度で困っていない部分をちまちまいじっても得るものはない。
0635デフォルトの名無しさん
2008/10/04(土) 21:39:09void sum(int a, int b){
int t;
t = a+b;
printf("%d",t);
}
このようなものがある場合、void sum(int a, int b)の中のa,bは仮引数というのはわかるのですが
t = a*b; のときの a,bも引き続き 仮引数と読んでいいものなのでしょうか??
よろしくお願いします。
0636デフォルトの名無しさん
2008/10/04(土) 21:51:18http://www.cc.kyoto-su.ac.jp/~yamada/ap/parameter_argument.html
上のサイトの定義からすると、t = a+b;のaとbは仮引数だね。
でも、仮引数と実引数なんて言葉はあまり使わないよ。
引数だけでおkとおもう。
0637デフォルトの名無しさん
2008/10/04(土) 23:10:330639デフォルトの名無しさん
2008/10/05(日) 00:12:51初心者のくせに回答するなよ
0640デフォルトの名無しさん
2008/10/05(日) 01:21:16;
こういう文字入力の仕方ってありなのか?それとも
for(i = 0; (b = getchar()) != EOF && b != '\n' && i < MAX -1; i++)
a[i] = b;
こんなしなきゃ駄目なのだろうか?
0641デフォルトの名無しさん
2008/10/05(日) 01:24:58はしょると
前者はunsigned な変数に -1を突っ込む危険がある
0642デフォルトの名無しさん
2008/10/05(日) 01:29:37すみませんはしょらないで教えてくれませんか><
0643デフォルトの名無しさん
2008/10/05(日) 01:35:19後者はその心配が要らない
0644デフォルトの名無しさん
2008/10/05(日) 01:43:19なるほど、確かに
ありがとうございました。
0645デフォルトの名無しさん
2008/10/05(日) 01:50:40if文 (式){
・
・
break;
・
・
]
}
上のようにあった場合、breakはfor文を抜けるのしょうか?
それともif文を抜けるのでしょうか?
0646デフォルトの名無しさん
2008/10/05(日) 01:51:38ifには関係ない
0647デフォルトの名無しさん
2008/10/05(日) 01:54:20どうもありがとうございます。
助かりました
0648デフォルトの名無しさん
2008/10/05(日) 01:57:48これは試したらすぐ分かるじゃん
0649デフォルトの名無しさん
2008/10/05(日) 02:14:210650デフォルトの名無しさん
2008/10/05(日) 02:18:100651デフォルトの名無しさん
2008/10/05(日) 02:21:540652デフォルトの名無しさん
2008/10/05(日) 02:22:22試してわかることかどうか本人がわからないから聞くんだろ
0653デフォルトの名無しさん
2008/10/05(日) 02:34:000654デフォルトの名無しさん
2008/10/05(日) 02:43:240655デフォルトの名無しさん
2008/10/05(日) 02:46:19まず試してみるというのは必ずしも正しいやりかたじゃない
0656デフォルトの名無しさん
2008/10/05(日) 02:52:340657デフォルトの名無しさん
2008/10/05(日) 02:53:500658デフォルトの名無しさん
2008/10/05(日) 03:01:21int main()
{
int i = 5;
goto pppp;
for (i = 0; i < 100; ++i) {
pppp:
printf("f\n");
}
return 0;
}
f
がいっこしかひょうじされませんなんででですか
0659デフォルトの名無しさん
2008/10/05(日) 03:04:380660デフォルトの名無しさん
2008/10/05(日) 03:06:55VC8で動かしたら、いっぱいfが出たよ。
最適化のバグかなんかかね?
0661デフォルトの名無しさん
2008/10/05(日) 03:07:15でも一生使わないな
0662デフォルトの名無しさん
2008/10/05(日) 03:07:280663デフォルトの名無しさん
2008/10/05(日) 03:09:520664デフォルトの名無しさん
2008/10/05(日) 03:58:020665デフォルトの名無しさん
2008/10/05(日) 04:54:28gccは正常なコードとして処理してくれるのもしかして?
0666デフォルトの名無しさん
2008/10/05(日) 05:25:18良かったらどういう理由で未定義なのか教えてくれない?
0667デフォルトの名無しさん
2008/10/05(日) 05:40:300668デフォルトの名無しさん
2008/10/05(日) 05:51:320669デフォルトの名無しさん
2008/10/05(日) 09:37:25char *buf; と定義されていて、これをリターンする際に、
アドレスではなく文字列として渡したいとします。
bufは消滅しても渡せるようにです。どうすればいいですか
0670デフォルトの名無しさん
2008/10/05(日) 09:39:22文字列も配列なんで渡すのは先頭アドレス
0671デフォルトの名無しさん
2008/10/05(日) 09:45:38{
return "リテラルならOK";
}
char *retstr()
{
return strdup("mallocして返す。呼び出し側でfreeする必要あり。");
}
char *retstr(char *buf, size_t bufsize)
{
return strcpy(buf, "呼び出し側でバッファを確保する。Cではこれが無難。");
}
0672デフォルトの名無しさん
2008/10/05(日) 09:58:420673デフォルトの名無しさん
2008/10/05(日) 10:00:50それだったら>>671の最後でいいんじゃないの?
0674デフォルトの名無しさん
2008/10/05(日) 10:02:30str255 retstr()
{
str255 ret; strcpy(ret.value, "こんな無理やりなことやってないで郷に入っては郷に従え。");
return ret;
}
main(){
str255 s = retstr();
printf("%s\n", s.value);
}
0675デフォルトの名無しさん
2008/10/05(日) 10:04:060676デフォルトの名無しさん
2008/10/05(日) 10:05:48構造体で渡せばいけますか トンクス
0677デフォルトの名無しさん
2008/10/05(日) 10:30:44もし、aのアドレスの10バイト先には別のデータが入っていたら、10バイト以上のデータは入れられないですか?
0678デフォルトの名無しさん
2008/10/05(日) 10:33:39>aのアドレスの10バイト先には別のデータが入っていたら、
これの意味がよくわからん
0679デフォルトの名無しさん
2008/10/05(日) 10:36:15が入っていてそれが解放されていない場合です。
0680デフォルトの名無しさん
2008/10/05(日) 10:37:38そういう連続性がある場合は*aで*bのエリアもいじれちゃいます。
0681デフォルトの名無しさん
2008/10/05(日) 13:23:280682デフォルトの名無しさん
2008/10/05(日) 13:24:200683デフォルトの名無しさん
2008/10/05(日) 13:24:35組み方にもよるが、関数呼び出しはコストが増える(コンパイルされたマシン語レベルでの話)
0684デフォルトの名無しさん
2008/10/05(日) 13:32:36状況による。
0685デフォルトの名無しさん
2008/10/05(日) 13:48:24関数呼び出しのオーバーヘッドも大きいし何よりスタックを浪費する。
ただ再帰の方がコンパクトで読みやすく書け、それほど上記の欠点が大きくないなら再帰の方がいい。
0686デフォルトの名無しさん
2008/10/05(日) 13:59:480687デフォルトの名無しさん
2008/10/05(日) 15:12:390688デフォルトの名無しさん
2008/10/05(日) 15:25:34thx
しかしJISのC99には3.8.6.1の3が無い・・・。
ISOの方はExample1だった。(段落番号3)
C89持ってないんだけど、もしかして規格変わったんかな。
C89、どこかで見れないものか。
0689デフォルトの名無しさん
2008/10/05(日) 16:02:35どうやってやるんでしょう・・・?
0690デフォルトの名無しさん
2008/10/05(日) 16:03:53一旦ワイドに変換したら?
0691デフォルトの名無しさん
2008/10/05(日) 16:14:34JISなら§6.8.6.1じゃね?
0692デフォルトの名無しさん
2008/10/05(日) 16:15:34同一長のバッファを取って前から走査して後ろから詰めていく。
0693デフォルトの名無しさん
2008/10/05(日) 16:21:22Unicodeでも組み合わせ文字とかがあるから、必ずしもそのまま逆順に出来るわけじゃない。
>>692
文字種を変えるために制御コードが必要な文字コードなどは、長さが変わる可能性がある。
0694デフォルトの名無しさん
2008/10/05(日) 16:30:44すまん。書き間違い
0695デフォルトの名無しさん
2008/10/05(日) 18:57:450696デフォルトの名無しさん
2008/10/05(日) 18:59:44統一はしようとしてるよ。
でも古い言語がいまだに使われてるように、なかなかシフトできないんだよ。
統一のは4バイトの文字コードだっけ?
0697デフォルトの名無しさん
2008/10/05(日) 19:10:40日本ぐらいなもんだよテキストとバイト列の関係を最終ユーザがこんなにも意識し理解しているのは
0698デフォルトの名無しさん
2008/10/05(日) 19:15:31まーなー
日本人は日本語を使おうとするが中国韓国でも英語でOKって人多いから
半角コードあればできるんだよなw
0699デフォルトの名無しさん
2008/10/05(日) 19:18:440700デフォルトの名無しさん
2008/10/05(日) 19:51:01日本は80年代にOA化が進んだから
0701デフォルトの名無しさん
2008/10/05(日) 19:55:26errno_t err;
という宣言(?)があったのですが、これは何を表しているのでしょうか?
0702デフォルトの名無しさん
2008/10/05(日) 19:57:05PC98には今のS-JISの元の漢字コードはすでにあったしね.
0703デフォルトの名無しさん
2008/10/05(日) 20:30:59errno_t型のerrという変数を宣言している
int x; のようなもの
0704デフォルトの名無しさん
2008/10/05(日) 21:24:07typedef ○○ □□ errno_t;
こんなのか
struct errno_t {
...
}errno_t;
こんなの
0705デフォルトの名無しさん
2008/10/05(日) 21:26:28こうかも
0706デフォルトの名無しさん
2008/10/05(日) 21:27:33後者は!
0707デフォルトの名無しさん
2008/10/05(日) 21:28:500708デフォルトの名無しさん
2008/10/05(日) 22:17:46>>658のは問題ない
0709デフォルトの名無しさん
2008/10/05(日) 23:44:260710デフォルトの名無しさん
2008/10/05(日) 23:52:170711デフォルトの名無しさん
2008/10/06(月) 00:11:23ググってみたらそれらしきものが見つかりました。
ありがとうございます。
0712デフォルトの名無しさん
2008/10/06(月) 00:51:44という事はVC8SP1のバグか?
0713デフォルトの名無しさん
2008/10/06(月) 03:58:24char str[] = "test";と宣言しまして、それから
printf("%s",str);
と入力しましたところ、そのまま"test"と出てしまいました。
配列のなかにそれぞれアルファベットが入っていることは理解できたのですが、
%sと打っただけでそのまま文字列が出力されるのかが理解できません。
str == &str[0] とのことですが、%sとは配列の中に入っている文字を順番に吐き出してくれる
モノということで合っているのでしょうか?自信がないもので・・・
0714デフォルトの名無しさん
2008/10/06(月) 04:37:530715デフォルトの名無しさん
2008/10/06(月) 04:55:50>モノということで合っているのでしょうか?
読み手として随分と端折った感じを受けるが、回答としてはyes.
0716デフォルトの名無しさん
2008/10/06(月) 05:05:230717デフォルトの名無しさん
2008/10/06(月) 06:05:30printfなんかに指定する%付きの記号を書式といいます。
http://cai.int-univ.com/sugsi/Lecture/c_language/Book/detail_printf.html
0718デフォルトの名無しさん
2008/10/06(月) 12:15:54int i;
char str[] = "test";
for(i = 0; i < 4; i++) printf("<%c>", str[i]);
これを試してみろ
0719デフォルトの名無しさん
2008/10/06(月) 13:18:52Cで言う「文字列」とは、連続したメモリ空間(いわゆる配列)の先頭から
文字を表すデータが順に詰め込まれて、最後にヌル文字('\0')で終わるものを言う。
そしてほとんどの文字列操作は、その先頭から始めて'\0'を見つけたらやめるという動作をする。
だからCで「文字列を指している」と言ったら「文字列の入っているメモリの先頭を指している」ことを意味する。
そして配列には、その名前が配列の先頭を指すポインタに変換されるという特別な規約があるので、
文字列の入った配列そのものを文字列、あるいは文字列を指していると呼ぶことがある。
printf書式の%s指定子は、対応する引数を文字列を指すポインタとみなして
そこにある文字列を(当然、'\0'まで)出力するという働きをもつ。
だからprintf("%s",str)と書いたら"test"と表示される。
0720デフォルトの名無しさん
2008/10/06(月) 19:55:59クラスの中でSetIntというのが定義されてないのですが
なぜアロー演算子で使えてるのでしょうか?
コンパイルもできます。(書籍のサンプルプログラムより)
0721デフォルトの名無しさん
2008/10/06(月) 20:00:47C++だけど
m_effectのクラスのメンバ関数だからでしょ
0723デフォルトの名無しさん
2008/10/06(月) 21:11:330724デフォルトの名無しさん
2008/10/06(月) 21:17:51{
D3DXMATRIXA16 CombinedTransformationMatrix;
};
構造体にpublicを使っているのですがこれはどういう意味ですか?
0725デフォルトの名無しさん
2008/10/06(月) 21:18:200726デフォルトの名無しさん
2008/10/06(月) 21:19:09簡単なことだがスレ違いなので答えない
0727デフォルトの名無しさん
2008/10/06(月) 21:58:590728デフォルトの名無しさん
2008/10/06(月) 22:03:430729デフォルトの名無しさん
2008/10/06(月) 22:05:04それは行末に\じゃないと効果がないから改行を消してるのかと思ってましたが
0730デフォルトの名無しさん
2008/10/06(月) 22:05:09改行の前に書いたら改行をなかったことにするだけ
0731デフォルトの名無しさん
2008/10/06(月) 22:09:48×文字列中
○文字列リテラル
0732デフォルトの名無しさん
2008/10/06(月) 22:16:06複数行マクロじゃなくて、その後についた改行コードを消した結果マクロが複数行になるのか
これはいいことを聞いた
勘違いしてたよ、ありがとう
0733デフォルトの名無しさん
2008/10/06(月) 22:18:04プリプロセッサで働くのでリテラル中のエスケープシーケンスとは混同しない
0734デフォルトの名無しさん
2008/10/06(月) 22:20:51確かに使えるけど普通に文字列リテラルの自動連結使ったほうがいいよ
字下げできるし
0735デフォルトの名無しさん
2008/10/07(火) 00:21:500737デフォルトの名無しさん
2008/10/07(火) 11:09:25#include <stdio.h>
int main()
{
char c;
int i;
double d,e;
printf("変数cのアドレスは%pです\n", &c);
printf("変数iのアドレスは%pです\n", &i);
printf("変数dのアドレスは%pです\n", &d);
printf("変数eのアドレスは%pです\n", &e);
return 0;
}
ってやると書籍だと
c ******D3
i D4
e D8
d E0
と1バイト4バイト8バイトって増えた値になるはずなんだけどうちのPCだと
c ******63
i 54
e 44
d 34
と9,10,10と減った値になってるのは何故でしょう・・・。
0738デフォルトの名無しさん
2008/10/07(火) 11:17:380739デフォルトの名無しさん
2008/10/07(火) 11:32:02ちょっとその本は当てにしない方がいいのでは…
0740737
2008/10/07(火) 11:53:51答え見ても納得できないと思ったら答えのプログラムが間違ってたり練習問題なのに習ってもいない文字がでてきたりで困る・・・
c++のお勧めの入門書とかある人は教えてくれたら嬉しかったり・・・
0741デフォルトの名無しさん
2008/10/07(火) 11:56:09本よりネットのサンプルでもいいじゃないかな?
本は基本的なことは学べるけど内容が古かったりと・・・
0743デフォルトの名無しさん
2008/10/07(火) 17:16:220744デフォルトの名無しさん
2008/10/07(火) 17:30:400745デフォルトの名無しさん
2008/10/07(火) 17:31:390746デフォルトの名無しさん
2008/10/07(火) 17:45:57そんな積み方もするんだ?
0747デフォルトの名無しさん
2008/10/07(火) 17:47:200748デフォルトの名無しさん
2008/10/07(火) 17:54:34逆順に積むコンパイラがあってもおかしくはない
0749デフォルトの名無しさん
2008/10/07(火) 17:56:190750デフォルトの名無しさん
2008/10/07(火) 18:07:58いや、気になってんのは配置間隔のほう・・・って64ビットマシンだからか?
0751デフォルトの名無しさん
2008/10/07(火) 18:10:11コンパイラの設定だと思うけど
0752デフォルトの名無しさん
2008/10/07(火) 18:10:590753デフォルトの名無しさん
2008/10/07(火) 18:13:24Debugビルドだと>>737の後者、Releaseビルドだと前者になったわ
0754デフォルトの名無しさん
2008/10/07(火) 18:14:230755デフォルトの名無しさん
2008/10/07(火) 18:16:330756デフォルトの名無しさん
2008/10/07(火) 18:35:510757756
2008/10/07(火) 18:46:14所有権が解放されていない現象がよく起こるんですけど・・・
0758デフォルトの名無しさん
2008/10/07(火) 18:47:11意味がわからん。
もっと詳しく
0759デフォルトの名無しさん
2008/10/07(火) 18:53:39Cにはアクセス制限なんて概念はありません。
環境依存スレか、環境ごとのプログラミングスレへどうぞ。
0760756
2008/10/07(火) 18:54:42ファイル操作をして、ちゃんとクローズしたのに
そのファイルを次に開くとき共有エラーになるって事です。(ファイルを読み込めない、書き込めない)
0761756
2008/10/07(火) 18:56:11実際に、読み込めないんです。 windows XPです。
0762デフォルトの名無しさん
2008/10/07(火) 18:56:13ソース上げてみて
0763デフォルトの名無しさん
2008/10/07(火) 18:58:05こんな簡単な奴でも同じ症状になる?
#include<stdio.h>
int main(void){
FILE *fp;
if((fp=fopen("hoge.txt", "w"))==NULL) return 1;
fprintf(fp, "hello\n");
fclose(fp);
return 0;
}
0764デフォルトの名無しさん
2008/10/07(火) 19:01:10今のソースは長くてちょっとうpはむりです。
C++では、その様にして回避してました。 fp.close(); while(fp.fail())Sleep(100);
C言語では、fp.fail() の代わりが見つかりません。
fclose(fp); while(ferror( fp ))Sleep(100); では、エラー無しで通り抜けてしまいました。
0765デフォルトの名無しさん
2008/10/07(火) 19:02:280766デフォルトの名無しさん
2008/10/07(火) 19:02:53windowsのようなOSの場合IOはプログラムの動作より遅いので
次のopenの際にはまだ前のcloseが終わってないというのがあるのかなあ?
そういう場合は次のopenに関してはリトライを数回やるロジックにするとか?
0767766
2008/10/07(火) 19:04:49ごめんちょっと変だな。
マルチタスクOSの場合プログラムの実行より低速なI/Oを処理した場合は
プログラム的には関数から正常リターンをもらっても
I/Oのほうでは完全に終わってないケースもありえる。
0768デフォルトの名無しさん
2008/10/07(火) 19:05:210769デフォルトの名無しさん
2008/10/07(火) 19:05:36XPでうまくいってしまうんだが
#include<stdio.h>
int main(void){
FILE *fp;
char buf[256];
if((fp=fopen("hoge.txt", "w"))==NULL) return 1;
fprintf(fp, "hello\n");
fclose(fp);
if((fp=fopen("hoge.txt", "r"))==NULL) return 2; // ここで失敗するってこと?
fgets(buf, sizeof(buf), fp);
printf("%s\n", buf);
fclose(fp);
return 0;
}
0770デフォルトの名無しさん
2008/10/07(火) 19:07:22fp.close()でfp.fail()するなら、fclose()の戻り値を見ろよ。
0771768
2008/10/07(火) 19:07:39windowsってセマフォじゃないのかもしれないが、そういう開放が
若干遅れると実ファイル側は保存終わってても、握ってるようにみえないか?
0772デフォルトの名無しさん
2008/10/07(火) 19:08:190773デフォルトの名無しさん
2008/10/07(火) 19:12:40IRQとかでも割り込み禁止にして処理すると思うんだが
0774デフォルトの名無しさん
2008/10/07(火) 19:15:200775756
2008/10/07(火) 19:18:34>>770 fclose()kの戻り値は正常だったのですが、次のアクセスが失敗してしまいました。
0776デフォルトの名無しさん
2008/10/07(火) 19:21:56バッファオーバーフローとか未初期化ポインタの操作で
コード領域をいじってしまっておかしくなってるんじゃね?
0777デフォルトの名無しさん
2008/10/07(火) 19:32:26ほかのファイルと一緒にコンパイルして、別ファイルでファイル入出力すると駄目になります。
マルチスレッドが関係あるかも知れないです。
0778デフォルトの名無しさん
2008/10/07(火) 19:34:11オープンエラーになる関数をリピートしてみたら?
0779デフォルトの名無しさん
2008/10/07(火) 19:43:33一度も開けませんでした。 fcloseの行は実行されているんですが
0780デフォルトの名無しさん
2008/10/07(火) 19:47:29C言語のソースがあるんですがファイル入出力の関わる部分をすべて書き換えるのは大変なので
fgetsなどを自作してそれで置き換えようと思っています。
0781デフォルトの名無しさん
2008/10/07(火) 19:50:07断念します。
0782デフォルトの名無しさん
2008/10/07(火) 19:56:400783デフォルトの名無しさん
2008/10/07(火) 20:00:16今のマシンとOSでそんなロックかかることなんてない
0784デフォルトの名無しさん
2008/10/07(火) 20:02:26ところで教えてもらいたいことがあるんですが、入出力ライブラリで良いやつ無いですか?
C/C++は、駄目と思います。同時に開けるファイル数は200-300位ですし
バッファの管理も上手くないと思います。 少量の書き出しが頻発する場合、
自前バッファ+WinAPIにした方が速いので。安定しているいいやつありますか
0785デフォルトの名無しさん
2008/10/07(火) 20:02:270786デフォルトの名無しさん
2008/10/07(火) 20:05:110787デフォルトの名無しさん
2008/10/07(火) 20:06:190788デフォルトの名無しさん
2008/10/07(火) 20:12:52WinAPIだと3万ファイルくらい同時に開けたのですが。
0789デフォルトの名無しさん
2008/10/07(火) 20:14:520790デフォルトの名無しさん
2008/10/07(火) 20:21:23今時いったいどんな処理系使っているんだ?
さすがにUnicodeは_wfopenとか独自拡張でやるしかないけど。
0791デフォルトの名無しさん
2008/10/07(火) 20:25:46釣りじゃないんなら明らかにスレ違いだからとっとと消えろ
0792デフォルトの名無しさん
2008/10/07(火) 20:25:55CreateFileAを利用していたらその位ですよ。 内部ではCreateFileW使っていますか
0793デフォルトの名無しさん
2008/10/07(火) 20:30:350794デフォルトの名無しさん
2008/10/07(火) 20:32:08以上
0795デフォルトの名無しさん
2008/10/07(火) 20:39:410796デフォルトの名無しさん
2008/10/07(火) 20:41:440797デフォルトの名無しさん
2008/10/07(火) 20:47:040798デフォルトの名無しさん
2008/10/07(火) 20:47:190799デフォルトの名無しさん
2008/10/07(火) 21:00:150800デフォルトの名無しさん
2008/10/07(火) 21:22:330801デフォルトの名無しさん
2008/10/07(火) 21:58:33VCとかBCCとか独自にワイド文字列引数にとる_wfopenってのがあって、
そっちだと内部CreateFileWになっている。
>>798
C++スレいけ
0802デフォルトの名無しさん
2008/10/08(水) 00:09:16typedef int (*hoge002)(int);
typedef int (*hoge003)(int *,int);
typedef int (*hoge004)(int,int,int);
・
・
・
超初心者ぽい質問の予感ですが、
上記のようなコードってどういう目的があるんでしょうか?
0803デフォルトの名無しさん
2008/10/08(水) 00:10:54とりあえず関数ポインタを知らないの?
0804デフォルトの名無しさん
2008/10/08(水) 03:03:06「intを返す函数へのポインタ型」としてhoge???というtypedef名を宣言している
それぞれの違いは引数の型と数
0805デフォルトの名無しさん
2008/10/08(水) 06:18:24文法的な意味じゃなく何の為にって事なら
一連の関数のセットの実装をそっくりすげ替えられるようにする為。
例えばmalloc/freeの性能が悪いからそっくり自分の書いた高性能メモリマネージャに変えるとか
printf/getsなんかの入出力をコンソールではなくダイアログボックスで行える用にするとか。
まあこの例は出鱈目だけど目的としてはそんな感じ。
後は .so/.dll で動的に関数のつまったファイルを後からロードして
関数ポインタにそのアドレスをセットするとか。
0806デフォルトの名無しさん
2008/10/08(水) 06:47:05判りやすくするため、とかかもしれないけど。
0807デフォルトの名無しさん
2008/10/08(水) 16:26:22typedef で定義したものを消す、もしくは定義を上書きすることは出来ますか?
0808デフォルトの名無しさん
2008/10/08(水) 16:35:000809デフォルトの名無しさん
2008/10/08(水) 17:17:26できない。
0810デフォルトの名無しさん
2008/10/08(水) 17:26:19できないんですね
ありがとうございました
0811デフォルトの名無しさん
2008/10/08(水) 21:29:32で無理やりしのげないこともない
0812デフォルトの名無しさん
2008/10/09(木) 12:19:46Winの遅延書き込みは共有の問題とは関係ないと思う。
ファイルをクローズしたときに、ワクチンソフトやバックアップソフトが何かやってるんじゃないかな?
共有エラーが発生した場合は、少し待ってからリトライするという方法が一般的と思う。
0813デフォルトの名無しさん
2008/10/09(木) 13:52:44>>791
0814デフォルトの名無しさん
2008/10/10(金) 15:27:51メッセージを出すにはどうしたらよいでしょうか?
0815デフォルトの名無しさん
2008/10/10(金) 15:33:59どういうメッセージが出せるかはどういう開発環境なのかで代わる。
領域確保できたかできないかは関数のリターンで確認汁
0816814
2008/10/10(金) 16:43:31int *a;
a=(int *)calloc(sizeof(int)*10000);
if(a==NULL){
printf("~\n");
exit(2);
}
こんな感じだとおもうのですが、こんな感じの書式で二次元にできるのかと
0817デフォルトの名無しさん
2008/10/10(金) 16:50:26int (*a)[100];
a = (int(*)[100]) calloc(100*100, sizeof(int));
if (a == NULL) { printf("~\n"); exit(2); }
こんな感じ? それとも
int i, **a;
a = (int**) calloc(100, sizeof(int*));
if (a == NULL) { printf("~\n"); exit(2); }
for (i = 0; i < 100; i++) {
a[i] = (int*) calloc(100, sizeof(int));
if (a[i] == NULL) { printf("~\n"); exit(2); }
}
こういうやつか?
0818デフォルトの名無しさん
2008/10/10(金) 16:50:500819デフォルトの名無しさん
2008/10/10(金) 18:34:50foo **bar;
int i;
if(NULL == (bar = malloc(sizeof(foo*) * d1 + sizeof(foo) * d1 * d2))){
puts(err);
exit(1);
}
for(i = 0; i < d1; i++)
*(bar + i) = (foo *)(bar + d1) + i;
free(bar);
0820デフォルトの名無しさん
2008/10/10(金) 18:48:180821デフォルトの名無しさん
2008/10/10(金) 21:53:36みなさんアドバイスありがとうございます。試してみます。
0822デフォルトの名無しさん
2008/10/11(土) 12:55:34作成しているのですがどのようにすればよいか教えてもらえたら嬉しいです。
#include<stdio.h>
int main(void)
{
char str[256];
char *p;
printf("文字列を入力してください\n");
gets(str);
p=str;
while(*p!='\0'){
if(!(*p>='a' && *p<='z')&&!(*p>='A' && *p<='z'));
*p=' ';
++p;
}
printf("%s\n",str);
return 0;
}
このプログラムのままだと文字列が全て空白になってしまいます。
なにせまだ始めたばっかなもので…
よろしくお願いします。
0823デフォルトの名無しさん
2008/10/11(土) 13:21:35いくつかのミスはやってりゃわかると思うので、一番重要なところを。
if文の後ろのセミコロンは要らない
0824デフォルトの名無しさん
2008/10/11(土) 13:21:560825デフォルトの名無しさん
2008/10/11(土) 13:36:23>>824
ありがとうございました
単純なミスでしたね
一応しっかり確認したつもりだったんですが
お恥ずかしい…
0826デフォルトの名無しさん
2008/10/11(土) 13:50:110827デフォルトの名無しさん
2008/10/11(土) 17:37:140828デフォルトの名無しさん
2008/10/12(日) 04:00:02出力=function(入力);
みたいな形が基本
(入力を変更して返したり特定の変数に入れて返す場合もある)
strを入力しても何も入ってないと思うよ
0829デフォルトの名無しさん
2008/10/12(日) 04:26:28char *gets(char *s);
だから引数に取ろうが戻り値に取ろうが
何かは入ってるだろう
0830デフォルトの名無しさん
2008/10/12(日) 05:49:480831デフォルトの名無しさん
2008/10/12(日) 06:11:030832デフォルトの名無しさん
2008/10/12(日) 11:04:17dwStride += sizeof(DWORD);
}
この場合の&ってどういう意味ですか?
0833デフォルトの名無しさん
2008/10/12(日) 11:08:540834デフォルトの名無しさん
2008/10/12(日) 11:44:22その名のとおり、ANDだよ
(dwFVF & 0xf0) は
dwFVFの上位4ビットに1があれば真(1)
0835デフォルトの名無しさん
2008/10/12(日) 12:37:550836デフォルトの名無しさん
2008/10/12(日) 14:59:27俺も真偽だと思うが…どう違うのか?
0837デフォルトの名無しさん
2008/10/12(日) 15:06:42834が言いたいことはあってると思うが、真は非0じゃないかと。
さておき
if((dwFVF &0xf0) &D3DFVF_DIFFUSE)
は
if(((dwFVF &0xf0) &D3DFVF_DIFFUSE) != 0)
てこった。
俺の認識としては、0かどうかの判定を真偽判定で代用してるって感じかな。
0838デフォルトの名無しさん
2008/10/12(日) 15:10:52(dwFVF &0xf0) &D3DFVF_DIFFUSE
だから、
(dwFVF & 0xf0) の部分だけで 0 or 1 にされたのでは
たまらんわな。
0839デフォルトの名無しさん
2008/10/12(日) 15:12:130840832
2008/10/12(日) 15:13:06ビット演算でしたか。
自分はてっきり参照渡し系だと思ってました・・・。
0841デフォルトの名無しさん
2008/10/12(日) 15:31:43仮にアクセスができたとして、hoge[-1] == \0 なんて保障は無いですよね?
0842デフォルトの名無しさん
2008/10/12(日) 15:34:500843デフォルトの名無しさん
2008/10/12(日) 15:37:12hoge = a+1;
assert(hoge[-1] == '\0');
0844デフォルトの名無しさん
2008/10/12(日) 15:37:36char *b = a + 1;
とした場合b[-1]はa[0]を指す。
a[-1]は大抵アクセスできるが意味のある値を期待すべきじゃないし
アクセス違反が生じる危険もある。
0845デフォルトの名無しさん
2008/10/12(日) 15:50:44釣れてますか?
0846デフォルトの名無しさん
2008/10/12(日) 15:53:24嘘つくなこのゴミ野郎
0847デフォルトの名無しさん
2008/10/12(日) 16:00:48今の俺にはどの辺がおかしいのかわからない様だ…
0848デフォルトの名無しさん
2008/10/12(日) 16:06:350849デフォルトの名無しさん
2008/10/12(日) 16:08:24と表示するもっとも簡単なコードを教えてください。
0850デフォルトの名無しさん
2008/10/12(日) 16:10:280851デフォルトの名無しさん
2008/10/12(日) 16:10:37やめろよ・・・・
0852デフォルトの名無しさん
2008/10/12(日) 16:14:33なんでそう思った?
0853デフォルトの名無しさん
2008/10/12(日) 16:54:500854デフォルトの名無しさん
2008/10/12(日) 16:59:19*(a-1)にアクセスするのは未定義だろう
そのアプリケーションがa[-1]の部分のメモリ確保してるとは限らないし
0855デフォルトの名無しさん
2008/10/12(日) 17:01:02日本語は読める?
0856デフォルトの名無しさん
2008/10/12(日) 17:01:29>>844 は b[-1] と a[-1] の書き間違いじゃないのか?
0857デフォルトの名無しさん
2008/10/12(日) 17:04:260858デフォルトの名無しさん
2008/10/12(日) 17:15:460859デフォルトの名無しさん
2008/10/12(日) 17:31:150860C言語始めました
2008/10/12(日) 18:06:19で宣言した二次元配列を自作の関数に渡すのはどう宣言するのですか?
0861デフォルトの名無しさん
2008/10/12(日) 18:11:33myfunc(vector< vector<double> > & rVct);
その二次元配列を使い回すならtypedef。
0862C++スレで聞いてください
2008/10/12(日) 18:12:07どう宣言しても構いません。どの途コンパイルできませんから。
0863デフォルトの名無しさん
2008/10/12(日) 18:27:54そんなC言語ありません
0865デフォルトの名無しさん
2008/10/12(日) 20:17:11できません。。
宿題スレが落ちてるので誰かタスケテ
0866デフォルトの名無しさん
2008/10/12(日) 20:22:27落ちてネェよwww
0867デフォルトの名無しさん
2008/10/12(日) 20:22:40それぐらい探せよw
0868デフォルトの名無しさん
2008/10/12(日) 20:25:14このまえ彼氏と初Hをしました(>ω<)↑↑
彼氏の家でしました〜。
初めてだったから最初ゎちょっと痛かった(汗)
んで!!彼氏が写メとったのッッ(>д<)
私、恥ずかしいんだけど・・見られるのゎ好きなんだっ♪
だから・・・みんなに見てほしいんだ〜(>A<)↑↑
でも、モロ見られるのゎ嫌だから、
この文章を5箇所に貼ってくれた人のみにみせようと
思いますっ♪
5箇所に貼れば、【★】←がクリックできるようになるの!
こんなのありきたりで誰も信じてくれないかもっ!と思うけど、コレゎ本当なんだよっっ!!!
ぜひ見たい人ゎやってみてねっ(>ω<)↑↑
なんかぁ〜すっごいエロいみたい!
もろアソコとか濡れまくりだった・・・(汗
0869デフォルトの名無しさん
2008/10/12(日) 21:03:32別にできなくてもいいんだよ
0870デフォルトの名無しさん
2008/10/12(日) 21:44:400871デフォルトの名無しさん
2008/10/12(日) 21:59:57STDMETHOD の検索結果 約 32,600 件中 1 - 10 件目 (0.13 秒)
上から順番にどぞ
0872デフォルトの名無しさん
2008/10/12(日) 22:31:40double data[100]
for文でdataを0.0で初期化。
ここで表示すると全要素0.0になっている
処理 dataをいじったりはしてない
for文でdataを表示
data[30]あたりに10万ぐらいの数字が入ってる
なぜですか・・・?
0873デフォルトの名無しさん
2008/10/12(日) 22:33:00処理がバグって、dataを触ってるんだろう。
0874デフォルトの名無しさん
2008/10/12(日) 22:34:27その現象がおきる最小限のコードを書いて、ここに貼り付けてみるとか。
0875デフォルトの名無しさん
2008/10/12(日) 22:35:09data をいじってしまったからだよ
0876デフォルトの名無しさん
2008/10/12(日) 22:36:28ちょっとやってみようと思ったんですけど、難しいですww
処理のところで関数呼んでるので・・・
もしかしてその関数でdataをいじってしまってるんでしょうか?っつっても関数はらないとわからないですよね・・・
0877デフォルトの名無しさん
2008/10/12(日) 22:47:49デバッガに、特定の変数が書き換わったタイミングで止まる機能があるから、
毎回同じところが書き換わってるなら、それつかってみたら?
ただ、この機能は重いから、デバッグ対象のコードが重いと、使えないくらい遅くなるけど。
0878デフォルトの名無しさん
2008/10/12(日) 22:49:38visual studioのデバッグってやつですか?
0879デフォルトの名無しさん
2008/10/12(日) 22:49:57デバッガを使うときっと場所が変わる
0880デフォルトの名無しさん
2008/10/12(日) 22:54:29ソースをいくらみても間違ってるとは思えないのに・・・
0881デフォルトの名無しさん
2008/10/12(日) 22:56:480882デフォルトの名無しさん
2008/10/12(日) 22:58:06そんなん当てにならん。
0883デフォルトの名無しさん
2008/10/12(日) 23:00:21ですかね・・・
でもdataにアクセスする処理は一切してないんですよねぇ
0884デフォルトの名無しさん
2008/10/12(日) 23:01:090885デフォルトの名無しさん
2008/10/12(日) 23:02:05でなければ帰れ
0886デフォルトの名無しさん
2008/10/12(日) 23:03:030887デフォルトの名無しさん
2008/10/12(日) 23:07:30{
int *po;
po = NULL;
*po = 0xFFFF;
return(0);
}
0888デフォルトの名無しさん
2008/10/12(日) 23:09:33ちょっと検討してみます
すいませんでした
0889デフォルトの名無しさん
2008/10/12(日) 23:10:460890デフォルトの名無しさん
2008/10/12(日) 23:44:20わかる方がいましたら教えてください。
int WINAPI WinMain(HINSTANCE hINstance,HINSTANCE hPrevInstance,
LPSTR lpszArgs,int nWinMode){
WNDCLASSEX wcex = {0}; //ウィンドウクラス設定用の構造体
HWND hWnd = 0; //ウィンドウ用のハンドル
MSG msg = {0}; //メッセージ取得用の構造体
//ウィンドウ・クラス設定
wcex.cbSize = sizeof(wcex);
wcex.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
wcex.lpfnWndProc = wcex.lpfnWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = wcex.hInstance;
wcex.hIcon = (HICON)LoadImage(
NULL,IDI_APPLICATION,IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED);
wcex.hCursor = (HCURSOR)LoadImage(
NULL,IDC_ARROW,IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = wcex.lpszClassName;
wcex.hIconSm = wcex.hIcon;
//ウィンドウ・クラス登録
if(!RegisterClassEx(&wcex)){
MessageBox(hWnd,"ウィンドウ・クラス登録に失敗しました","error",MB_OK);
return 0;
}
0891デフォルトの名無しさん
2008/10/12(日) 23:47:160892デフォルトの名無しさん
2008/10/12(日) 23:47:42> wcex.lpfnWndProc = wcex.lpfnWndProc;
> wcex.hInstance = wcex.hInstance;
> wcex.lpszClassName = wcex.lpszClassName;
0893デフォルトの名無しさん
2008/10/12(日) 23:49:450894デフォルトの名無しさん
2008/10/13(月) 10:41:36BASICのRESUMEやOnErrorGoTo?見たいに。
0895デフォルトの名無しさん
2008/10/13(月) 10:51:33いったいどんなエラーを想定してるんだか知らんが、関数がエラー起こした時の戻り値で分岐させるのが普通。
0896デフォルトの名無しさん
2008/10/13(月) 12:48:12無理。
VCなら構造化例外なんてものがあるけど。
0897デフォルトの名無しさん
2008/10/13(月) 13:39:01C++スレッドで聞くのだ
0898デフォルトの名無しさん
2008/10/13(月) 14:07:040899デフォルトの名無しさん
2008/10/13(月) 14:09:220900デフォルトの名無しさん
2008/10/13(月) 14:16:19組み込みとかなら結構使うけど
0901デフォルトの名無しさん
2008/10/13(月) 14:19:140902デフォルトの名無しさん
2008/10/13(月) 14:21:560903デフォルトの名無しさん
2008/10/13(月) 14:32:54変更されない文字列の引数に、constがついてない関数とか、どうかと思うし。
0904デフォルトの名無しさん
2008/10/13(月) 14:57:170905デフォルトの名無しさん
2008/10/13(月) 15:09:500906デフォルトの名無しさん
2008/10/13(月) 15:10:17それは知らなかったorz
勉強し直して来ます。
0907デフォルトの名無しさん
2008/10/13(月) 15:11:40だから定数が必要な場所には使えないということ
0908デフォルトの名無しさん
2008/10/13(月) 15:13:11ループ変数を以下のように宣言すると、その値は使わないのでコンパイラ(bcc)で警告(w8004)が出ます。
int i = 0;
ループ変数は初期化しない方がよいのでしょうか?
0909デフォルトの名無しさん
2008/10/13(月) 15:17:11int n;
if(a) n = 1; else n = 2;
みたいなケースでも無理やり初期化すると無駄になる。
一般には初期化しておいたほうがいいけど
代入を別の場所で行うなら初期化する意味はない。
0910デフォルトの名無しさん
2008/10/13(月) 15:20:020912デフォルトの名無しさん
2008/10/13(月) 15:28:50Cみたいに、ブロックの先頭でしか宣言できない言語では、初期化は、宣言したところじゃなくて、使う直前でするのが正しい。
(文法的には初期化じゃなくて代入だけど)
0913デフォルトの名無しさん
2008/10/13(月) 15:30:240914デフォルトの名無しさん
2008/10/13(月) 15:53:33int j;
j = 0: /* 初期化ではなくて代入 */
で、OK?
0915デフォルトの名無しさん
2008/10/13(月) 16:10:31int i = 0; /* 宣言と、初期化の代入をいっぺんにやる */
int j;
j = 0: /* 宣言ではなくて初期化の代入 */
j = 1; /* 代入 */
0916デフォルトの名無しさん
2008/10/13(月) 16:13:09初期化の代入は、規格に存在する用語ではないはずだから、
話の流れによっては少し気を付けて使ったほうがいい。
0917デフォルトの名無しさん
2008/10/13(月) 16:14:16まとめて宣言すべしとかいうダメ規則のところとかあるな。
0918デフォルトの名無しさん
2008/10/13(月) 16:34:29宣言時に必ず初期化、とか単なる宗教問題。
0919デフォルトの名無しさん
2008/10/13(月) 16:45:570920デフォルトの名無しさん
2008/10/13(月) 16:49:01int i;
while (i < 10) {
i++;
}
0921デフォルトの名無しさん
2008/10/13(月) 16:58:56そういうこと。
ただし、よその言語ではiが0に初期化されるという決まりのものもあって、
そういう言語では0で初期化するかどうかは>>918の言うとおり宗教問題。
当然、Cでも静的変数とか大域変数は0初期化ありなんで、この宗教問題からは逃れられない。
0922デフォルトの名無しさん
2008/10/13(月) 17:13:180923デフォルトの名無しさん
2008/10/13(月) 17:15:22再現性の低いバグの元になるから
0924デフォルトの名無しさん
2008/10/13(月) 17:16:420925デフォルトの名無しさん
2008/10/13(月) 17:18:59そういう小学生でもできる駄目だしもよく沸くよね。
そういう時は素直に「仲間に入れて」といったほうがいいよ^^
0926デフォルトの名無しさん
2008/10/13(月) 17:20:590927デフォルトの名無しさん
2008/10/13(月) 17:58:05で stream をファイルディスクリプターに変換できますが、
逆に、ファイルディスクリプターを FILE *に変換したいです。
何という関数使えばいいでしょうか?
よろしくです。
0928デフォルトの名無しさん
2008/10/13(月) 18:01:00スレよごしスマソ
0930デフォルトの名無しさん
2008/10/13(月) 18:58:29不要な初期化が宗教問題であってたまるか
0931デフォルトの名無しさん
2008/10/13(月) 19:03:24初期化が不要なところで初期化したらなんか問題あんの?
0932デフォルトの名無しさん
2008/10/13(月) 19:12:14もし、そういう書き方したら、コンパイラが警告だすだろ。
言語によってはエラーになるし。
たとえば↓こういうので、
int max;
max = hoge(); // 初期化
for (i = 0; i < max; i++) ・・・
ルールで機械的に宣言と同時に初期化ってコードを書いていたら、
本当の初期化を忘れても
int max = 0;
for (i = 0; i < max; i++) ・・・
警告が出ない。
>>921
VB.NETで仕事したとき、未初期化の変数を参照しても警告もでなかったんで、たしかに勝手に
初期化ってウンコ仕様だと思ったな。
0933デフォルトの名無しさん
2008/10/13(月) 19:20:26そんな必要がある奴がチームにいることが大問題だ
0934デフォルトの名無しさん
2008/10/13(月) 19:23:36大筋同意だが、警告はそれ自体が処理系依存だからあてにはならんな
0935デフォルトの名無しさん
2008/10/13(月) 19:33:28冗長なコードは1行でも減らす。それがバグを減らすことに繋がる。
0936デフォルトの名無しさん
2008/10/13(月) 21:57:21結構いるぞorz
0937デフォルトの名無しさん
2008/10/14(火) 02:11:490938デフォルトの名無しさん
2008/10/14(火) 02:31:470939デフォルトの名無しさん
2008/10/14(火) 02:34:300940デフォルトの名無しさん
2008/10/14(火) 02:35:250941忽 ◆vvvK3Fcqdg
2008/10/14(火) 07:55:530942デフォルトの名無しさん
2008/10/14(火) 09:32:420943デフォルトの名無しさん
2008/10/14(火) 12:58:47質問させてください
int main (void)
{
char str[] = "145";
int i,suuti[4];
for(i = 0 ; i < 4 ; i++)
{
★ suuti[i] = atoi(str[i]);
}
printf("%d\n",suuti[2]);
return 0;
}
★のようにatoi関数を使って、文字列を数値に変換するときに
ひとつの要素ごとに変換しようとするとエラーがでます。
これはもともとできない操作なんでしょうか?
0944デフォルトの名無しさん
2008/10/14(火) 13:03:240945デフォルトの名無しさん
2008/10/14(火) 13:10:430946デフォルトの名無しさん
2008/10/14(火) 13:11:40やっぱりできないんですね
違うやり方を考えてみます。
ありがとうございました
0947デフォルトの名無しさん
2008/10/14(火) 17:34:27int bar[5][5] = hoge();
(hogeは二次元配列の先頭のポインタを返す)
このときどうやってキャストすればいいんですか
0948デフォルトの名無しさん
2008/10/14(火) 17:41:030949デフォルトの名無しさん
2008/10/14(火) 17:51:56にして引数で25個分のデータをセットすればいいよ。
typedefするのがより望ましいけど。
0950デフォルトの名無しさん
2008/10/14(火) 17:56:30少なくとも以下のことを理解する必要がある。
1)
Cでは配列は「二級オブジェクト」であり、全体を関数に渡したり関数から返してもらうことができない。
関数が return する対象として配列を書いたら、返されるのは常に配列の先頭要素へのポインタである。
2)
ポインタをどうキャストしようと、配列に対して代入することはできない。
これは「配列全体」という値が存在しないからであり、配列を関数とやりとりできないのと同じ理由である。
関数の返すポインタを受け取りたいならポインタを宣言してそこに代入する。
例 : int (*bar)[5] = hoge();
3)
関数が配列(の先頭要素)へのポインタを返してくるとして、その配列の実体はどこにあることになっているか。
もし関数内部の auto な変数として確保した配列を使っていたら、関数から戻ってきてその配列を参照しようとしたときには
もう使えなくなっている可能性がある。static な配列や、関数内部で動的に malloc() した配列を使えばこの心配はないが、
(改めてコピーしないかぎり)複数の値を保持することができなくなったり、あとで free() する手間が発生したりする。
一番まっとうで問題の起きにくい手段は、関数に配列へのポインタを渡してそこに値を埋めさせることである。
0951デフォルトの名無しさん
2008/10/14(火) 18:00:14foo bar[5][5];
} hoge(void);
0952デフォルトの名無しさん
2008/10/14(火) 18:01:22とりあえず配列、ポインタ関連のとこ勉強しなおしてきます
0953デフォルトの名無しさん
2008/10/14(火) 19:03:54double data;
char mozi[100]:
}Hoge;
int main(){
0954デフォルトの名無しさん
2008/10/14(火) 19:05:13double data;
char mozi[100]:
}Hoge;
int func(double data[]){
}
int main(){
Hoge hoge[20];
}
main関数からfunc関数に構造体のdouble型のデータだけを参照渡ししたいんですが、どうすればいいですか?
0955デフォルトの名無しさん
2008/10/14(火) 19:08:530956デフォルトの名無しさん
2008/10/14(火) 19:11:24int func(Hoge hoge2){
}
として
func(hoge);ですか?
0957デフォルトの名無しさん
2008/10/14(火) 19:24:400958デフォルトの名無しさん
2008/10/14(火) 20:29:49必ず初期化することってルールだと、宣言の時点で適切に初期化できなかったら、適当に0とかNULLを入れるって
話になる。
0959デフォルトの名無しさん
2008/10/14(火) 20:56:55できない。
参照渡しの言葉の意味はさておいても、構造体の配列はメンバの配列の配列ではないから、
どのような渡し方をしたとしても、特定のメンバだけを配列として扱うことは不可能である。
構造体の配列(の先頭)へのポインタを渡して、構造体を添字で辿って各メンバを参照すること。
>>956
Cには参照渡しは存在しない。ポインタ渡しを使って参照渡しと似たようなことができるだけである。
そしてその例はどう見ても参照渡しではなく値渡しである。ポインタ渡しをするなら、
int func(Hoge *hoge2)
と宣言して
func(&hoge); とすること。
0960デフォルトの名無しさん
2008/10/14(火) 21:04:29いつかは適切な代入ポイントがあるんでそ。
じゃあ、そこまで宣言を遅らせればいいじゃん
0961デフォルトの名無しさん
2008/10/14(火) 21:18:05C++だとどうなりますか?
0962デフォルトの名無しさん
2008/10/14(火) 21:18:340963デフォルトの名無しさん
2008/10/14(火) 21:22:26C++スレで聞いてください
0964デフォルトの名無しさん
2008/10/14(火) 21:29:33次々とブロックを作れば良いんじゃね。
{int i;
...
i = foo();
...
{int j;
...
j = bar();
...
{int k;
...
k = baz();
...}}}
0965デフォルトの名無しさん
2008/10/14(火) 21:30:45}
int main(){
char buff[10];
func(buff);
}
これはCではだめなんですか?
0966デフォルトの名無しさん
2008/10/14(火) 21:33:04状況によってはブロック化するのは有効だと思う。
但し、関数の途中で宣言したい変数を関数の終端で使いたいとしたら、この手は使えない。
0967デフォルトの名無しさん
2008/10/14(火) 21:35:22func()やmain()に戻り値がないことを除けばダメではない。
但し、func()の宣言における「10」には意味がないので
(混乱防止のために)書かないのが普通。
つまり、char buff[]或いはchar * buffとする。
0968デフォルトの名無しさん
2008/10/14(火) 21:39:25char buff[] char *buffっていうのはbuffへのポインタですか?
→ 0 1 2 3 4・・・9
buff
0969デフォルトの名無しさん
2008/10/14(火) 21:40:30{
int x;
...
{int i;
...
i = foo();
...
{int y;
...
/* 関数終端直前 */
use(i);
}} /* 関数終端 */ }
0970デフォルトの名無しさん
2008/10/14(火) 21:43:58http://kmaebashi.com/programmer/pointer.html
関数の仮引数の宣言では、
char buff[]もchar *buffと同じに扱われ、buffはcharへのポインタ型となる。
0971デフォルトの名無しさん
2008/10/14(火) 21:44:36ここの2番目のソースを
void add(int num1, int num2, int *ans);
int main(void)
{
int num1, num2, ans;
printf( "1つ目の整数を入力して下さい\n" );
scanf( "%d", &num1 );
printf( "2つ目の整数を入力して下さい\n" );
scanf( "%d", &num2 );
add( num1, num2, ans ); /* 加算結果を受け取る */
printf( "%d + %d = %d\n", num1, num2, ans ); /* 計算式を出力 */
return 0;
}
/* 2つの引数の加算結果を、指定されたアドレスに格納
num1, num2 加算する2つの整数。
*ans 加算結果を格納する位置。 */
void add(int num1, int num2, int ans)
{
*ans = num1 + num2;
}
としてもいいんですか?参照渡しのままですか?
0972デフォルトの名無しさん
2008/10/14(火) 21:46:010973デフォルトの名無しさん
2008/10/14(火) 21:46:590974デフォルトの名無しさん
2008/10/14(火) 21:47:29>971ではコンパイルすら出来ません。
0975デフォルトの名無しさん
2008/10/14(火) 21:48:00コンパイルエラー
ちなみに、C++の渡しだと定義はこうなる
void add(int num1, int num2, int &ans);
0976デフォルトの名無しさん
2008/10/14(火) 21:51:02なぜそう書こうと思ったか説明してみろw
0977デフォルトの名無しさん
2008/10/14(火) 21:56:01>>971ではけしわすれたんですが・・・
0978デフォルトの名無しさん
2008/10/14(火) 22:00:13void add(int num1, int num2, int * ans)
{
ans[0] = num1 + num2;
}
まぁ、実際には戻り値を使うべきな訳だが。
0979デフォルトの名無しさん
2008/10/14(火) 22:01:05色々間違っているし、スレ違いな回答なんてしなくていいんですよ。
0980デフォルトの名無しさん
2008/10/14(火) 22:01:53は?おかしいだろ
0981デフォルトの名無しさん
2008/10/14(火) 22:04:28あん♪どこがおかしいかいってみろよ
0982デフォルトの名無しさん
2008/10/14(火) 22:04:50どこが?
まさかとは思うが、この期に及んで>971のリンク先を見てないなんて寝言はよしてくれよ。
0983デフォルトの名無しさん
2008/10/14(火) 22:05:55なんで配列がでてくるんですか・・?
0984デフォルトの名無しさん
2008/10/14(火) 22:06:450985デフォルトの名無しさん
2008/10/14(火) 22:06:530986デフォルトの名無しさん
2008/10/14(火) 22:09:19なんですか。。。?
0987デフォルトの名無しさん
2008/10/14(火) 22:10:030988デフォルトの名無しさん
2008/10/14(火) 22:11:54-- This will be a Triumph!
0989デフォルトの名無しさん
2008/10/14(火) 22:18:50void hoge(double *data);
int main(){
double data[200];
hoge(data);
}
void hoge(double data[]){
}
これは参照渡しなんですか?
0990デフォルトの名無しさん
2008/10/14(火) 22:24:160991デフォルトの名無しさん
2008/10/14(火) 22:25:090992デフォルトの名無しさん
2008/10/14(火) 22:25:25Cプログラマは、C++の参照のようにポインタを扱うふしがあるため、それを参照渡しと呼ぶことがあるだけです。
0993デフォルトの名無しさん
2008/10/14(火) 22:25:270994デフォルトの名無しさん
2008/10/14(火) 22:26:21>>986
ケフィアです
0995デフォルトの名無しさん
2008/10/14(火) 22:28:49関数hogeに新しくコピーされますよ。
hogeの中で変更したとしても、呼び出し元になんの影響も与えません。
つまりは主語がないと困るよってことです。
0996デフォルトの名無しさん
2008/10/14(火) 22:30:45新しくコピーされないようにするにはどうするんですか?
0997デフォルトの名無しさん
2008/10/14(火) 22:45:56コピーされる(されない)対象はなんだ
0998デフォルトの名無しさん
2008/10/14(火) 22:47:210999デフォルトの名無しさん
2008/10/14(火) 22:49:28なぜなら配列の名前を出すと(ほとんどの場合)それは配列の先頭へのポインタになるから
関数の呼び出し時にコピーされるのはこのポインタの値で、関数はこれを使ってポインタの先にある配列を操作する
1000デフォルトの名無しさん
2008/10/14(火) 22:50:5210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。