C言語なら俺に聞け(入門篇) Part 46
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/03/01(日) 23:36:43初心者、初級者の方は他の質問スレのほうが良いかもしれません。
教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 122代目
http://pc11.2ch.net/test/read.cgi/tech/1232029287/
もしくは
C/C++の宿題片付けます 123代目
(現時点でまだ立っていません)
・C++言語はスレ違いですが、ある程度なら対応です。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 45
http://pc11.2ch.net/test/read.cgi/tech/1235044065/
過去スレ
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デフォルトの名無しさん
2009/03/02(月) 00:08:17(__)
(__)
(( o(,,・∀・ ) うっ、うっ!
丿 ノo ))
(,/ヽ_)
人
(__)
(__)
(,,・∀・ ) うんこ〜♪
⊂ と丿
ヽ__)-'
人
(__)
(__)
(,,・∀・ ) みんなで、みんなで!
(( ノ つ ⊃ ))
(__ノヽ_)
人
(__)
(__)
('( ・∀・,,)') うんこ〜♪
( )
U-U
0003デフォルトの名無しさん
2009/03/02(月) 00:15:430004デフォルトの名無しさん
2009/03/02(月) 00:33:221.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
0005デフォルトの名無しさん
2009/03/02(月) 00:38:24あなたのIPは219.134.234.342です。
送信しました
0006デフォルトの名無しさん
2009/03/02(月) 00:39:15boost::threadを使って,ファイル読み込みと処理の部分をマルチスレッド化しようと思っていますが,うまくいきません。
大量のファイルを読み込み,最初の一行をvectorに読み込む場合,下のようなプログラムになると思うのですが,何がだめなのでしょうか?
boost::mutex state_guard;
class FileOpener {
public:
FileOpener(std::string file_name, std::vector<std::string> *first_lines) : file_name(file_name), first_lines(first_lines) {
};
virtual ~FileOpener(){};
void run() {
boost::mutex::scoped_lock lk(state_guard);
std::fstream member_csv(file_name.c_str(), std::ios::in);
std::string str;
getline(member_csv, str);
first_lines->push_back(str);
member_csv.close();
}
private:
std::string file_name;
std::vector<std::string> *first_lines;
};
0007デフォルトの名無しさん
2009/03/02(月) 00:42:190008デフォルトの名無しさん
2009/03/02(月) 01:22:58このスレで質問したこと
0009デフォルトの名無しさん
2009/03/02(月) 01:49:340010デフォルトの名無しさん
2009/03/02(月) 02:44:12無視しとけばいいんじゃない
0011476
2009/03/02(月) 11:28:48int fact(int i);
int main(void)
{
printf("%d\n",fact(4));
return 0;
}
int fact(int i)
{
if(i==1) return 1;
else return i*fact(i-1);
}
これなんですが
int fact(int i)
{
if(i==1) return 1;
else return i*fact(i-1);
}の場所の if(i==1) return 1;なんですが
何で return 1なんですが?しかしreturn 1なのに1ではなく、ちゃんと階乗された値が表示されます
何故 return 1;で1と表示されずに ちゃんと表示される理由をおしえてください
0012デフォルトの名無しさん
2009/03/02(月) 11:33:12なぜ、return 1で1と表示されるんだよw
printf("%d\n",fact(4));
4くらいならメモ取りながら動きを追っかけてみるよろし。
最初は i == 0 に入らないよね? だからどうなる? 次は?
0013476
2009/03/02(月) 11:36:46何故if(i==1)return 1;なんですか?
fact(4)で 4=i 1回目はiが4なので elseのreturn i*fact(4-1);ですよね
それで 2回目もiが3になるので return i*fact(3-1);
ってわかってるんですが
何故その値を返すとき return 1;なのか知りたいです
return かけた分;
では無く 何故 return 1;なのか
main関数のように正常終了は return 1ときまってるんでしょうか?
0014デフォルトの名無しさん
2009/03/02(月) 11:38:341*2*3* ... n を計算するのに、そう記述してるだけ
0015476
2009/03/02(月) 11:41:59return 2;とやると24の倍の数がでますし
return 1;の意味がよくわからないです
if(i==1)break;とかでもいいかとおもってましたが
できませんでした
return i*fact(i-1);をやってあるので int fact();にいってるとおもったんですが
最後のreturn 1; これだと1って表示されるかとおもいますが
詳しく教えてください
0016デフォルトの名無しさん
2009/03/02(月) 11:48:18fact(3)
fact(2)
fact(1) 引数1なので1を返す
返った1と2をかけて結果の2を返す
返った2と3をかけて結果の6を返す
返った6と4をかけて結果の24を返す
0017476
2009/03/02(月) 11:48:46その関数を出るまでその局所変数は保存されます。
他の関数で同名の変数が作成されても、保護されます。
その関数自信が直接間接的に再度呼び出されても
値は保護されなければなりません。
(つまり多くのコンパイラはバグってますね。)
0018476
2009/03/02(月) 11:57:16もしかしてポインタより難しいです
再帰の書いてある場所が少なかったんですが、再帰っておぼえるとどんなとき役にたつんですか?
0019デフォルトの名無しさん
2009/03/02(月) 12:02:320020デフォルトの名無しさん
2009/03/02(月) 12:06:510021デフォルトの名無しさん
2009/03/02(月) 12:08:35漸化式をそのまま書ける
0022デフォルトの名無しさん
2009/03/02(月) 12:10:270023デフォルトの名無しさん
2009/03/02(月) 12:30:570024デフォルトの名無しさん
2009/03/02(月) 12:35:00モノにもよるだろ
だが再帰で書きやすい文法にしないと誰も覚えちゃくれないという
ことは言えてる。
0025デフォルトの名無しさん
2009/03/02(月) 12:37:19msdn等を調べましたが、専門用語が多く理解しかねました。
やはり、ランタイム等をインストールしないと使えないのでしょうか?
また、フリーウェア等で配布されているものでコンソールアプリのみで動く物をよく見かけますがどうすれば単体で動くのでしょうか?
きっかけだけでも教えていただければ、後は調べますのでよろしくお願いします。
0026デフォルトの名無しさん
2009/03/02(月) 12:39:310027デフォルトの名無しさん
2009/03/02(月) 12:42:05逆だろw
LISPが覚えやすいと感じるお前のセンスは病気に近いと思う
0028デフォルトの名無しさん
2009/03/02(月) 12:43:550029デフォルトの名無しさん
2009/03/02(月) 14:07:10あなたのIPは139.256.43.192です
送信しました
0030デフォルトの名無しさん
2009/03/02(月) 21:06:17>>26
Releaseでビルドしていると思いますが、一応確認してみます。
>>28
そのアプリが使用しているDLLファイル等を調べる事ができるんですね。
色々と読んでみます。
お二方ありがとうございました。
0031デフォルトの名無しさん
2009/03/02(月) 21:09:59ランタイムライブラリの設定を静的リンク (/MT)にすればいい。
0032デフォルトの名無しさん
2009/03/02(月) 21:43:34構文解析を再帰でかけるかどうかの話なのに何でLISPが出てくるんだ
0033デフォルトの名無しさん
2009/03/02(月) 21:51:30>>31
ご指摘のとおり設定しビルドしたところファイルサイズに変化が表れました。
現在、もう一台のPCが使用中なので明日、実行してみます。
ありがとうございました。
0034デフォルトの名無しさん
2009/03/02(月) 22:37:06つまらん事すんな。
0035デフォルトの名無しさん
2009/03/03(火) 05:23:050036476
2009/03/03(火) 12:37:210037デフォルトの名無しさん
2009/03/03(火) 12:45:11間違ってたとしたらどうなの?
0038デフォルトの名無しさん
2009/03/03(火) 13:21:520039476
2009/03/03(火) 13:37:250040デフォルトの名無しさん
2009/03/03(火) 13:40:23( ゚ω゚ ) お断りします
/ \ ハ,,ハ お断りします
((⊂ ) ノ\つ))( ゚ω゚ )
(_⌒ヽ((⊂ノ ヽつ ))
ヽ ヘ } (_⌒ヽ
ε≡Ξ ノノ `J ノノ `J
0041デフォルトの名無しさん
2009/03/03(火) 13:45:17閉じたサブルーチンとしてよく使われるのが関数
開いたサブルーチンとしてよく使われるのがマクロ
0042デフォルトの名無しさん
2009/03/03(火) 13:49:32関数は式であって、値を返す
サブルーチンは処理の単純にまとめたもので値を返さない、ので式の一部にはなれない
程度の認識だな
C言語の場合でいうと、復帰値voidの場合サブルーチン的とか
ただ、Cでは厳密な定義はないのでどちらにしろあいまい、普通に検索したほうがはやそう
0043デフォルトの名無しさん
2009/03/03(火) 13:49:430044デフォルトの名無しさん
2009/03/03(火) 14:12:200045デフォルトの名無しさん
2009/03/03(火) 14:12:23と呼ぶのが正しいかって問いのほうが重要な気がする。
言語のfuncitonとかねw
0046デフォルトの名無しさん
2009/03/03(火) 14:21:37Cの場合は関数はあるけどサブルーチンは定義されてないという認識
0047デフォルトの名無しさん
2009/03/03(火) 14:41:24typedef struct a{
int i;
A *part_a;
B *part_b;
C *part_c;
}A;
typedef struct b{
long l;
A *part_a;
B *part_b;
C *part_c;
}B;
typedef struct c{
long long ll;
A *part_a;
B *part_b;
C *part_c;
}C;
コンパイルが通りません。
どうやればいいんでしょうか?教えてください。
0048デフォルトの名無しさん
2009/03/03(火) 14:52:40typedef struct a{
int i;
struct a *part_a;
struct b *part_b;
struct c *part_c;
}A;
typedef struct b{
long l;
struct a *part_a;
struct b *part_b;
struct c *part_c;
}B;
typedef struct c{
long long ll;
struct a *part_a;
struct b *part_b;
struct c *part_c;
}C;
かただかポインタなので、その構造体の内部配置が確定している必要はない
# んだが、非ポインタで要素をもつ構造体の巡回参照は定義できたっけか?
0049デフォルトの名無しさん
2009/03/03(火) 14:53:13int i;
struct A *part_a;
struct B *part_b;
struct C *part_c;
}A;
typedef struct B{
long l;
struct A *part_a;
struct B *part_b;
struct C *part_c;
}B;
typedef struct C{
long long ll;
struct A *part_a;
struct B *part_b;
struct C *part_c;
}C;
0050デフォルトの名無しさん
2009/03/03(火) 14:56:47C を C++ っぽく使いたがる奴は
C を Pascal っぽく使いたがる奴と同質
そんなガイキチ増えて欲しくない
0051デフォルトの名無しさん
2009/03/03(火) 14:58:05typedef struct b B;
typedef struct c C;
struct a{
int i;
A *part_a;
B *part_b;
C *part_c;
};
struct b{
long l;
A *part_a;
B *part_b;
C *part_c;
};
struct c{
long long ll;
A *part_a;
B *part_b;
C *part_c;
};
0052デフォルトの名無しさん
2009/03/03(火) 14:59:03ありがとうございました。両方ともコンパイルが通りました。
0053デフォルトの名無しさん
2009/03/03(火) 15:26:56が出来るけど教えてあげないことって
>>48,49,51
とは違うよね。やっぱり
0054デフォルトの名無しさん
2009/03/03(火) 15:27:05そうだね、>50だけで充分だ。
0055476
2009/03/03(火) 15:43:01サブルーチンは値を返さない実行っておぼえます
void fu(int x)
{
printf("%d",x);
}
これがサブルーチンで値を返す
int fu(int x)
{
return x;
}
とてもわかりやすかったですありがとうございました
42さん
0056デフォルトの名無しさん
2009/03/03(火) 15:56:09Cではサブルーチンという表現はしないほうが良い。
0057476
2009/03/03(火) 16:05:08これが関数で値を返すの間違えでした
独習Cにサブルーチンという表現が書いてありました
0058デフォルトの名無しさん
2009/03/03(火) 16:15:23となるとCはサブルーチンのみから構成されるから
サブルーチンという言い方を敢えてするのはおかしいわけ。
0059デフォルトの名無しさん
2009/03/03(火) 16:22:14ヒマなことだ
0060デフォルトの名無しさん
2009/03/03(火) 17:20:27SDKで組んでいます.
long型の変数 xdim の値を文字列に変えて,
設定用ダイアログボックスの Edit Controll に
入れる事をしたいです.
以下のように組んでいますが上手くいきません.
long xdim = 12;
char *long2char(long num);
LRESULT CALLBACK SetDlgProc(HWND hDlgWnd, UINT msg, .... ) {
switch(msg) {
case WM_INITDIALOG:
SetDlgItemText(hDlgWnd, IDC_EDIT_X, (LPCSTR)long2char(xdim));
break;
...
}
char *long2char(long num) {
char str[256];
sprintf(str, "%ld\n", num);
return str;
}
文字化け?した文字列が Edit Controll に入力されます.
(LPCSTR)"12" とすると,文字列 12 が入力されます.
ltoa 関数なども調べましたが,sprintf の方が良いと書かれていたのでこちらで書いています.
どのように修正したらよろしいでしょうか?よろしくお願いします.
0061デフォルトの名無しさん
2009/03/03(火) 17:21:05>>54
0062デフォルトの名無しさん
2009/03/03(火) 17:36:37>char str[256];
>return str;
このstrはlong2char()から抜けた時点で消滅する。
メモリ割り当てるか、静的に確保 (long xdim = 12 の下とか) しないと。
0063デフォルトの名無しさん
2009/03/03(火) 17:43:530064デフォルトの名無しさん
2009/03/03(火) 18:02:49サブルーチンは何度も利用する複数の処理をまとめておいたもの
関数は値を与えて処理して値を返すもの
Cは全部関数と呼び、Perlは全部サブルーチン(または関数)と呼ぶ
VBは値を返すものが関数プロシージャ、返さないものをサブプロシージャ
HSPは値を返すものは関数、返さないものは命令、gosub+ラベルで呼び出すものは
サブルーチンというように使い分けている
0065デフォルトの名無しさん
2009/03/03(火) 18:04:30何処の誤爆だよ?
って言うか、用語ぐらいちゃんと調べろよ
0066デフォルトの名無しさん
2009/03/03(火) 18:08:29476と名乗っているコテが張り付いているんだよ。用語が滅茶苦茶なのには同意。
0067デフォルトの名無しさん
2009/03/03(火) 18:31:19「学びて思わざれば則ち罔し」
を地でいってるんだな
0068デフォルトの名無しさん
2009/03/03(火) 18:32:25ああ、まだいるのか。
NGNAMEにしてるから気づかなかった。
007064
2009/03/03(火) 21:56:44あと476にもかまっちゃいけないルールなのね
いろいろすまん
0071デフォルトの名無しさん
2009/03/03(火) 22:24:15>>31さん
遅くなりましたが、本日試してみたところ無事実行されました。
ありがとうございました。
また、>>26さん、>>28さんもアドバイスありがとうございました。
0072デフォルトの名無しさん
2009/03/04(水) 00:58:34ルールってことはないだろ。
ただ、オレは見たくないから見ないだけ。
0073デフォルトの名無しさん
2009/03/04(水) 11:24:30独習C
C言語入門(ビギナー編)
などいろいろありますが
どの本がお勧めですか?(上記3つ以外でも結構です)
0074デフォルトの名無しさん
2009/03/04(水) 11:27:23スレ違い
消えろ
0075デフォルトの名無しさん
2009/03/04(水) 11:41:06オライリーのC++実践プログラミング。
C++って書いてあるけど、前半はCについて書いてる。
プログラミング上の作法なども書いてくれていて役立つ。
C++ならC++ プライマー。
詳細に綿密に系統立てて網羅してある。
あいまいだったり説明不足だったりは無く、
とても心強い。高いけど。
0076デフォルトの名無しさん
2009/03/04(水) 12:39:06てめーもスレ違いだっつうの
0077デフォルトの名無しさん
2009/03/04(水) 13:02:02http://pc11.2ch.net/test/read.cgi/tech/1234494641/
読んだ書籍の感想・紹介
http://pc11.2ch.net/test/read.cgi/tech/1064681919/
0078デフォルトの名無しさん
2009/03/04(水) 14:46:030079デフォルトの名無しさん
2009/03/04(水) 19:49:160080デフォルトの名無しさん
2009/03/04(水) 20:34:36上級者が読むような本
0081デフォルトの名無しさん
2009/03/04(水) 20:37:160082デフォルトの名無しさん
2009/03/04(水) 22:32:420083デフォルトの名無しさん
2009/03/04(水) 23:13:390084デフォルトの名無しさん
2009/03/04(水) 23:14:120085デフォルトの名無しさん
2009/03/05(木) 00:27:160086デフォルトの名無しさん
2009/03/05(木) 00:57:360087デフォルトの名無しさん
2009/03/05(木) 01:20:14で、9割が脱落したと。
0088デフォルトの名無しさん
2009/03/05(木) 01:28:10ファイルパスを取得したいのですが、拡張子の指定が上手くいきません。
void GetFilePath( ..., char *ext) { // GetFilePath(..., "txt"); として使用しています
OPENFILENAME ofn;
char szFile[MAX_PATH] = "";
char strExt[64];
if (!strcmp(ext, "txt")) {
wsprintf(strExt, "Text file(*.%s)\0.%s\0All files(*.*)\0*.*\0\0", ext, ext);
}
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(OPENFILENAME);
//ofn.lpstrFilter = "Text file(*.txt)\0.txt\0All files(*.*)\0*.*\0\0";
ofn.lpstrFilter = strExt;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrDefExt = ext;
ofn.Flags = OFN_FILEMUSTEXIST;
GetOpenFileName(&ofn);
上手くいかない点1:
ファイルオープンダイアログでのファイル選択時に Text file(*.txt) しか項目に表示されません。
コメントアウトした方の書き方なら、 All file(*.*) も表示されます。
上手くいかない点2:
Text file(*.txt) のばあいでも、拡張子が .txt のファイルが表示されません。
All file(*.*) なら、全てのファイルが問題なく表示されます。
どこに問題があるのでしょうか?よろしくおねがいします。
0089デフォルトの名無しさん
2009/03/05(木) 01:41:48\0 入りの文字列は標準Cライブラリでは処理できない
0090デフォルトの名無しさん
2009/03/05(木) 01:43:280091デフォルトの名無しさん
2009/03/05(木) 01:45:100092デフォルトの名無しさん
2009/03/05(木) 01:45:2925年前はC言語が日本に紹介されてすぐということで、
読者はプログラミング言語初心者でなくて、
他の言語を経験したC言語初心者が多かったはずだから
脱落者は少なかったのでは。
COBOLやOFRTRANからCは敷居が高かったけど
PL/Mとかシステム記述用言語からCはさくっといけたのでは
0093デフォルトの名無しさん
2009/03/05(木) 01:48:55wsprintf(strExt, "Text file(*.%s)\0.%s\0All files(*.*)\0*.*\0\0", ext, ext)
wprintf("%s",strext);
while(*strext++);
wprintf("%s",strext);
while(*strext++);
wprintf("%s",strext);
while(*strext++);
とでもして、本当に編集されているかどうかデバッグ出力してチェックする。
IDE開発している人ならstrextをデバッガでトレースして前後で変化がちゃんと起こってるか
確かめてから質問するだろな
0095デフォルトの名無しさん
2009/03/05(木) 02:10:44と現代のC初心者
は、基本的な質が違う。
0096デフォルトの名無しさん
2009/03/05(木) 02:13:41どのように?
0097デフォルトの名無しさん
2009/03/05(木) 02:16:56みんなが言ってた一週間は換算すると何時間なのだろう。
009888
2009/03/05(木) 02:18:56よろしくお願いします。
拡張子が txt のファイルは確かにあるのですが、
ファイル選択フィールドは真っ白で
ファイルが1つも表示されません。
0099デフォルトの名無しさん
2009/03/05(木) 02:28:10.txt => *.txt とかじゃないの
ちなみに元の処理でよくあるやり方は、例えば>>91が書いてるみたいな '|' などの文字を
\0 の代わりに置いて sprintf などで整形したあとで '|' を '\0' に置換したりするとか
0100デフォルトの名無しさん
2009/03/05(木) 02:34:40ありがとうございます。
* を入力し忘れていたようです。
>>91さんの書いている事はそういう事でしたか。
試してみます。ありがとうございました。
0101デフォルトの名無しさん
2009/03/05(木) 03:40:45代替関数としてstrcpy_sが用意されていますが、
返り値が(char *)である関数を使いたいのです。
何かあるでしょうか?
0102デフォルトの名無しさん
2009/03/05(木) 03:45:042行に分けて書くか、strcpyを使うか。
0103デフォルトの名無しさん
2009/03/05(木) 03:47:120104デフォルトの名無しさん
2009/03/05(木) 04:12:13lstrcpyn
0105デフォルトの名無しさん
2009/03/05(木) 06:38:54通常、strcpy()の戻り値を何かに利用するのは可読性を落とす原因になる。
この手の引き数をそのままスルーして返すタイプの関数全般に言えることではあるが。
それとstrcpy_s()は標準ではないから、警告をオプションで抑制するなどしてstrcpy()を使う方が一般的だろう。
0106デフォルトの名無しさん
2009/03/05(木) 08:50:010107デフォルトの名無しさん
2009/03/05(木) 10:46:050108>>95 じゃないが
2009/03/05(木) 12:40:43「パソコンとはBASIC {が使える | しか使えない} もの」
という時代にCをやろうなんて考える奴は
プログラミング経験者でかつそういうのが好きな物好きしかいない。
0109デフォルトの名無しさん
2009/03/05(木) 12:45:580110デフォルトの名無しさん
2009/03/05(木) 12:49:16無料でコンパイラが使えるとか当時考えもしなかった
BASICかレポート用紙のアセンブラしかなかった
0111デフォルトの名無しさん
2009/03/05(木) 12:53:090112デフォルトの名無しさん
2009/03/05(木) 14:41:22埋めなおしてどうすんだよww
0113デフォルトの名無しさん
2009/03/05(木) 14:54:398時間x5日=40時間?
0114デフォルトの名無しさん
2009/03/05(木) 15:47:50ここで言われてることって今でも信頼出来る?
0115デフォルトの名無しさん
2009/03/05(木) 15:57:58スレ違い
死ね
0116デフォルトの名無しさん
2009/03/05(木) 16:00:26>>114
別に間違ったことは書いてなかったはず。
今ではもっといい方法があるかもしれないけど、
何がマズイか、は今も昔も同じだと思われ。
0117デフォルトの名無しさん
2009/03/05(木) 16:02:18C++に移行できなかった落ちこぼれだろ
今更Cで何してんだよ教えろよ
0118デフォルトの名無しさん
2009/03/05(木) 16:46:38117はC++で何やってるの?
0119デフォルトの名無しさん
2009/03/05(木) 17:45:530120デフォルトの名無しさん
2009/03/05(木) 17:49:540121デフォルトの名無しさん
2009/03/05(木) 18:14:090122デフォルトの名無しさん
2009/03/05(木) 18:14:19最近C++に移行できた「つもり」になっているんですね。
分かります。
0123デフォルトの名無しさん
2009/03/05(木) 18:36:24ええ。C++を使わせてもらえるなら是非とも使いたいですよ。
0124デフォルトの名無しさん
2009/03/05(木) 19:47:12そもgoto自体使用厳禁なわけだが
0125デフォルトの名無しさん
2009/03/05(木) 19:54:21ラベルつきbreakとかないんだから、gotoは使う場合あるだろ。
0126デフォルトの名無しさん
2009/03/05(木) 20:00:22ねーよ
繰り返しで十二分に表現可能だしそもgoto自体ソース初見の際把握しにくいんだから使うべきではない
0127デフォルトの名無しさん
2009/03/05(木) 20:03:22多重breakとか例外とかない、制御構造が貧弱なCでは無理だろ。
分かりづらさはコメントで補うとして。
0128デフォルトの名無しさん
2009/03/05(木) 20:07:26配列の参照はその型の先頭オブジェクトへのポインタに成り下がるから
それに添字分加算してその参照を取るから要素(オブジェクト)の参照になるんだよな。。。
とか頭で考えて(意識して)ますか?
ときどきもっと簡単そうに考えてしまいそうで怖いんですが。
0129デフォルトの名無しさん
2009/03/05(木) 20:08:52gotoは悪で絶対に使ってはならないという人がいる。ちょっとこれは行き過ぎではないか。
A:
プログラミングの作法は文章作法と同じで、ちょっとした技能でガチガチの規則で明文化することはできない。
ただし書き方についての議論はもっぱらそういう規則を中心に回るようである。
goto文については、gotoを好き勝手に使うとすぐに
スパゲッティのようにもつれた保守不能なコードになると昔からいわれている。
しかし、何も考えずに単にgoto文を使うことを禁止しても
すぐに美しいプログラミングに結び付くとは限らない。
体系立てて考えないプログラマーならgoto文をまったく使わなくても
同じように複雑怪奇にもつれたコードを書いてしまう
(たぶん代わりに妙に入れ子になったループやブール値の制御変数を使って)。
プログラムの書き方に関するたいていの意見や"規則"は規則としてよりは指針として考えたほうがうまくいく。
プログラマーが、この指針で何を成し遂げたいのか理解すればもっとうまくいく。
ある種の構文を無闇に敬遠したり、理解することなく規則に従うことは、
規則を使えば避けられることになっているのと同じくらい多くの問題を引き起こす可能性がある。
さらに、プログラムの書き方に関する見解は所詮見解にすぎない。
"書き方論争(style wars)"に引きずり込まれても、たいてい何も産み出さない。
一部の論点(質問9.2, 5.3, 5.9, 10.7で挙げたような)については
お互い相手の意見を認めたり、意見が違うことを認めたり、議論を打ち切ったりすることはないように見える。
0130デフォルトの名無しさん
2009/03/05(木) 20:11:05意識はしないよ
必要なのは蛇口をひねるとどうして水が出るのかを理解していることで、
蛇口をひねるたびにああこの水は水道管から圧力で押し出されてるんだなと考えることじゃない
0131デフォルトの名無しさん
2009/03/05(木) 20:12:47ちょっと安心しました。
0132デフォルトの名無しさん
2009/03/05(木) 20:14:49ここで聞くようなレベルなら、使わないほうがいいな。例外はgotoより難しいから
使わない方がいいよ。プログラマの上澄みだけ集めるgoogleでさえ、例外禁止してるじゃん
C++は昔より難易度下がった。20年前は一つの基底クラスから全部継承して作れって奴が、
いたもんな。
0133デフォルトの名無しさん
2009/03/05(木) 20:19:24gotoでエラーラベルに飛んだほうがわかりやすい時もある
0134デフォルトの名無しさん
2009/03/05(木) 20:29:030135デフォルトの名無しさん
2009/03/05(木) 20:29:22Googleは例外が難しいから禁止しているわけではないだろ。
現に禁止なのはC++だけで、ほかの言語ではそんな決まりないはず。
0136デフォルトの名無しさん
2009/03/05(木) 20:30:03エラー検知→フラグ立てて→後で一括後始末エラー処理
エラー検知→goto で後始末へジャンプ→一括後始末エラー処理
0137デフォルトの名無しさん
2009/03/05(木) 20:48:130138デフォルトの名無しさん
2009/03/05(木) 20:50:43スレチだから短く書いたが、EHを使うことで発生する問題を回避する為に
googleでは禁止している。簡単に言えば難しいから。objective-c(c++)でも推奨してない。
0139デフォルトの名無しさん
2009/03/05(木) 20:52:490140デフォルトの名無しさん
2009/03/05(木) 20:57:12そういうことか。例外処理の概念を人間が理解することが難しいと言っているのかと思った。
0141デフォルトの名無しさん
2009/03/05(木) 20:59:12良く知られているが、gotoなくすとフラグを使いたくなる。
フラグはその数が増えるとたちまち扱いが難しくなる。
フラグ多用なコードの信頼性も決して高くはない。
0142デフォルトの名無しさん
2009/03/05(木) 20:59:49>EHを使うことで発生する問題
例外ハンドラ内でさらに例外を投げてしまう可能性のある記述 とか?
0143デフォルトの名無しさん
2009/03/05(木) 21:00:36判らない理解しないDQNが呼びもしないのに混ざってくるから
「禁止」とか極端な話になるんだよ
0144デフォルトの名無しさん
2009/03/05(木) 21:07:37関数内でmallocやfopenしてたら呼び出し側に丸投げできないとかある
free、fcloseしてreturnを複数書くより最後にまとめておいたほうがいいと思うんだけどね
自分がgoto使うのはこの処理だけ
0145デフォルトの名無しさん
2009/03/05(木) 21:11:18malloc / free や fopen /fclose のペアを呼び出し元に追い出す
ってのは無し?
ま、malloc/free はテンポラリ的な使い方もあるので、気持ちは十分jわかるw
0146デフォルトの名無しさん
2009/03/05(木) 21:31:56プログラミングやるぞ
http://takeshima.2ch.net/test/read.cgi/news4vip/1236254314/
0147デフォルトの名無しさん
2009/03/05(木) 22:02:54ガキかてめーは
0148デフォルトの名無しさん
2009/03/06(金) 00:01:36と数字をうけるんですが
文字をいれるとクラッシュしてしまうんですが
対策はないですか?
0149デフォルトの名無しさん
2009/03/06(金) 00:04:01ある意味ない
0150デフォルトの名無しさん
2009/03/06(金) 00:10:280151デフォルトの名無しさん
2009/03/06(金) 02:38:35なぜかコンパイルが通ってしまうんですが何かおかしいのでしょうか?(環境はVC2005)
ご教授尾長いします。
#include <stdio.h>
typedef enum _E_TYPE {
TYPE_A = 10U,
TYPE_B = 20U,
TYPE_C = 30U,
} E_TYPE;
void main( void )
{
E_TYPE A;
A = 1000U; ★ここでエラーになると思っています。
}
0152デフォルトの名無しさん
2009/03/06(金) 02:41:060153デフォルトの名無しさん
2009/03/06(金) 02:45:09コンパイラ依存らしい。
0154151
2009/03/06(金) 03:05:46ありがとうございます。
一応 VC2005、Eclipse(gcc)、H8系?(High-performance Embedded Workshop)でもやってみたんですが結果は同じでした。
ガードしたいんですが、こうなるとenumの意味があまりないような...
0155デフォルトの名無しさん
2009/03/06(金) 03:10:39(ただしキャストすれば代入可能)
0156デフォルトの名無しさん
2009/03/06(金) 03:11:07ある変数の値の取る範囲を制限することじゃない
要するに、そもそもenumにナマ値を入れるようなコードを書くな
0157デフォルトの名無しさん
2009/03/06(金) 03:11:560158デフォルトの名無しさん
2009/03/06(金) 03:32:03ただ、列挙体の定義時に書いてない値でそれをやって上手くいく保証はないはず。
現実的には、例えばE_TYPEの大きさが1バイトになって
1000が入らないなんてことが考えられる。
0159デフォルトの名無しさん
2009/03/06(金) 03:33:590160121
2009/03/06(金) 03:34:44作法的な話じゃなくて
やると未定義だとか未規定だとかになる例がほかにないか知りたかったんです
goto 禁止とかでぐぐっても、作法の話しかでてこなかったので
なんか宣言に関することであった気がするんですが思い出せないんです
0161デフォルトの名無しさん
2009/03/06(金) 04:44:18そこまでするならカンマ式かなんかでassertを仕掛けた方が気が楽な様に思う。
0162デフォルトの名無しさん
2009/03/06(金) 06:48:01www
0163デフォルトの名無しさん
2009/03/06(金) 07:45:380164デフォルトの名無しさん
2009/03/06(金) 16:11:32if(p)で十分っていうけどif(p != NULL)のほうが親切じゃないですか?
最適化されて同じになるなら後者のほうが優れてますよね?
0165デフォルトの名無しさん
2009/03/06(金) 16:20:27おめーみたいな自称「おれって気配り出来るヤツだなあ」なクズが増えているからいけない
0166デフォルトの名無しさん
2009/03/06(金) 16:28:140167デフォルトの名無しさん
2009/03/06(金) 16:31:59>>129
0168デフォルトの名無しさん
2009/03/06(金) 16:32:47仕事でコード書くなら>>164にすべき
仕事で>>165みたいに言うやつがいたら普通に殴りたくなる
0169デフォルトの名無しさん
2009/03/06(金) 16:37:14どちらが優れているとかどちらを使うべきとかいう問題ではない
強いて言えばプロジェクトグループ内でどちらを選ぶかの合意がありさえすればいい
0170デフォルトの名無しさん
2009/03/06(金) 16:59:07俺も最初の数ヶ月くらいはやってた覚えあるけど、
今となっては冗長以外の何者でもないw
ポインタがNULLかどうかなんて結局、
山のようにチェックせにゃならんのだから。
0171デフォルトの名無しさん
2009/03/06(金) 17:24:27鍛えなおすべきだな。
0172デフォルトの名無しさん
2009/03/06(金) 17:32:34おまえはプログラマに向いてない
0173デフォルトの名無しさん
2009/03/06(金) 17:33:090174デフォルトの名無しさん
2009/03/06(金) 17:41:450175デフォルトの名無しさん
2009/03/06(金) 17:43:38派生クラスは無いのですが
0176デフォルトの名無しさん
2009/03/06(金) 17:45:30????
釣り?
抽象クラスがインスタンス化出来ないのは、設計上当たり前だろ?
0177デフォルトの名無しさん
2009/03/06(金) 17:46:13まずは落ち着いてスレタイ嫁w
0178デフォルトの名無しさん
2009/03/06(金) 17:50:190179デフォルトの名無しさん
2009/03/06(金) 18:02:05引数に抽象クラスが使われるのは、その抽象クラスの派生クラスなら
何でも使えるということを明示する意味だヨ
抽象クラスじゃなかったら、その派生クラスを引数に与えても
コンパイルは通っても実行時にクラッシュする可能性すらある。
0180デフォルトの名無しさん
2009/03/06(金) 19:04:230181デフォルトの名無しさん
2009/03/06(金) 19:47:29【初心者歓迎】C/C++室 Ver.64【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1234193151/l50
0182デフォルトの名無しさん
2009/03/06(金) 20:00:59スレチでも答えてあげるのが優しさだと勘違いしてるのかもな
0183デフォルトの名無しさん
2009/03/06(金) 20:08:57スレチと突っぱねるのがカコイイと思ってるんだろな
0184デフォルトの名無しさん
2009/03/06(金) 20:12:580185デフォルトの名無しさん
2009/03/06(金) 20:53:57おまえの人生と同じでつまらん
0186デフォルトの名無しさん
2009/03/06(金) 22:19:040187デフォルトの名無しさん
2009/03/06(金) 22:23:100188デフォルトの名無しさん
2009/03/06(金) 22:26:44ラッパーを使う)書き直すことが出来るでしょうか?
0189デフォルトの名無しさん
2009/03/06(金) 22:29:400190デフォルトの名無しさん
2009/03/06(金) 22:30:37ポインタを使わないというのは関数を呼べないというのと同義で、
つまりライブラリ関数すら呼べないしAPIも勿論使えない。
入力にも出力にもアクセスすることができない。
0191デフォルトの名無しさん
2009/03/06(金) 22:36:50良いのでしょうか?
0192デフォルトの名無しさん
2009/03/06(金) 22:37:01CutIn(YOUMU, name, "", 0, 0, 0, 0);
SetLife(250000);
SetTimer(60);
SetScore(4000000);
LoadGraphic(imgBoss);
SetTexture(imgBoss);
TMain;
}
@MainLoop {
SetCollisionA(GetX, GetY, 32);
SetCollisionB(GetX, GetY, 16);
yield;
}
@DrawLoop {
DrawGraphic(GetX, GetY);
}
@Finalize {
DeleteGraphic(imgBoss);
}
// メインタスク
task TMain {
CreateShot01(GetX, GetY-150, 3, 90, AQUA32, 0);
yield;
setGraphicStop;
}
0193デフォルトの名無しさん
2009/03/06(金) 22:39:03初心者はとかくポインタを使いたがるけど、
配列の方がわかりやすい箇所は配列を使うべき
0194デフォルトの名無しさん
2009/03/06(金) 22:41:13↑のプログラムで
TMAINに飛ぶ → 括弧内の処理を終える → yieldに飛ぶ
となるのか。
TMAINに飛ぶ → 処理の途中でyieldに飛ぶ → MainLoop内の処理をする → Tmainの中のyieldの下からまた処理をする
となるのか、よくわかりません
どっちですか?
0195デフォルトの名無しさん
2009/03/06(金) 22:43:400196デフォルトの名無しさん
2009/03/06(金) 22:45:440197デフォルトの名無しさん
2009/03/06(金) 22:57:37おそらく、おまえさんの言っている「配列」のほとんどがポインタだよ
0198デフォルトの名無しさん
2009/03/07(土) 00:15:56これまでは特に気にしていなかったんですが、CPUのアーキテクチャによる?
0199デフォルトの名無しさん
2009/03/07(土) 00:17:09ちなみに私の環境はVC++2008、vistaです。(↓のコードはCです。include文は改行が多いと怒られたんで省略してます。)
void main()
{
int i = 1;
time_t t1, t2;
time(&t1); // t1に、表示前の秒数を格納
/* 適当に時間経過させる */
time(&t2); // t2に、表示後の秒数を格納
// printf("\ntime1=%ld time2=%ld\n",t1,t1);
printf("\ntime1=%ld ",t1);
printf("time2=%ld\n",t2);
printf("かかった時間は、%d秒です。\n", t2 - t1);
return;
}
0200デフォルトの名無しさん
2009/03/07(土) 00:20:500201デフォルトの名無しさん
2009/03/07(土) 00:21:23バス関係でのアライメントの話をしているのか
near far huge ポインタの話をしているのか
どっち?
0202デフォルトの名無しさん
2009/03/07(土) 00:27:42%ldが何型へのポインタを要求しているか考え直すこと
0203198
2009/03/07(土) 00:39:56そういえば、構造体のメンバーが意図的に4Byte単位でパディングされていたような気がします。
0204デフォルトの名無しさん
2009/03/07(土) 00:42:04>>202
time_tはunsigned long型なんで、%ldじゃないんですか?
これ自体は
ttp://www.kumei.ne.jp/c_lang/intro/no_13.htm
を写しているんですが。。。
あと、
printf("\ntime1=%ld time2=%ld\n",t1,t1);
は
printf("\ntime1=%ld time2=%ld\n",t1,t2);
の間違いです。すいません。
0205デフォルトの名無しさん
2009/03/07(土) 00:45:13×何型へのポインタ
○何型
Vistaのtime_tって本当にlongで32ビットか?
0206デフォルトの名無しさん
2009/03/07(土) 00:54:03あとvistaのtime_tは64ビットだったような
0207デフォルトの名無しさん
2009/03/07(土) 00:58:06VC2005から変更されてるはず
>_USE_32BIT_TIME_T が定義されている場合、time_t は長整数になります。定義されていない場合は、64 ビット整数になります。
%ld => %lld に直すのかな
0208デフォルトの名無しさん
2009/03/07(土) 01:00:26printf("\ntime1=%ld time2=%ld\n",t1,t2);
と
printf("\ntime1=%ld ",t1);
printf("time2=%ld\n",t2);
とでt2の表示値が違う。ということだよね。
下の表示ではtime2はそれらしい値が表示されるが、上の表示ではtime2=0となる。
printfの問題だろう。もう一度確認してみ。
0209デフォルトの名無しさん
2009/03/07(土) 01:01:19決めてかかってはいけないってこった
0210デフォルトの名無しさん
2009/03/07(土) 01:03:35printf("\ntime1=%ld time2=%ld\n",t1,t2);
のtime2はt1の上位32ビット(=0)が表示されてしまう
ということか。
0211デフォルトの名無しさん
2009/03/07(土) 01:04:080212デフォルトの名無しさん
2009/03/07(土) 01:05:07printf("%lld\n", (long long) t1);
そうでないならこれでも事が足りる。
printf("%d\n", (int) t1);
0213デフォルトの名無しさん
2009/03/07(土) 01:07:21標準関数にdifftime()がある。こいつは戻り値がdoubleだ。つまり、こうなる。
printf("%g\n", difftime(t2, t1));
0214デフォルトの名無しさん
2009/03/07(土) 01:08:10それ以外の環境では特に鵜呑みにしてはいけない
0215198
2009/03/07(土) 01:10:39ポインタで検索していたので見つかりませんでした。
解決しました。ペコリ
http://www.yokogawa-digital.com/arm/support/faq/index.php?RDS-F-08
※一部抜粋
◆アライメントされていないポインタ◆
コンパイラがより効果的なコード展開を行うために、
ARMコンパイラは通常の'C'のポインタがメモリ中でアライメントされたワードをポイントしていると想定します。
例えば、もしポインタ'int *'が1ワードの読み出しを行うとき、ARMコンパイラは命令生成時にLDR命令を使用します。
アドレスが4の倍数(つまり、ワードバウンダリ)であるとき、これは期待通りに動作します。
しかしながらもしアドレスが4の倍数でない場合、LDRは通常のアライメントされていないワードのロードイメージではなく、ローテートされた結果を返します。
実際のローテートされた結果はシステムのオフセットとエンディアンに依存します。
例えば、ポインタのロード開始アドレスが 0x8006の場合、0x8006, 0x8007, 0x8008, 0x8009の中身が結果として期待されることが予想されます。
しかし、ARMにおいてはこのようなアクセスは 0x8004, 0x8005, 0x8006, 0x8007の内容をローテートさせた結果をロードします。
(怖いっス)
0216199
2009/03/07(土) 01:12:36本に書いてあったんでlongだとばかり思ってました。
sizeof関数とtime.hで調べたらunsignedの64bitでした。すいません。
そして64bit整数のときの表示の仕方もわからなかったんですごく助かりました。ありがとうございます!
0217デフォルトの名無しさん
2009/03/07(土) 01:18:03>212-213辺りにも注目。
>>215
int *へのshort *の代入についての問題では、バスエラーを起こす場合もあるので要注意。
要は、そんな代入はするなと言うことで。
0218デフォルトの名無しさん
2009/03/07(土) 01:23:49そのとおり
time_tは規格上は算術型(整数型とは限らない)と定義されているけど
time_t同士を直接演算した結果が時間表現として意味のあるものである保証はない
>>216
本当にunsigned?エラー値とかどーすんだろー
0219デフォルトの名無しさん
2009/03/07(土) 01:26:210220デフォルトの名無しさん
2009/03/07(土) 01:26:360221デフォルトの名無しさん
2009/03/07(土) 01:31:51いちいちキャストつけなきゃならないのは面倒くさいがまあ規格に従うなら仕方ないか
0222デフォルトの名無しさん
2009/03/07(土) 01:34:260223199
2009/03/07(土) 02:19:11fprintf(fp, "%s", '\n');
と書くべきところを
fprintf(fp, "&s", '\n');
とかいて実行してしまいました。
それに気づいて変更してもう一度実行してみたのですが、
エラーが出てしまいファイル書き込みが行えなくなってしまいました。
結構致命的なことをやってしまったんでしょうか?
Cはなにかと破壊してそうなイメージがあるんで怖いんですが。。。
わかる方お願いします。
0224デフォルトの名無しさん
2009/03/07(土) 02:23:28そのfprintf(fp, "&s", '\n')は問題のないコードだ。
寧ろ、fprintf(fp, "%s", '\n')は大問題だが。
0225デフォルトの名無しさん
2009/03/07(土) 02:24:190226デフォルトの名無しさん
2009/03/07(土) 02:32:400227デフォルトの名無しさん
2009/03/07(土) 02:36:52> エラーが出てしまいファイル書き込みが行えなくなってしまいました。
エラーの詳細を教えてもらわないと答えようがない。
0228199
2009/03/07(土) 02:46:59ありがとうございます。
よくみたら%sじゃなくて%cですね。
C言語に怖いイメージがあるんで、ついエラーが出ると焦ってしまって。
しょうもないミスですいません。
0229デフォルトの名無しさん
2009/03/07(土) 02:49:03PCデバイスのマイクから録音したものを
そのままスピーカから再生する
というサンプルソースが置かれているサイトなどありませんでしょうか?
マイクからの録音 や waveファイルの再生
の個々について扱っているサイトはいくつか見つかったのですが、
複合となるとよく分からなくなってしまいます。
例えば waveIn*** 関数の引数である WAVEHDR と
waveOut*** 関数の引数である WAVEHDR は同じもので良いのか(もしくは同じでは駄目/なくては駄目)
など、分からない事が多く、上手く実装できない状態です。
よろしくお願いします。
0230デフォルトの名無しさん
2009/03/07(土) 02:51:01C言語は怖くないですよw最悪、プログラムが落ちることぐらいです。
ファイルを消したらアレだけど、ファイルを消すならVBでもできるし。
0231デフォルトの名無しさん
2009/03/07(土) 02:51:43なんどめだ
帰れ
0232デフォルトの名無しさん
2009/03/07(土) 02:52:40Win32API質問箱 Build77
http://pc11.2ch.net/test/read.cgi/tech/1235494464/
0233229
2009/03/07(土) 02:55:01先入観のみで語らないで下さい。恥ずかしい方ですね。
このスレには数ヶ月ぶりの書き込みで、内容で言えば初めてです。
>>232
誘導ありがとうございます。
0234デフォルトの名無しさん
2009/03/07(土) 05:43:44いいから二度とくんな
0235デフォルトの名無しさん
2009/03/07(土) 05:50:36死ね
ちなみに私は229ではありません
0236デフォルトの名無しさん
2009/03/07(土) 05:56:57そういう事しか書けないお前が来るなよ
0237デフォルトの名無しさん
2009/03/07(土) 06:49:400238デフォルトの名無しさん
2009/03/07(土) 07:50:21人に死ねなんて言えるおまえが死ねよ。
どうせそんな時間に書き込んでるんだから、
誰も困らないぞ?
0239デフォルトの名無しさん
2009/03/07(土) 08:10:200240デフォルトの名無しさん
2009/03/07(土) 09:52:270241デフォルトの名無しさん
2009/03/07(土) 10:00:390242デフォルトの名無しさん
2009/03/07(土) 10:04:17最近某スレでそういうのを書いた覚えがある身としては
使い捨てコードなら別にいいんじゃないかと答えてみたり
0243デフォルトの名無しさん
2009/03/07(土) 10:09:23>>242
そうか。
ありがと。
0244梅
2009/03/07(土) 10:23:41初心者の初心者ですが、C言語を始めて5つ目の問題で早々につまづいてしまいました。
下記プログラムは教科書どおりに入力しているのですが(メモ帳使用)、
何度やってもコンパイルエラーが出てしまいます。
エラーは「W8065」が出てきます。
(使用コンパイラは、borland5.5、出力はコマンドプロンプトです)
基本的な入力方法が間違っているのか、手持ちの参考書やWebサイトで調べても間違いが
わかりません。
プログラムに熟練の皆様、何かご教授いただけると有難く思います。
↓↓↓↓↓↓↓ココカラ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#include < stdio.h >
int main( void )
{
int no;
no = 75;
printf( "noの値は%dです。\n" , no );
return( 0 );
}
↑↑↑↑↑↑↑↑ココマデ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
0245デフォルトの名無しさん
2009/03/07(土) 10:26:52#include<>
の<>内はファイル名だから勝手にスペースを追加してはいけない
0246デフォルトの名無しさん
2009/03/07(土) 10:28:16そんなマイナーなコンパイラのエラーの番号なんて誰も覚えちゃいないから
エラー番号じゃなくてメッセージを貼れよ。
0247デフォルトの名無しさん
2009/03/07(土) 10:52:32どう判断した?
警告じゃないのか?
0248デフォルトの名無しさん
2009/03/07(土) 10:52:450249デフォルトの名無しさん
2009/03/07(土) 10:53:330250梅
2009/03/07(土) 10:57:25>245さん
ありがとうございます。
おっしゃるとおりでした。助かりました。
こんな間違いに気づかず悶々と悩んでた自分が恥ずかしいです。
>246さん
はっ!ご指摘ありがごうとざいます。失礼しました。
「W8065」のエラー内容は、
「プロタイプ宣言のない関数'printf'の呼び出し(関数 main)」
でした。
0251デフォルトの名無しさん
2009/03/07(土) 12:34:26へぇ*10
入れたことないので知らなかった
0252デフォルトの名無しさん
2009/03/07(土) 14:02:500253デフォルトの名無しさん
2009/03/07(土) 14:13:46double root(int num, int deapth)
{
double ret = 0.0;
double unit = 1.0;
int d;
for(d = 0; d < deapth; ret += unit) {
/* ぴったりですけど */
if(num == SQPOW(ret)) break;
/* 越えたんですけど */
if(num < SQPOW(ret)) {
ret -= unit; /* 一個前なんですけど */
unit /= 10.0; /* 位変えるんですけど */
d++;
}
}
return ret;
}
を作りましたが、root(5, 100)とすると
フリーズしてしまいます。どうすればいいでしょうか?
0254デフォルトの名無しさん
2009/03/07(土) 14:19:23#define SQPOW(n) n*nです。
0255デフォルトの名無しさん
2009/03/07(土) 14:29:39恐らく、ret*retがどんぴしゃで整数にならずに脱出できなくなっていると思われる。
あんたのコンパイラは、実数値の等値性に関する警告は出ないのか?
0256デフォルトの名無しさん
2009/03/07(土) 14:42:13doubleで平方根を100桁調べようとか、ありえないから。
0257デフォルトの名無しさん
2009/03/07(土) 14:49:53実際に動かしてみたけど、ret = 2.2360679774997889, unit = 1e-016になって、
このとき、ret += unitしても、retの値が変化せず無限ループに陥っていた。
0258デフォルトの名無しさん
2009/03/07(土) 15:18:130259デフォルトの名無しさん
2009/03/07(土) 15:21:30C言語でも多倍長ライブラリとかあるよ
0260デフォルトの名無しさん
2009/03/07(土) 17:59:45>>257見てそれだと思い
ret -= unit;
limitter = temp = root;
unit *= 0.1;
limitter += unit;
if(limitter == temp) break;
ってやったらできました。ありがとうございました。
0261260
2009/03/07(土) 18:00:190262デフォルトの名無しさん
2009/03/07(土) 19:21:53いろんなポインタがありますが、サイズはみんな共通して32ビットって本当ですか?char型ポインタでもDWORD型ポインタもサイズ同じ?
0263デフォルトの名無しさん
2009/03/07(土) 19:26:0832bit OSなら32bit、64bit OSなら64bitという具合です。
同一プラットフォーム/アーキテクチャなら同じと思っていいですが、関数ポインタだけは例外です。
0264デフォルトの名無しさん
2009/03/07(土) 19:33:07今16bitの開発はどうやってるんだろう
0265デフォルトの名無しさん
2009/03/07(土) 19:37:16いまこれ書いてる俺の PC ではポインタが 32bit だったり 64bit だったりするし、
関数ポインタだけでなく const ポインタもビット数が違う環境もある
0266デフォルトの名無しさん
2009/03/07(土) 19:43:10ROM化ならリテラル用のセクション構文用意すれば済む話じゃないか
0267デフォルトの名無しさん
2009/03/07(土) 21:28:220268デフォルトの名無しさん
2009/03/07(土) 23:02:48配列変数もconstだよね
265 仕様で c言語って成り立たなくね?
0269デフォルトの名無しさん
2009/03/07(土) 23:07:25違います
0270デフォルトの名無しさん
2009/03/07(土) 23:12:52{
(o ? o : &default_quoting_options)->style = s;
}
この判定文の意味がわかりませぬ
0271デフォルトの名無しさん
2009/03/07(土) 23:16:350と比較した結果が等しくなければ条件成立で
そうでなければ不成立になる
ポインタを0と比較すると0がヌルポインタに変換されるため
条件式にポインタを与えるとポインタがヌルポインタでなければ条件成立で
そうでなければ不成立になる
?:演算子の意味がわからないなら教科書を読み直すこと
0272デフォルトの名無しさん
2009/03/07(土) 23:24:400273デフォルトの名無しさん
2009/03/07(土) 23:29:05oがnullじゃなかったらo->styleにsを代入。
oがnullだったらdefault_quoting_options.styleにsを代入
0274デフォルトの名無しさん
2009/03/08(日) 00:31:13ワードマシンだとchar*/void*だけ大きさが違うとは聞く。
そもそもワードマシン自体、伝説と化しているけど。
0275デフォルトの名無しさん
2009/03/08(日) 00:55:320276デフォルトの名無しさん
2009/03/08(日) 00:59:030277デフォルトの名無しさん
2009/03/08(日) 01:03:59と規定されているでしょうか?
また(int)(void*)0!=(int)0となる処理系はあるでしょうか?
0278デフォルトの名無しさん
2009/03/08(日) 01:06:58>規定
意味が判らない
>となる
ないよ
元がどんな値でも(int)とキャストした時点でintのとりうる値に削られる
0279デフォルトの名無しさん
2009/03/08(日) 01:15:55qあwせdrftgyふじこlp;@:
0280デフォルトの名無しさん
2009/03/08(日) 01:50:25規定=規約だろ
0281デフォルトの名無しさん
2009/03/08(日) 02:03:230282デフォルトの名無しさん
2009/03/08(日) 02:14:39たぶん、ここを3回くらい読み返せば解決するだろう。
http://www.kouno.jp/home/c_faq/c5.html
0283デフォルトの名無しさん
2009/03/08(日) 02:25:36規約されていない。(int*)0がフルアクセス可能なintポインタ値な
場合がありえる。
後半の質問については恐らく無いが、あっても問題無い。
参考:http://www.kouno.jp/home/c_faq/c5.html
0284デフォルトの名無しさん
2009/03/08(日) 04:52:11ポインタを整数にキャストできるのは、
整数の大きさがポインタよりも大きい場合に限らる。
しかし、空ポインタを整数にキャストしても0になるとは限らない。
整数をポインタにキャストできるのは、
1. 整数が定数の0である場合
2. ポインタを整数にキャストしたものを元に戻す場合
に限られる。
前者は空ポインタ定数を生成し、
後者では元と同じポインタに戻ることが保証されている。
これら以外の変換は定義されない。
0285デフォルトの名無しさん
2009/03/08(日) 05:30:45キャストと変換を混同すな
0286デフォルトの名無しさん
2009/03/08(日) 05:35:320287デフォルトの名無しさん
2009/03/08(日) 05:46:24p = 0; /* 変換 */
p = (void *)0; /* キャスト */
0288デフォルトの名無しさん
2009/03/08(日) 06:24:02質問者は正解が欲しければ規格スレに行った方がいい
0289デフォルトの名無しさん
2009/03/08(日) 06:24:56正解頼む
0290デフォルトの名無しさん
2009/03/08(日) 06:38:07> C言語において0のポインタ値へのキャストは常にヌルポインタである
> と規定されているでしょうか?
整数定数0をポインタ型にキャストすればヌルポインタになる。
その他の場所から整数0を持ってきてキャストしてもヌルになる保証はないし、
そもそもキャストできる保証もない。
> また(int)(void*)0!=(int)0となる処理系はあるでしょうか?
(void*)から(int)にキャストできない場合があるし、
仮に出来たとしても0にならないかもしれない。
>>283
> 規約されていない。(int*)0がフルアクセス可能なintポインタ値な
> 場合がありえる。
(int*)0はヌルポインタ。
>>284
最後の行が間違ってる(>>285)。
0291デフォルトの名無しさん
2009/03/08(日) 07:03:170292デフォルトの名無しさん
2009/03/08(日) 09:17:10初歩から勉強しなおせ
0293デフォルトの名無しさん
2009/03/08(日) 10:20:36(void*)0はヌルポインターだけど、ヌルポインターをintにキャストしたものが
0になることは保証されていない(処理系定義)ということじゃないかな。
>>290さんの言いっていることが正しい。
> C言語において0のポインタ値へのキャストは常にヌルポインタである
> と規定されているでしょうか?
JISX3010 6.3.2.3 ポインタ から
値0をもつ整数定数式又はその定数式を型void *にキャストした式を、空ポインタ定数
(null pointer constant)と呼び、いかなるオブジェクト又は関数へのポインターと
比較しても等しくないことを保証する。
> また(int)(void*)0!=(int)0となる処理系はあるでしょうか?
JISX3010 6.3.2.3 ポインタ から
任意のポインタ型は整数型に型変換できる。これまでに規定されている場合を除き、
結果は処理系定義とする。結果が整数型で表現できなければ、その動作は未定義とする。
結果はなんらかの整数型の範囲に含まれているとは限らない。
0294デフォルトの名無しさん
2009/03/08(日) 11:26:54まぁ・・・がんばってみるか。
0295デフォルトの名無しさん
2009/03/08(日) 11:32:33> 結果は処理系定義とする。結果が整数型で表現できなければ、その動作は未定義とする。
> 結果はなんらかの整数型の範囲に含まれているとは限らない。
勉強になるなぁ。
0296デフォルトの名無しさん
2009/03/08(日) 12:54:43向上心は大事な必要条件の一つ。
15歳で興味を持ったなら俺より素質あるよw
0297デフォルトの名無しさん
2009/03/08(日) 13:20:410298デフォルトの名無しさん
2009/03/08(日) 13:34:550299デフォルトの名無しさん
2009/03/08(日) 14:17:10エラー E2291 youbi.c 11: } が必要(関数 main )
エラー E2141 youbi.c 11: 宣言の構文エラー(関数 main )
エラー E2139 youbi.c 11: 宣言に ; がない(関数 main )
警告 W8070 youbi.c 11: 関数は値を返すべき(関数 main )
警告 W8004 youbi.c 11: 'youc' に代入した値は使われていない(関数 main )
警告 W8004 youbi.c 11: 'youi' に代入した値は使われていない(関数 main )
警告 W8004 youbi.c 11: 'hiniti' に代入した値は使われていない(関数 main )
エラー E2190 youbi.c 11: 不要な }
エラー E2040 youbi.c 11: 宣言が正しく終了していない
エラー E2293 youbi.c 13: ) が必要
エラー E2293 youbi.c 14: ) が必要
エラー E2293 youbi.c 15: ) が必要
エラー E2303 youbi.c 16: 型名が必要
エラー E2451 youbi.c 16: 未定義のシンボル hiniti
エラー E2293 youbi.c 17: ) が必要
エラー E2040 youbi.c 18: 宣言が正しく終了していない
エラー E2190 youbi.c 19: 不要な }
*** 13 errors in Compile ***
↑のようなエラーが出ます。
どこを直せばよいでしょうか?
ソース↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8954.txt
0300デフォルトの名無しさん
2009/03/08(日) 14:26:20printf("%d日は%s曜日です。\n",hiniti,youc[youi]);
0302デフォルトの名無しさん
2009/03/08(日) 14:36:33文字の間にあったスペース?
0303299
2009/03/08(日) 14:39:40char youc[]={"月",■"火",■"水",■"木",■"金",■"土",■"日"}, note[3]={,0};
はい、今黒い四角になっている部分です。
0304デフォルトの名無しさん
2009/03/08(日) 14:41:510305デフォルトの名無しさん
2009/03/08(日) 14:42:48コーディングスタイルとしては、個人的にはあったほうがいいと思う。
他のところでも、
#include■<stdio.h>
int main(void)■{
int hiniti■=■0, youi■=■0;
youi■=■hiniti■%■7;
fgets(note,■2,■stdin);
とする。個人的に。
0307299
2009/03/08(日) 15:01:29http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8955.txt
表示をいったん止めるために
fgetsを2段重ねて使っているのですが、
こういう使い方をしても大丈夫なのでしょうか?
0308デフォルトの名無しさん
2009/03/08(日) 15:06:16あくまで習作としてならだけど
0309デフォルトの名無しさん
2009/03/08(日) 15:07:10Cの仕様上はまったく問題ない
インタフェースとしてはあまりスマートではないが、まだ君が気にする必要はない
0310デフォルトの名無しさん
2009/03/08(日) 16:51:37出来なくても、それが実力なんだからそのままにしとけ
0311デフォルトの名無しさん
2009/03/08(日) 18:29:510312デフォルトの名無しさん
2009/03/08(日) 18:38:451つはサウンドバッファ書き込み用のCALLBACK関数で、
もう一つはMAINスレッドにあるリードルーチン。
MAINスレッドにあるリードルーチンをある条件時に寝かせ、
CALLBACK関数側から寝てる状態を起こしたい処理なのですが、
何か良い方法ありますでしょうか?
sigwait()を使ってできそうなんだが、通常処理なので
signalは使いたくないのです。よろしくお願いします。
0313デフォルトの名無しさん
2009/03/08(日) 18:55:57標準 C にスレッドサポートはない
環境依存スレで聞いてはどうだ
0314デフォルトの名無しさん
2009/03/08(日) 19:34:270315デフォルトの名無しさん
2009/03/09(月) 12:36:5616進数1EB→10進数491にして491を取得したいのですがどう記述すればよろしい
のでしょうか?
ご教授よろしくお願いします
0316デフォルトの名無しさん
2009/03/09(月) 12:43:16もしバイナリなら、エンディアン気にして入れ替えるかキャストで。
socket.hの関数使ってもいいけど
0317デフォルトの名無しさん
2009/03/09(月) 12:43:26printf("%d\n", 1 * 0x100 + 0xeb);
0318315
2009/03/09(月) 13:06:01具体的にはこのようなことをしたいです
数値変換のほかに文字列への変換も行いたいです
バイナリ→数値の変換
byte hoge[] = {0x00,0x00,0x01,0xeb};
int temp;
〜処理〜
temp→491
UTF8のバイナリ→文字列への変換
byte hoge2[] = {0xE3,0x81,0x8A};
char temp3[1024];
〜処理〜
temp3→お
よろしくお願い致します
0319デフォルトの名無しさん
2009/03/09(月) 13:26:42temp = ((hoge[0] * 0x100 + hoge[1]) * 0x100 + hoge[2]) * 0x100 + hoge[3];
memcpy(temp3, hoge2, sizeof(hoge2));
temp3[sizeof(hoge2)] = '\0';
0320デフォルトの名無しさん
2009/03/09(月) 13:41:57temp = *(int*)hoge;
リトルエンディアンなら
temp = hoge[0] << 24 | hoge[1] << 16 | hoge[2] << 8 | hoge[3];
文字列ってのは具体的に文字コード何?
0321デフォルトの名無しさん
2009/03/09(月) 13:43:30CPUとhogeのアライメントによっては落ちる素敵コードですね。
0322デフォルトの名無しさん
2009/03/09(月) 13:44:310323デフォルトの名無しさん
2009/03/09(月) 13:51:13そういうときは環境に依存しないコードを書くもんだ
0324デフォルトの名無しさん
2009/03/09(月) 14:09:050326デフォルトの名無しさん
2009/03/10(火) 00:55:02ポインタ同士の比較って使ってもよいのでしょうか?
ある位置(終了位置)を超えたら最初(開始位置)に戻るというのを考えています。
現在++;
if(現在 > 終了){
現在 = 開始;
}
0327デフォルトの名無しさん
2009/03/10(火) 00:57:28要するに配列とかmalloc()した領域を指しているなら、
比較しても問題ない
0328デフォルトの名無しさん
2009/03/10(火) 01:10:42領域は開始位置(配列の頭)から終了位置(配列の最後)までで、
++またはーーして、この領域間を出たときの判定なのですが、
「領域を出たとき」というのはまずいでしょうか?
0329デフォルトの名無しさん
2009/03/10(火) 01:47:290330デフォルトの名無しさん
2009/03/10(火) 01:51:490331デフォルトの名無しさん
2009/03/10(火) 02:09:570332デフォルトの名無しさん
2009/03/10(火) 03:03:12struct pixels{
unsigned int record_number;
unsigned short record_length;
};
int main(void){
printf("unsigned int: %d unsigned short: %d\n",sizeof(unsigned int),sizeof(unsigned short));
printf("pixels size : %d\n",sizeof(struct pixels));
return 0;
}
構造体pixelのサイズが6バイトにならないのはなぜなんでしょう?
intが4バイト、shortが2バイトなのに・・・。
環境はXP(32bit)、VisualStudio2005です。
0333デフォルトの名無しさん
2009/03/10(火) 03:05:51構造体を二つ並べたときに、intが4byte境界にこなくなるから。
0334デフォルトの名無しさん
2009/03/10(火) 03:06:09境界調整とかアライメントで検索
0335デフォルトの名無しさん
2009/03/10(火) 03:14:43ありがとう、勉強してみます。
0336デフォルトの名無しさん
2009/03/10(火) 03:17:53int が抽斗で中には 仕切り板でパンツ4ヶ入れれる様になってるんだ (32bit int仕様の抽斗な)
int の抽斗2個付いてるのが struct pixelsな訳だ
余ってる仕切り2個に詰め込んでタンスの設置面積を節約する事も出来るが
どこに入れたか都度2個ズラし云々で抽斗と仮想箪笥の対応を数えなきゃいけないのは面倒だろう?
0337デフォルトの名無しさん
2009/03/10(火) 03:36:52たしかに、32bitで探すのが得意な人が16bitずつ探すのは面倒かもしれません。
こいういった細かい仕様(?)も、もっと色んな参考書を読んで勉強してみます。
0338デフォルトの名無しさん
2009/03/10(火) 03:58:34言語の本とかにはあまり載ってない気がする
WindowsならAdvanced Windowsにそこそこ詳しく書いてあるよ
0339デフォルトの名無しさん
2009/03/10(火) 04:04:20情報ありがと、書店でみてくるよ!
0340デフォルトの名無しさん
2009/03/10(火) 05:20:02昔のモトローラのCPUは奇数番地をアクセスしただけでバスエラーがでたな。
int *p = (int *)1;
*p; <- ここでバスエラー
0341デフォルトの名無しさん
2009/03/10(火) 10:40:180342デフォルトの名無しさん
2009/03/10(火) 12:45:26x86: 例外が発生するがOSが握りつぶす
x64: 例外を発生させない
IPF: 例外が発生、アプリで処理しないと落ちる
http://msdn.microsoft.com/en-us/library/aa290049.aspx#ia64alignment_topic4
0343デフォルトの名無しさん
2009/03/10(火) 13:39:42MSDNでも、the operating system does not make the alignment fault visible to the application.だし
疑うならパフォーマンスモニタのsystemにミスアラインメント例外をチェックするところあるから見てみな
0344デフォルトの名無しさん
2009/03/10(火) 14:09:050345デフォルトの名無しさん
2009/03/10(火) 14:09:55>the operating system does not make the alignment fault visible to the application
の記述から、OS自身がアプリから隠蔽する、と読んでた
x64との記述の差異もあるように見えたので
パフォーマンスモニタは見てみる
0346デフォルトの名無しさん
2009/03/10(火) 14:26:460347デフォルトの名無しさん
2009/03/10(火) 16:02:20具体的に言うと「A」を「'A'」にしたいんだが。
0348デフォルトの名無しさん
2009/03/10(火) 16:11:040349デフォルトの名無しさん
2009/03/10(火) 16:12:14なら、
str[0] が 'A'
0350デフォルトの名無しさん
2009/03/10(火) 16:23:350351デフォルトの名無しさん
2009/03/10(火) 16:26:300352デフォルトの名無しさん
2009/03/10(火) 16:27:590353デフォルトの名無しさん
2009/03/10(火) 16:43:38あのコンピュータのCPUは32ビットだ。
といった感じですか?
メモリはよくそういう言い方しますけど、
CPUにもあったということですか?
例えば、僕のPCは
プロセッサ:Intel(R) Core(TM)2 Duo CPU E8300 @2.83GHz 2.83GHz
メモリ(RAM):4.00GB
システムの種類:32ビット オペレーティングシステム
となってますが、
CPUの単位はHzですよね?
それならなぜ
プロセッサ:32bit
メモリ:XXXXXbit
みたいに言わないんですか?
揃ってた方が分かり易いと思うんですけど・・・。
0354デフォルトの名無しさん
2009/03/10(火) 16:45:310355デフォルトの名無しさん
2009/03/10(火) 16:45:380356デフォルトの名無しさん
2009/03/10(火) 16:47:40Core2Duoは動作モードで16bitにも32bitにも64bitbにもなる(OSがモードを決める)
って板違いだな
0357デフォルトの名無しさん
2009/03/10(火) 16:51:15ならねーよ
0358デフォルトの名無しさん
2009/03/10(火) 16:57:42確かに板違いですね。
ともかく僕のPCでintを宣言すると32bitになるってことですよね?
0359デフォルトの名無しさん
2009/03/10(火) 17:16:470360デフォルトの名無しさん
2009/03/10(火) 18:09:540361デフォルトの名無しさん
2009/03/11(水) 00:53:32で、ヘッダファイルに以下のように記述したところ
コンパイルエラーが出ました。
記述しているのはファイルの10行目です。
typedef enum {FALSE, TRUE} Boolean;
エラー内容
sub.h(10) : error C2143: 構文エラー : '}' が '定数' の前にありません。
sub.h(10) : error C2143: 構文エラー : ';' が '}' の前にありません。
sub.h(10) : error C2059: 構文エラー : '}'
何が間違っているのでしょうか?
よろしくお願いします。
0362デフォルトの名無しさん
2009/03/11(水) 00:58:56たぶん、どっかに
#defnie FALSE 0
#defnie TRUE 1
と定義されている
0363デフォルトの名無しさん
2009/03/11(水) 01:04:26今更真偽値を自分で定義しようとしていること。
0365デフォルトの名無しさん
2009/03/11(水) 08:25:12などの変数の数値のあとにつける
’f’とか’e’ってなんていう意味があるんですか?
0366デフォルトの名無しさん
2009/03/11(水) 08:29:10float型
0367デフォルトの名無しさん
2009/03/11(水) 08:55:030368本日の名言
2009/03/11(水) 09:00:01今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
0369デフォルトの名無しさん
2009/03/11(水) 09:29:16367 名前:デフォルトの名無しさん 投稿日:2009/03/11(水) 08:55:03
今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
0370本日の名言 その2
2009/03/11(水) 10:00:45368 本日の名言[] 2009/03/11(水) 09:00:01
367 名前:デフォルトの名無しさん 投稿日:2009/03/11(水) 08:55:03
今どきfloatなんて精度も速度も低い変数を使う男の人って・・・
0371デフォルトの名無しさん
2009/03/11(水) 10:01:35ttp://www.valinux.co.jp/contents/tech/techlib/eos/linux64/linux64_014.html
0372デフォルトの名無しさん
2009/03/11(水) 10:11:43整数型以上の精度がどうしても必要なときは固定小数点ライブラリを
自分で書いて使う
0373デフォルトの名無しさん
2009/03/11(水) 10:17:08それでいいんじゃない。
0374デフォルトの名無しさん
2009/03/11(水) 10:26:09ならまだいいが
double b=1.0f
とか書かれてると何がしたいんじゃゴルァ!
とは思う
0375デフォルトの名無しさん
2009/03/11(水) 10:28:54小数点のある数値リテラルは何もつかないとdouble型なのでf(F)をつけてfloat型にしている
DirectXでは普通にfloatを使うよ
0376デフォルトの名無しさん
2009/03/11(水) 10:44:30言いたいことは分かるが、あんたの言う本物のプログラマの意味が曖昧。
必要最低限の制度があれば、あるいは使い方を守っていれば問題なし。
それを言い出すと、この世に完璧なプログラムはないため、本物のプログラマ
そのものが、あんたの価値観、世界観では存在しない。
0377デフォルトの名無しさん
2009/03/11(水) 10:46:070378デフォルトの名無しさん
2009/03/11(水) 10:49:13どれが適切か?について述べない卑怯者もいる。
>>372とか、本物のプログラマとか大きなことを言っておきながら
自分が本物のプログラマかどうかも示さないくせに。
どうせ、引きこもりだろ?
0379デフォルトの名無しさん
2009/03/11(水) 11:12:470380デフォルトの名無しさん
2009/03/11(水) 11:55:46c = '漢';
printf("%c", c);
とすると、
実行するたびに
<何も表示されない>
滑
と、交互に表示されるんですがどういうことですか?
0381デフォルトの名無しさん
2009/03/11(水) 11:59:25「漢」が多バイト文字なのに1バイトしか出力しないから、端末エミュレータが混乱している。
文字ではなく、文字列として扱えばよい。
0382デフォルトの名無しさん
2009/03/11(水) 12:00:200383デフォルトの名無しさん
2009/03/11(水) 12:03:15だからと言ってint c = '漢';としたところで巧い使い途があるわけでもないが。
従って、const char * c = "漢";とした上でprintf("%s", c);とすればいい。
0384デフォルトの名無しさん
2009/03/11(水) 12:16:02今Cやってるんですけど、
Cってややこしいですね。
単に漢字扱うだけなのに・・・。
今もこれが正しく動かず困ってます。
int main(void) {
int num;
int a;
printf("整数を入力してください:");
scanf("%d", num);
printf("何倍しますか?:");
scanf("%d", a);
printf("%d倍すると %d になります。", a, (a * num));
return 0;
}
表示
整数を入力してください:4
何倍しますか?:6
2147328000倍すると 271482880 になります。
初期化忘れかなと思って、最初に両方に0代入してやったら、
整数を入力してください:4
から操作不可能になった。
終わってる・・・・
0385デフォルトの名無しさん
2009/03/11(水) 12:18:52漢字以前の問題
0386デフォルトの名無しさん
2009/03/11(水) 12:20:06scanf("%d", &a);
入門書はちゃんと読もうね
0387デフォルトの名無しさん
2009/03/11(水) 12:22:20int main(void)
{
wchar_t c;
c = L'漢';
setlocale(LC_ALL, "japanese");
wprintf(L"%c", c);
}
こうすれば正しく動くんじゃないかな
0388デフォルトの名無しさん
2009/03/11(水) 12:24:31何か変なのついてた。
こうなると&つけてないのに一応動いたのが不思議。
0389デフォルトの名無しさん
2009/03/11(水) 12:40:10format系の可変引数関数は型チェックできないから間違ってても一応動く
0390デフォルトの名無しさん
2009/03/11(水) 12:40:43動くがそのまま続けると大変な事になる可能性が高い
0391デフォルトの名無しさん
2009/03/11(水) 12:55:47scanfは使っちゃ駄目だったり
この辺のテクニックが良くまとまった本とかサイトとかないですか?
0392デフォルトの名無しさん
2009/03/11(水) 13:03:49C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
0393デフォルトの名無しさん
2009/03/11(水) 13:06:45scanf()を使っちゃダメなんてことないよ。
エラー処理してくれないから数値入力のときに数字以外の文字を入れられたら厄介だとか、
型チェックしてくれないからプログラマが気をつけるか警告レベルを引き上げて参考にしないといけないとか、
文字列の場合はバッファオーバフローしないように文字数制限をしないといけないとか、
その辺りに気をつけて使えばいいだけだから。
0394デフォルトの名無しさん
2009/03/11(水) 13:13:080395デフォルトの名無しさん
2009/03/11(水) 13:18:21>393が指摘している以外にどんな問題が?
要は、これで充分使えると思うわけだが。
char buf[100];
scanf("%99s", buf);
空白も含めて入力したいのなら改行で分離するとしてこれでいいし。
scanf("%99[^\n]", buf);
まぁ、printf()みたいに%*sで文字数指定できたら(少しは)楽だったとは思うけどね。
0396デフォルトの名無しさん
2009/03/11(水) 13:36:26その通り、分かって使う人は問題ない
ときどき教科書丸暗記タイプの人がファビョるけど
あれは無視していい
初心者に使わせることは意見が別れるところか…
0397デフォルトの名無しさん
2009/03/11(水) 13:37:01半端な例だすなよカス
それじゃまだ問題があるだろ
0398デフォルトの名無しさん
2009/03/11(水) 13:47:06初心者って言葉を言い訳に使うな。プログラムを書く人間なら欠陥関数を使うな。以上。
0399デフォルトの名無しさん
2009/03/11(水) 14:04:45文字入力には何を使ってるの?
0400デフォルトの名無しさん
2009/03/11(水) 14:07:140401デフォルトの名無しさん
2009/03/11(水) 14:59:190402デフォルトの名無しさん
2009/03/11(水) 15:38:590403デフォルトの名無しさん
2009/03/11(水) 15:47:57自分は出来るみたいな、思い上がり
0404デフォルトの名無しさん
2009/03/11(水) 15:49:38知ったかぶりの意見ってのは、当てにならん。
0405デフォルトの名無しさん
2009/03/11(水) 15:54:57かわいそうだからこのへんにしとこうぜ
0406デフォルトの名無しさん
2009/03/11(水) 15:56:24それじゃ足りないよ、数値とかで
0407デフォルトの名無しさん
2009/03/11(水) 16:03:57改行を必要とする部分くらいだろう
0408デフォルトの名無しさん
2009/03/11(水) 17:42:33じゃないとあまりにも馬鹿すぎる・・・
0409デフォルトの名無しさん
2009/03/11(水) 17:44:22お前が馬鹿なのはよく分かった
0410デフォルトの名無しさん
2009/03/11(水) 17:45:190411401
2009/03/11(水) 17:56:21今更別人物だと言っても証明のしようがないけど。
0412デフォルトの名無しさん
2009/03/11(水) 18:00:300413デフォルトの名無しさん
2009/03/11(水) 18:01:53違うのなら問題ない
0414401
2009/03/11(水) 18:14:080415デフォルトの名無しさん
2009/03/11(水) 18:18:480416デフォルトの名無しさん
2009/03/11(水) 19:00:28SRでなんでもかんでも初期化するな。と言われた...なんでだ?(´・ω・`)
少々古いマシンだがUNIX上で動かすプログラムなんで初期化処理が処理を重くする要因になるとは思えんのだが...
何か理由に心当たりがある人教えてくださいまし。
0417デフォルトの名無しさん
2009/03/11(水) 19:08:39SRって何?
0418デフォルトの名無しさん
2009/03/11(水) 19:10:52あと、書き忘れたんですがオート変数の話です。
0419デフォルトの名無しさん
2009/03/11(水) 19:22:56カウンタや文字列を0で初期化してたり…
何か意図があるとき以外に初期化をすると、他に意味があるのかと思っちゃうし
0420デフォルトの名無しさん
2009/03/11(水) 19:23:060421デフォルトの名無しさん
2009/03/11(水) 19:24:240422デフォルトの名無しさん
2009/03/11(水) 19:25:25memset(buf, 0, 256); // 不必要な初期化
strcpy(buf, "hoge");
0423デフォルトの名無しさん
2009/03/11(水) 19:28:30まだこっちのほうがいい?
char buf[256] = {0};
0424デフォルトの名無しさん
2009/03/11(水) 19:29:42char buf[256]={0};
とかするとコンパイル後のコードでは memset になってたりするね
>>416
ごくわずかな可能性としてハードウェアに移植する可能性があるとか
FPGAとかだとお手軽だしw
0425416
2009/03/11(水) 19:42:49ちなみに言われたのは配列とかでなく、戻り値とかの
int rc = 0;
とかってのオート変数達です。
不定値は悪!という考えだったんで全部宣言と同時に初期化してました...
今から不要な初期化探して直すのか...めんどくせぇ。(ノД`)
貴重な意見ありがとうございました。
>424
いやぁ...そんな可能性微塵もありません。笑
0426デフォルトの名無しさん
2009/03/11(水) 19:49:36処理速度の低下はほとんどないだろうけど
可読性は多少落ちるかな
そんなソース見たら確かに「うぜっ」とは思うだろう
0427416
2009/03/11(水) 20:04:39組み込みやってた時に初期化初期化言われてて癖になったんですよ。
ポインタに限った話だったんかなぁ...
俺が書いたソース全オート変数宣言と同時に初期化してある。笑笑笑
0428デフォルトの名無しさん
2009/03/11(水) 20:13:10組み込みをやってから不必要な初期化がますます嫌いになった
0429デフォルトの名無しさん
2009/03/11(水) 20:16:12ハードウェアリセット後は一瞬でも存在して欲しくない
0430デフォルトの名無しさん
2009/03/11(水) 20:18:13余計面倒くさいか
0431デフォルトの名無しさん
2009/03/11(水) 20:24:56static char *p = NULL;
if (p) free(p);
動的変数は初期化しないと何のコードも追加されないけど
0で初期化すると
mov ebx, [addr]
xor eax
mov [ebx],eax
というようなコードが追加されるかもしらん
0432デフォルトの名無しさん
2009/03/11(水) 20:29:30リセット完了後がか?
0433デフォルトの名無しさん
2009/03/11(水) 20:37:51???
0434デフォルトの名無しさん
2009/03/11(水) 20:47:07int rc=0;
とすると
mov dword ptr [ebp-4],0
c7 45 fc 00 00 00 00
という7バイトのコードが追加された
0435デフォルトの名無しさん
2009/03/11(水) 21:11:07最適化を有効にするともう少しましなコードになると思うよ。
0代入を0クリアしたり、不要な初期化と判断されれば消し去られたり。
0436デフォルトの名無しさん
2009/03/11(水) 22:29:33世の中の流れなんて曖昧かつ恣意的に用いられる概念で語るべきではない
0437デフォルトの名無しさん
2009/03/11(水) 23:30:380438デフォルトの名無しさん
2009/03/12(木) 00:07:310439デフォルトの名無しさん
2009/03/12(木) 00:58:160440デフォルトの名無しさん
2009/03/12(木) 00:59:070441デフォルトの名無しさん
2009/03/12(木) 01:07:310442デフォルトの名無しさん
2009/03/12(木) 01:08:47あるか?
バグの直接の原因になることはよくあるが
0443デフォルトの名無しさん
2009/03/12(木) 01:13:180444デフォルトの名無しさん
2009/03/12(木) 01:14:400445デフォルトの名無しさん
2009/03/12(木) 01:18:40・必要ない初期化を宣言部で初期化して、そのままリターン値になって
抜けてくるコードなんて、見にくくてダメダメだと思うのだが?
0446デフォルトの名無しさん
2009/03/12(木) 01:22:050447デフォルトの名無しさん
2009/03/12(木) 01:26:03機能を記述するのに、広範囲になりすぎると思うが、
つまり、宣言部の初期化なんぞ期待しないで、
ある特定の範囲で、代入や演算を記述すると思います。
0448デフォルトの名無しさん
2009/03/12(木) 03:13:46もうちょっとわかりやすい日本語を話せ
0449デフォルトの名無しさん
2009/03/12(木) 03:47:300450デフォルトの名無しさん
2009/03/12(木) 08:03:11初期化しない事によって、不定な文字列が表示されて、
bugに気が付くって話は、聞いた事ある。
しかし体験した事はないな。
>>447
一般的な長さの関数なら、宣言部で初期化しても、
十分見渡せるだろう。
0451デフォルトの名無しさん
2009/03/12(木) 08:39:14逆だぞw
0452デフォルトの名無しさん
2009/03/12(木) 09:43:370453デフォルトの名無しさん
2009/03/12(木) 10:19:080454デフォルトの名無しさん
2009/03/12(木) 10:48:240455デフォルトの名無しさん
2009/03/12(木) 11:15:53フフフフがついたことがあったらしいけど
Releaseビルドでもフフフフで埋めるコンパイラがあるのかしらん
0456デフォルトの名無しさん
2009/03/12(木) 12:26:420457デフォルトの名無しさん
2009/03/12(木) 12:47:250458デフォルトの名無しさん
2009/03/12(木) 14:04:55スレ違いとか言ってる方は、レスろくに読んでないとおもわれ・・・
0459デフォルトの名無しさん
2009/03/12(木) 14:33:15伝聞で「あったらしい」なんて情報では掘り下げようがないぞ。
0460デフォルトの名無しさん
2009/03/12(木) 15:12:550461デフォルトの名無しさん
2009/03/12(木) 15:18:510462デフォルトの名無しさん
2009/03/12(木) 15:23:28Cは初期化されていない変数の中身になんか言及しないから
しかしそんなに長々引っ張ったわけでもないのにムキムキするほうもどうかしている
0463デフォルトの名無しさん
2009/03/12(木) 15:41:210464デフォルトの名無しさん
2009/03/12(木) 15:44:180465デフォルトの名無しさん
2009/03/12(木) 16:07:20全然違うものだった・・・
0466デフォルトの名無しさん
2009/03/12(木) 17:32:560467デフォルトの名無しさん
2009/03/12(木) 18:08:040468デフォルトの名無しさん
2009/03/13(金) 01:51:42こちらのサイト
ttp://www.kumei.ne.jp/c_lang/sdk/sdk_87.htm
を参考にしてVC++2005、SDKで書いています。
リンク先では 親ウィンドウ 子ウィンドウ それぞれにおいて
_beginthread(*,*,*) でスレッドを起動していますが、
子ウィンドウを作った時点で親ウィンドウと動作は分離できているのではないのでしょうか?
例えば 子ウィンドウのプロシージャ関数内で無限ループを回していても
親ウィンドウは自由に操作可能(例えばメニューを開くとか)ではないのでしょうか?
よろしくお願いします。
0469デフォルトの名無しさん
2009/03/13(金) 02:10:590470デフォルトの名無しさん
2009/03/13(金) 02:19:47_beginthreadを除いて記述した場合
子ウィンドウの WM_CREATE にすら入りませんでした。
そういうものなのか、もしくは私がどこか間違えているのか判断したく
正確にはどういう動作をするべきなのかをお聞きしに来た次第です。
よろしくお願いします。
0471デフォルトの名無しさん
2009/03/13(金) 02:33:45サンプルの構造
メインスレッド 親ウィンドウ("猫でもわかるマルチスレッド)、子ウィンドウ("子")
サブスレッド 親ウィンドウ上での描画
子ウィンドウは親ウィンドウと同じメインスレッドで動作しますから、
子ウィンドウのプロシージャで無限ループをしたら、親と子のウィンドウの
メッセージループが走らなくなり、両ウィンドウはブロックされます。
0472デフォルトの名無しさん
2009/03/13(金) 02:41:42ありがとうございます。
現在、親スレッドにおいて メッセージ(msg) が大量に送られてくるアプリケーションを
作っておりまして、メッセージが送られて来る間は処理量が多く、
メニュー操作などができなくなってしまっています。
そこで、子ウィンドウを作って子ウィンドウ内でメッセージを受け、
親ウィンドウでメニュー操作をする、 と考えていたのですが
結局メインスレッド上でメッセージを受けて処理する事になるのですね。
何か良い策はありませんでしょうか?
0473デフォルトの名無しさん
2009/03/13(金) 03:17:14ウィンドウを持つサブスレッドを作って、そのサブスレッドが処理すればよいのでは。
メッセージ送信をサブスレッドのウィンドウ宛てにしてもよいし、
それができなければ、親が受け取ったメッセージをサブスレッドのウィンドウにPostMessage
してもいい。
いちばん簡単なのは、メッセージを受けとった時にサブスレッドを生成し、処理をサブスレッドに
任せるというもの。
実現方法はいろいろあります。
0474デフォルトの名無しさん
2009/03/13(金) 03:29:38試行錯誤して「メッセージを受け取った時にサブスレッドを生成し〜」
までたどり着けました。
が、他にもまだまだ方法はあるのですね。
現在の知識では「ウィンドウを持つサブスレッド」は見当が付かないので
最後に提示していただいた方法で実装してみます。
夜分にありがとうございました。
0475デフォルトの名無しさん
2009/03/13(金) 04:53:410476デフォルトの名無しさん
2009/03/13(金) 13:40:53マルチスレッドプログラミングもあんたの見ていたサイトもWinAPIもC/C++初心者向けもスレがある。
あんたが書いているのがCなら必ずしもスレ違いではないが、ここで聞くのは余り適当とは言えないぞ。
0477デフォルトの名無しさん
2009/03/13(金) 15:25:380478デフォルトの名無しさん
2009/03/13(金) 15:44:380479デフォルトの名無しさん
2009/03/13(金) 16:04:100480デフォルトの名無しさん
2009/03/13(金) 16:36:090481デフォルトの名無しさん
2009/03/13(金) 17:02:52マルチの煩雑さから開放されるメリットもある
0482デフォルトの名無しさん
2009/03/13(金) 17:45:34>>478 もそういう感触なんじゃないか?
それに、避けようがない局面もあるし (特にDBや
外部とのI/Fが絡むとな)。
0483デフォルトの名無しさん
2009/03/13(金) 17:53:21わざわざ自前スレッドでラップしたりシステムのスレッド避けたりするのは
「逃げ」って言うより「苦行」と観るが
0484デフォルトの名無しさん
2009/03/13(金) 18:52:57>スレッドやタスクを利用する反応
すまん。意味判らん。
>システムのスレッド避けたり
すまん。意味判らん。
つか、>>482 であげた「避けようがない局面」てのは
スレッドがブロックして全体のスループットが下がってしまう
状況を言ってるんだが。
…そろそろスレ違いだと怒られる予感。
0485デフォルトの名無しさん
2009/03/13(金) 20:29:440486デフォルトの名無しさん
2009/03/13(金) 20:43:18失せろ
0487デフォルトの名無しさん
2009/03/13(金) 21:02:57矢せろ
0488デフォルトの名無しさん
2009/03/13(金) 21:07:14なぜここで聞く?
0489デフォルトの名無しさん
2009/03/13(金) 21:17:55よってこのスレではまともな答えはかえってこない
C信者は意外と心が狭いから注意するように
0490デフォルトの名無しさん
2009/03/13(金) 22:50:37Cだって正規表現ライブラリ関数が使えるし
exprみたいにそれ使ってるメジャーなコマンドもある
0491デフォルトの名無しさん
2009/03/13(金) 22:52:51標準ライブラリに含まれてなかったら使えるとは言えない
0492デフォルトの名無しさん
2009/03/13(金) 23:36:57待ってる。
http://www.microsoft.com/japan/msdn/vstudio/events/agileseminar.aspx
0493デフォルトの名無しさん
2009/03/14(土) 03:42:12>ウィンドウを持つサブスレッド
というのは、子ウィンドウを作って WM_CREATE 時に _beginthread する
という事と同じでしょうか?
いや、それだと親ウィンドウと子ウィンドウは同じスレッド上で動くのですよね。
>>473さんの書き込み内容からすると
「親ウィンドウ」 と 「”ウィンドウを持つサブスレッド”のウィンドウ」
は別のスレッド上で動くという事だと思いますが、
その様に実装するにはどういう書き方をすれば良いのでしょうか?
ググったり書物を見たりしましたが、目的とするものは見つかりませんでした。
よろしくお願いします。
0494デフォルトの名無しさん
2009/03/14(土) 03:57:39Windowsのウィンドウはスレッドに属する。
ウィンドウプロシージャはウィンドウの属するスレッドで実行される。
さて、どのスレッドに属するかというと、CreateWindow(Ex)を呼んだスレッド。
0495デフォルトの名無しさん
2009/03/14(土) 04:05:090496デフォルトの名無しさん
2009/03/14(土) 04:25:160497493
2009/03/14(土) 04:25:42親スレッドから起動した新スレッド内で
CreateWindow するという事でしょうか。
試してみましたが、 HWND chWnd;
chWnd = CreateWindow(...
でデバッグしたところ、 chWnd には値が入りませんでした。
CreateWindow の引数には WS_CHILD は入れず、WS_OVERLAPPEDWINDOW にし、
HWND の指定は NULL にした状態でのデバッグです。
仮に HWND の引数に、(親スレッドから新スレッドを起動する際に渡しておいた)
親ウィンドウのハンドルを指定したら、デバッグした途端にフリーズしてしまいました。
>>495
どういう事でしょうか?
0498デフォルトの名無しさん
2009/03/14(土) 04:47:40>476
0499デフォルトの名無しさん
2009/03/14(土) 04:48:530500デフォルトの名無しさん
2009/03/14(土) 04:50:510501497
2009/03/14(土) 04:52:24NULLとしたらちゃんと子ウィンドウの WM_CREATE まで入りました。
が、この WM_CREATE 内で試しに無限ループさせてみたところ
アプリケーション起動時にフリーズしました。
WM_CREATE:
int i = 0; // デバッグでここにすら到達する前にフリーズしました
while (1)
i++;
別スレッドでウィンドウを作ったはずなのですが・・・
0502デフォルトの名無しさん
2009/03/14(土) 04:53:07>498-500
0503デフォルトの名無しさん
2009/03/14(土) 04:54:50マルチスレッドについて議論されていたので
このスレで訊かせていただきました。
答えていただいた方のみに感謝します。
0504デフォルトの名無しさん
2009/03/14(土) 04:59:42で、あなたは今時WinアプリをCde書いていたんですか?
0506隔離スレへどうぞ
2009/03/14(土) 05:00:470507503
2009/03/14(土) 05:07:14C++⊆C と捉えていました。
すみません。
>>505-506
ありがとうございます。
マルチスレッドプログラミングスレもあったのですか…
スレッド検索が足りませんでした。
猫を参考にして書いてもいますが、猫とは少し違う話だと
思われます。ご提示ありがとうございます。
0508デフォルトの名無しさん
2009/03/14(土) 05:10:050509デフォルトの名無しさん
2009/03/14(土) 05:13:17ちゃんとみんなにレスしてんじゃん
0510デフォルトの名無しさん
2009/03/14(土) 12:14:04要素数10個の整数配列を用意します。要素を入力し、バブルソートを用いて昇順にソートを行うプログラムを作成しなさい。
お願いします。
0511デフォルトの名無しさん
2009/03/14(土) 12:51:050512デフォルトの名無しさん
2009/03/14(土) 12:58:08ゆ○とり世代ってヤツ?
0513デフォルトの名無しさん
2009/03/14(土) 13:16:16○には何が入るの?
0515デフォルトの名無しさん
2009/03/14(土) 13:30:52-''":::::::::::::`''> ゆっとり世代ってね!!! <
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
|::::::;ノ´ ̄\:::::::::::\_,. -‐ァ __ _____ ______
|::::ノ ヽ、ヽr-r'"´ (.__ ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、
_,.!イ_ _,.ヘーァ'二ハ二ヽ、へ,_7 'r ´ ヽ、ン、
::::::rー''7コ-‐'"´ ; ', `ヽ/`7 ,'==─- -─==', i
r-'ァ'"´/ /! ハ ハ ! iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |
!イ´ ,' | /__,.!/ V 、!__ハ ,' ,ゝ レリイi (ヒ_] ヒ_ン ).| .|、i .||
`! !/レi' (ヒ_] ヒ_ン レ'i ノ !Y!"" ,___, "" 「 !ノ i |
,' ノ !'" ,___, "' i .レ' L.',. ヽ _ン L」 ノ| .|
( ,ハ ヽ _ン 人! | ||ヽ、 ,イ| ||イ| /
,.ヘ,)、 )>,、 _____, ,.イ ハ レ ル` ー--─ ´ルレ レ´
0516デフォルトの名無しさん
2009/03/14(土) 15:05:320517デフォルトの名無しさん
2009/03/14(土) 15:14:27U+200B
0518デフォルトの名無しさん
2009/03/14(土) 16:15:30バブルソートしてくれる関数を出力するプログラムでも。
#include <stdio.h>
#include <stdlib.h>
static void print_bsort(int n)
{
int i,j;
printf("void bsort%d(int *a)\n{\n int b;\n",n);
for(i=0;i<n-1;++i){
for(j=i+1;j<n;++j){
printf(" a[%d]>a[%d]&&(b=a[%d],a[%d]=a[%d],a[%d]=b);\n",i,j,i,i,j,j);
}
}
printf("}\n");
}
int main(int argc, char **argv)
{
int n;
if(argc!=2) return -1;
n = atoi(argv[1]);
print_bsort(n);
return 0;
}
0519デフォルトの名無しさん
2009/03/14(土) 16:16:55http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8970.txt
この中の
while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
の箇所で、整数の 1000 ではなく、小数の 1000.0 を使うことに
何か意味はあるのでしょうか?
というのは、
1000.0 * (c2 - c1) / CLOCKS_PER_SEC の結果が小数になるとしても、
xは整数なので
1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x …(A:小数) の判定結果と
1000 * (c2 - c1) / CLOCKS_PER_SEC < x …(B:整数) の判定結果は
c2, c1, CLOCKS_PER_SECの値によらず変わらないと思うからです。
(ただし、(A:小数)の計算にかかる時間と
(B:整数)の計算にかかる時間は同じと仮定しています。)
またこれに付随して確認ですが、
(B:整数)に比べて(A:小数)の計算に極端に時間がかかる環境の場合、
(A:小数)の方がsleep関数の精度は劣りますよね?
(プログラムに関して、clock_t型はunsignedと同義の場合もあれば
signed long intと同義の場合もあると思いますが、処理系依存と考えてください。
CLOCKS_PER_SECも1000の場合もあれば
それ以外の場合もあると思いますが、処理系依存と考えてください。)
0520デフォルトの名無しさん
2009/03/14(土) 16:33:230521デフォルトの名無しさん
2009/03/14(土) 16:40:33ミスった。下ね。
for(i=0;i<n;++i){
for(j=1;j<n-i;++j){
printf(" a[%d]>a[%d]&&(b=a[%d],a[%d]=a[%d],a[%d]=b);\n",j-1,j,j-1,j-1,j,j);
>>520 このプログラムを使って宿題出すと×食らうから使っちゃだめだよ。
>>519 必要ないと思うけど、オーバーフロー対策かも。
0522デフォルトの名無しさん
2009/03/14(土) 16:46:28キューを利用して、プリンタのプリントキューを再現したプログラム(以下に要点を記載)を作成しなさい。
"1”を入力するとキューにデータが追加され"2"を入力するとキューからデータが取り出される
キューが満杯になったり、空になったりした際はその旨をメッセージで表示する。
また、以下の関数を作成し、使用しなさい。
vaio enqueue(int val)キューにデータを追加する
vaio dequeue() キューからデータを取り出す
vaio queue_print()キュー全内容を表示する
以上ですお願いします。
0523デフォルトの名無しさん
2009/03/14(土) 16:47:130524デフォルトの名無しさん
2009/03/14(土) 16:53:540525デフォルトの名無しさん
2009/03/14(土) 16:55:47http://pc11.2ch.net/test/read.cgi/tech/1235927586/
0526デフォルトの名無しさん
2009/03/14(土) 16:56:530527デフォルトの名無しさん
2009/03/14(土) 17:11:420528デフォルトの名無しさん
2009/03/14(土) 17:20:40すみませんvaioではなくvoidでした。
0530デフォルトの名無しさん
2009/03/14(土) 17:29:420531デフォルトの名無しさん
2009/03/14(土) 17:58:18CLOCKS_PER_SECが1000以上だと実数と整数じゃ、判定がちがってくるんじゃね?
0532デフォルトの名無しさん
2009/03/14(土) 18:47:030533デフォルトの名無しさん
2009/03/14(土) 19:12:37MinGW gcc だと 1000
0534デフォルトの名無しさん
2009/03/14(土) 19:27:220535デフォルトの名無しさん
2009/03/14(土) 19:33:43何のための最適化オプションだよw
0536デフォルトの名無しさん
2009/03/14(土) 20:08:21http://www.tech-arts.co.jp/news-and-topics/events/20081122.html
0537デフォルトの名無しさん
2009/03/14(土) 21:09:13マルチポスト乙。
http://ex24.2ch.net/test/read.cgi/pc2nanmin/1080308026/
0538519
2009/03/14(土) 22:13:05なるほど。わかりました。
ちなみに、1000.0 * (c2 - c1) / CLOCKS_PER_SEC における
1000.0 にはオーバーフロー対策以外の意味は
ないと考えてよいのでしょうか?
>>531
判定は変わらないと思います。
(間違っていたらどなたかご指摘ください)
【理由】
仮に CLOCKS_PER_SECが1000000、xが800とする。
このとき、プログラム実行後に
c1 = clock(); でc1に100000が代入されたとすると、
c2が899999以下の時までは
1000.0 * (c2 - c1) / CLOCKS_PER_SEC
1000 * (c2 - c1) / CLOCKS_PER_SEC
のどちらであってもwhile文の判定が成立するのでループが続く。
(なぜなら、c2が899999以下のとき
1000.0 * (c2 - c1) / CLOCKS_PER_SEC <= 799.999000 < x
1000 * (c2 - c1) / CLOCKS_PER_SEC <= 799 < x
であり、どちらもx==800より小さいので)
c2が9000000になると、どちらもwhile文の判定が不成立になる。
0539デフォルトの名無しさん
2009/03/14(土) 22:50:30JAVAには配列の大小を分別できるmax,minメソッドがあるけど
C言語にはそういう専門な関数はないんでしょうか?
0540デフォルトの名無しさん
2009/03/14(土) 22:53:45文字列の比較ならstrcmpだが
0541デフォルトの名無しさん
2009/03/14(土) 23:06:32C言語は文字列の比較の関数はみたことありますが、
数値の大小を比較する関数はみたことないので。
0542デフォルトの名無しさん
2009/03/14(土) 23:14:56/* MINMAX.C: __max関数、__min関数を使用して、2 つの数値の大小を
* 求め、表示します。 */
#include <stdlib.h>
#include <stdio.h>
void main( void )
{
int a = 10;
int b = 21;
printf( "%d と %d の大きい方は %d です。\n", a, b, __max( a, b ) );
printf( "%d と %d の小さい方は %d です。\n", a, b, __min( a, b ) );
}
○出力
10 と 21 の大きい方は 21 です。
10 と 21 の小さい方は 10 です。
0543デフォルトの名無しさん
2009/03/14(土) 23:16:030544デフォルトの名無しさん
2009/03/14(土) 23:24:100545デフォルトの名無しさん
2009/03/15(日) 00:30:140546デフォルトの名無しさん
2009/03/15(日) 00:53:500547デフォルトの名無しさん
2009/03/15(日) 02:02:380548デフォルトの名無しさん
2009/03/15(日) 02:33:030549デフォルトの名無しさん
2009/03/15(日) 02:52:33なければ作るのがCです
用意されたものを使うしか出来ない人間には向いていません
0550デフォルトの名無しさん
2009/03/15(日) 12:25:10ないのを確認せずに作るのは問題だがな
0551デフォルトの名無しさん
2009/03/15(日) 12:47:07一々考え方がしっかりしていてまじ尊敬できる
俺も早くあなたたちみたいになる為に勉強しなくては
0552デフォルトの名無しさん
2009/03/15(日) 13:09:430553デフォルトの名無しさん
2009/03/15(日) 13:30:47それほどでもない
0554デフォルトの名無しさん
2009/03/15(日) 13:46:52ポインタの壁を乗り越えた勇者さまだからな
0555デフォルトの名無しさん
2009/03/16(月) 13:51:24C++プログラマも、ちゃんと極めている人はカッコイイよ。
Cプログラマーも、オブジェクト指向プログラミングがまともに理解出来ずC++が使えないバカじゃなくて、
その他の言語もばっちし使えるのにC言語を愛して使い続ける人がカッコイイ。
0556デフォルトの名無しさん
2009/03/16(月) 14:46:21main関数の中にあるinitialize_main関数が見付かりません。
cat.cでincludeされているヘッダーファイルしか読んでいませんので
更にヘッダーファイルのヘッダーファイルをたどっていけばたぶん見付かると思いますが
めんどくさくてそこまでやる気がしません。
皆さんはそのファイル内に関数が見付からないときどうやって探していますか?
またもしcat.cなど説明してくれているドキュメントがあれば教えていただきたいです。
0557デフォルトの名無しさん
2009/03/16(月) 14:49:35grep
0558デフォルトの名無しさん
2009/03/16(月) 15:27:48今はIDEが追跡してくれるけどそれでもよく使う
0559デフォルトの名無しさん
2009/03/16(月) 17:17:350560デフォルトの名無しさん
2009/03/16(月) 17:58:130561デフォルトの名無しさん
2009/03/16(月) 17:59:45> 質問です。今、gnuのcatのスクリプトを読んでいるのですが
~~~~~~~~
> めんどくさくてそこまでやる気がしません。
0562デフォルトの名無しさん
2009/03/16(月) 18:23:53/* Redirection and wildcarding when done by the utility itself.
Generally a noop, but used in particular for native VMS. */
#ifndef initialize_main
# define initialize_main(ac, av)
#endif
だとさw
0563デフォルトの名無しさん
2009/03/16(月) 18:25:200564デフォルトの名無しさん
2009/03/16(月) 18:27:50ありがとうございました。
0565デフォルトの名無しさん
2009/03/16(月) 18:43:36正直、その行は見つけていました。書いておくべきでした。
(ac,av)の右側に処理も何も書いてないので
理解できなくて他のところに処理が書いてあるのだろうと思っていました。
cat.cの中でacとavにはアドレスを渡しているのですが
この場合、どうなるのでしょう。
0566デフォルトの名無しさん
2009/03/16(月) 19:25:02コンパイルの時にはプリプロセッサの段階で消える
0567デフォルトの名無しさん
2009/03/16(月) 21:20:43だからこの場合はinitialize_mainがマクロ定義されていなければ
#define initialize_main(ac,av)を定義する。
うーん。一応coreutilsディレクトリ以下と/usr/includeディレクトリ以下は全部
確認したけど#define initialize_mainなんてなかったしなんで
#ifndef #define initialize_main(ac,av) #endifなんて処理するんだろう。
むずかしい。上記のディレクトリ以下以外にも読み込んでるファイルがあるんですかね
0568デフォルトの名無しさん
2009/03/16(月) 22:36:01-define initialize_main みたいにするコンパイラもある
0569デフォルトの名無しさん
2009/03/16(月) 22:36:21123/456 のような形式で入力を受け取り
それぞれを数字として解釈してから出力するコードを書きたかったのですが
以下のエラーが出てしまいます。
--
hoge.c:9: error: conflicting types for 'getnumto'
hoge.c:9: note: an argument type that has a default promotion can't match an empty parameter name list declaration
hoge.c:5: error: previous implicit declaration of 'getnumto' was here
--
「引数の型がマッチしない」と言われているので
自分がchar の型の使い方を間違えてるのだと思います。
でも、どう間違えてるかがわかりません。
char とは内部的には整数で表される 1byte の文字列だと理解してるのですが、間違えているのでしょか?
以下がエラーを起こすコードです。
#include <stdio.h>
main (){
int n1,n2;
n1 = getnumto('/');
n2 = getnumto('\n');
printf("%d/%d\n",n1,n2);
}
int getnumto(char s){
int n = 0;
char c;
while ((c=getchar())!= s){
n *= 10;
n += c-'0';
}
return n;
}
0570デフォルトの名無しさん
2009/03/16(月) 22:39:47プロトタイプを忘れてる
0571デフォルトの名無しさん
2009/03/16(月) 22:40:33言っていることはあっているけど、getcharはint型を返す。
なぜなら、charのどの値とも異なるEOFを返す可能性があるので、char型にできないため。
0572デフォルトの名無しさん
2009/03/16(月) 22:41:00二行目あたりに↑これ入れる。
0573デフォルトの名無しさん
2009/03/16(月) 23:18:08ありがとうございます。期待通りの動作をするようになりました。
プロトタイプ宣言の必須条件がわからなかったため
検索をかけて調べたところ
「関数の記述より前で使用されているなら宣言する必要がある」とありました。
ですが、今回書いたプログラムでは getnumto(char s) の下に
実際はもうひとつ最大公約数を求める gcd(int n1, int n2) を書き、
main() から呼び出していましたがエラーが出ませんでした。
http://ja.wikipedia.org/wiki/関数プロトタイプ
>左括弧付きで式の中に現われた場合、その関数は暗黙のうちに int を返すものと判断され、
これは上記のサイトの内容から判断するに
引数が int のみで構成される場合は
プロトタイプ宣言は必須ではないためエラーがでなかった、ということでしょうか?
0574デフォルトの名無しさん
2009/03/16(月) 23:25:49正しくないプログラムに対しては、エラーも警告も出る保証がない
エラーや警告が出ないプログラムが正しいとは限らないということだ
0575デフォルトの名無しさん
2009/03/16(月) 23:36:26なるほど、ありがとうございます。
常にプロトタイプを忘れないように気をつけることにします。
0576デフォルトの名無しさん
2009/03/16(月) 23:40:02関数宣言はかならずするようにしてるんで、プロトタイプなしで
関数をコールしたときの仕様って、よく憶えてないけど、
最初に
n1 = getnumto('/');
でコールしてるから、引数がintだと解釈されて、そのごに
(文字定数の型はcharじゃなくてint)
int getnumto(char s)
と定義してるから型がちがうってエラーになってるんじゃないの?
0577デフォルトの名無しさん
2009/03/16(月) 23:50:02ダウト
0578デフォルトの名無しさん
2009/03/16(月) 23:54:060579デフォルトの名無しさん
2009/03/16(月) 23:59:320580デフォルトの名無しさん
2009/03/17(火) 00:01:030581デフォルトの名無しさん
2009/03/17(火) 00:01:14引数に渡る
sizeof(int) != sizeof(void*) の系で、かつ可変引数の部分に
NULL のつもりでリテラルの 0 を渡すとハマルぜ
# NULL の定義が不安な場合には (void*)0 と明示的にポインタ指示することもある
0582デフォルトの名無しさん
2009/03/17(火) 00:01:28いつも暗黙にintになる
0583デフォルトの名無しさん
2009/03/17(火) 00:05:460584デフォルトの名無しさん
2009/03/17(火) 00:08:490585デフォルトの名無しさん
2009/03/17(火) 00:41:47新規ファイルへ書き込みを行ないたいのですが、fprintfで可能なのでしょうか?
0586デフォルトの名無しさん
2009/03/17(火) 00:49:21つーか printf でも何でも OK.
0587デフォルトの名無しさん
2009/03/17(火) 00:56:43勉強になります。
ありがとうございました。
0588デフォルトの名無しさん
2009/03/17(火) 01:02:13文字列からstrstrにて検索した文字の書換えを行ないたいのですが、
一般的にはどの様な方法をとるものなのでしょうか?
よろしくお願いします。
0589デフォルトの名無しさん
2009/03/17(火) 01:17:510590デフォルトの名無しさん
2009/03/17(火) 01:24:070591デフォルトの名無しさん
2009/03/17(火) 01:47:42コンパイラオプション初めて知りました。
#ifndef initialize_main
これって関数ではなくて変数ですよね。仮にこの変数が宣言されていたら
関数の宣言がされないからエラーでますよね。。。
ここはスルーした方がよさそうですね。
皆さんありがとうございました。
0592デフォルトの名無しさん
2009/03/17(火) 02:06:580593デフォルトの名無しさん
2009/03/17(火) 02:18:450594デフォルトの名無しさん
2009/03/17(火) 02:20:290595デフォルトの名無しさん
2009/03/17(火) 02:24:050596デフォルトの名無しさん
2009/03/17(火) 02:38:25vaeiable=変数
適切だと思うが
0597デフォルトの名無しさん
2009/03/17(火) 02:41:120598デフォルトの名無しさん
2009/03/17(火) 02:46:590599デフォルトの名無しさん
2009/03/17(火) 02:52:51STLを使うだけでも価値があるさ
0600デフォルトの名無しさん
2009/03/17(火) 03:42:01こんなにバカがいるのか。。。なさけないわ
0601デフォルトの名無しさん
2009/03/17(火) 03:58:22ただのタイプミスだろ
eとrはキーボードでとなり同士だから
それをわざわざgoogleで検索するバカもなさけない
0602デフォルトの名無しさん
2009/03/17(火) 04:49:120603デフォルトの名無しさん
2009/03/17(火) 07:30:45にあるように
foo[10] = {0}
と配列を初期化してgccでコンパイルしたら
"variable-sized object may not be initialized"のエラーになっちゃったんですが
この初期化方法は今はダメなんでしょうか?
0604デフォルトの名無しさん
2009/03/17(火) 07:35:500605デフォルトの名無しさん
2009/03/17(火) 07:42:03すいません…。
その部分だけのコードを書いたら通りました。
別の所が原因みたいです。
0606デフォルトの名無しさん
2009/03/17(火) 07:45:180607603
2009/03/17(火) 07:45:45この状態で出ました。
回避方法はありますか?
main (){
hoge(10);
}
int hoge(int n){
int foo[n] = {0};
}
0608デフォルトの名無しさん
2009/03/17(火) 07:47:06・諦める。
・C99を使う。
・malloc()の使い方を学ぶ。
・c++でnewを(r
0609デフォルトの名無しさん
2009/03/17(火) 07:56:36int *pi;
pi = (int *)calloc(n, sizeof(int));
free(pi);
が定石じゃね
0610603
2009/03/17(火) 07:56:54int *foo = malloc(n*sizeof(int));
としたら確保はできたようなんですが
この場合初期化の {0} が呼び出せず
どうすれば良いのかわかりません…。
0611デフォルトの名無しさん
2009/03/17(火) 08:02:530612デフォルトの名無しさん
2009/03/17(火) 08:24:22初期化は
memset(pi, 0, n * sizeof(int));
0613デフォルトの名無しさん
2009/03/17(火) 10:08:30半可通の俺が答えてやんよ!
{0}はリテラル。コンパイル時に静的な処理を行う。
左辺がサイズを指定した配列として宣言してなきゃ、
コンパイラが初期化することができない。
どうだ! つっこみどころまんさいだろう!
0614デフォルトの名無しさん
2009/03/17(火) 10:11:24もういないのかもしれんが、これは同じものを2回defineしないための処置
次の行のdefineでinitialize_main()の呼び出しそのものが消える
よってinitialize_main()関数はどこにもない。英語のコメントも読めよ。
0615デフォルトの名無しさん
2009/03/17(火) 10:13:270616デフォルトの名無しさん
2009/03/17(火) 10:51:03ありがとうございます。いますよ。
消えるって言うのがよくわからんです。cat.cにあるinitialize_main(&wasu,&reta)
も消えるんですか?
コンパイル時に処理が書いてないから自動的に消してくれるということ?
まず消される運命なら書く必要ない気が(noopが関係してるのかな?)
もちろん英語の文だって翻訳しましたよ。でも
「リダイレクションとユーティリティ自体ですると、wildcardingします。
一般にnoopにもかかわらず、特にネイティブのVMSにおいて、使用されています。」
こんな翻訳され。しても意味がわかりません。
まあ冗談はおいといて上の行は単語の意味は知ってますが意味は理解できませんでした。
noop、VMSは知らなかったですね。
調べてnoopはなんとなくですがわかりましたがVMSはよくわかりませんでした。
どうやらもっとハードの方も勉強しなきゃいけないみたいです。
というわけで下の方もソースも読んでいってわからないところは無視するか
ソースを読むこと自体あきらめようと思います。
皆さんありがとうございました。
0617デフォルトの名無しさん
2009/03/17(火) 11:16:56Generally a noop, but used in particular for native VMS. */
ユーティリティ自身がリダイレクトやワイルドカードの処理をするための関数がinitialize_main()なんだろ。
通常は使わないが、VMSでは使うってこった。
0618デフォルトの名無しさん
2009/03/17(火) 11:18:250619デフォルトの名無しさん
2009/03/17(火) 11:51:22自分で訳すんだよ
この程度の英語が読めないようじゃだめだろう
0620デフォルトの名無しさん
2009/03/17(火) 11:57:56C言語の無料で使えるコンパイラで良いのないでしょうか?
入門書買ったけど覚えが悪いのでコンパイラに実際に書きながら練習したいです。
0621デフォルトの名無しさん
2009/03/17(火) 11:58:15学校の英会話教室行く&自分なりに勉強しようと思います。
こんな時間に返事をしてくれるということは皆さんニー・・・
学生ですよね?院生でなければ自分と同じか下なのに自分なんかより色々な知識を持っていて羨ましいです。
ハードはいらないとのことですが最近はハード関連の本読んでないしひさしぶりに読んでみようと思います。
0622デフォルトの名無しさん
2009/03/17(火) 12:03:01Windowsなら
VisualC++2008 ExpressEditionでいいんじゃない
0623デフォルトの名無しさん
2009/03/17(火) 12:07:13悪いが社会人だ。つーか、他人の詮索すんなや。
英会話教室に行くこと自体は止めないが、資料を読むのが目的なら殆ど役に立たないぞ。
大抵、英文法の教え方の研修も受けていない「英会話の専門家」が相手なんだから。
>>620
CUIが苦にならないならcygwin、独特の癖のあるGUIが苦にならないならVisualStudio2008。
0624デフォルトの名無しさん
2009/03/17(火) 12:19:49>>623
ありがとうございます!
パソコンWindowsで入力も苦手なので、
教えていただいた、
VisualC++2008 ExpressEditionかVisualStudio2008のどちらかにしようと思います。
0625デフォルトの名無しさん
2009/03/17(火) 13:00:21実際に打ちながら勉強するのは普通だよ
特に初めてプログラミングをするなら必須であるといってもいい
0626デフォルトの名無しさん
2009/03/17(火) 14:40:48StudioってのはC++やBASICやC#なんかのセットだからCやりたいのならC++だけでいいよ
0627デフォルトの名無しさん
2009/03/17(火) 14:54:270628デフォルトの名無しさん
2009/03/17(火) 15:00:270629デフォルトの名無しさん
2009/03/17(火) 15:09:33これをUnicodeに変換してwchar_tの配列に格納したんですけど、やり方がよくわかりません
0630デフォルトの名無しさん
2009/03/17(火) 15:10:00うん、無いよねw
0631デフォルトの名無しさん
2009/03/17(火) 15:16:030632デフォルトの名無しさん
2009/03/17(火) 15:23:54GetCommandLineW
CommandLineToArgvW
0633デフォルトの名無しさん
2009/03/17(火) 15:24:330634デフォルトの名無しさん
2009/03/17(火) 15:37:09int wmain(int argc, wchar_t* argv[])
0635634
2009/03/17(火) 15:42:34が必要です
0636デフォルトの名無しさん
2009/03/17(火) 15:57:15変換もできて、格納もできて、なんの遣り方が判らないんだ?
0637デフォルトの名無しさん
2009/03/17(火) 16:06:28それはエスパー検定1級の問題です
0638デフォルトの名無しさん
2009/03/17(火) 17:29:30Turbo C 2.01
ttp://bdn.borland.com/museum/
0639デフォルトの名無しさん
2009/03/17(火) 19:15:25wmainを使うだけならwindows.hは要らないぞ。
632ならともかく。
0640デフォルトの名無しさん
2009/03/17(火) 19:33:35この前ぐぐってたら、telephacy?なんとかって掲示板が引っ掛かって、
外国にもエスパースレあるのかと、勝手に解釈して和んだ。
0642デフォルトの名無しさん
2009/03/17(火) 21:40:30setlocale(LC_ALL, "")
setlocale(LC_ALL, "japanese_japan.932")
はうまくいったんですが、ためしに文字コードをUTF-8に変えてみようと
setlocale(LC_ALL, "japanese_japan.65001")
にすると失敗します
なにがいけないんでしょうか?
0643デフォルトの名無しさん
2009/03/17(火) 21:43:440644デフォルトの名無しさん
2009/03/17(火) 22:51:41共有メモリにアタッチした時に返ってくるアドレスが
プロセス毎に違うのはなぜなんでしょうか?
0645デフォルトの名無しさん
2009/03/17(火) 23:03:180646デフォルトの名無しさん
2009/03/17(火) 23:04:42同じ場所に読み書きしてるはずなのに・・・・って言う点なら
C上で(というかOS上で)扱うのはメモリの実際の番地ではない仮想アドレスというものだから
0647デフォルトの名無しさん
2009/03/17(火) 23:23:27プロセスごとに仮想アドレスと物理アドレスの対応表を持っているからです。
0648644
2009/03/17(火) 23:28:08作成した共有メモリ → 物理メモリアドレス空間
プロセス内でアタッチした共有メモリ → プロセス毎に割り当てられた仮想メモリアドレス空間
という認識でおk?
で、>>647の対応表を用いて書き換えてるわけですね。
0649デフォルトの名無しさん
2009/03/17(火) 23:34:52DOSの頃は物理アドレス叩けたんだけど・・・
0650デフォルトの名無しさん
2009/03/17(火) 23:37:26さらに専用ハードウェアが仮想と物理アドレスを対応してるんじゃないの?
0651デフォルトの名無しさん
2009/03/17(火) 23:54:20どんな環境か知らないけど、共有メモリってのはいわゆるファイルマッピングのことでしょ。
ファイルマッピングで調べてみ。
>>650
専用ハードウェアっていうかCPUが変換を行っている。
また、実行中プロセスのページディレクトリの先頭アドレスはレジスタに格納されている。
0652デフォルトの名無しさん
2009/03/18(水) 00:14:40久々に見たらなんか失礼なことほざいているな。
自分がニート同然だから言ってるのか?
全く・・・。
0653デフォルトの名無しさん
2009/03/18(水) 00:24:04MMUってひょっとしてCPUの一部?
0654デフォルトの名無しさん
2009/03/18(水) 00:29:55詳しくないけどとりあえずそれは違う
普通にマザーに乗ってるからMMU
0655デフォルトの名無しさん
2009/03/18(水) 00:45:490656デフォルトの名無しさん
2009/03/18(水) 01:02:28マザーに載ってるってのはそうそう無いだろ。
0657デフォルトの名無しさん
2009/03/18(水) 01:05:04即物理アドレスに変換しなきゃいけないんだぜ。
普通はCPUが持ってるだろうし
そうでなくてもCPUと直結のコプロセッサ的なものに含まれるだろ。
0658デフォルトの名無しさん
2009/03/18(水) 01:10:130659デフォルトの名無しさん
2009/03/18(水) 01:15:480660デフォルトの名無しさん
2009/03/18(水) 01:18:03写して弄って理解する
ネットを巡ればソースコードはいくらでも手に入る
0661デフォルトの名無しさん
2009/03/18(水) 01:30:27puts(code);
0662デフォルトの名無しさん
2009/03/18(水) 01:30:41アドバイスありがとうございます
0663デフォルトの名無しさん
2009/03/18(水) 01:33:29人のコードを見る。Cの文法を勉強する。
この両面から攻めればヨロシ。
0664デフォルトの名無しさん
2009/03/18(水) 01:34:31ありがとうございます。
やさしい方が多くてなんかうれしいなぁ
0665デフォルトの名無しさん
2009/03/18(水) 01:41:43ポインタに触れる、何かが覚醒する。
それは自分の無能かC言語の可能性か。
0666デフォルトの名無しさん
2009/03/18(水) 10:36:04ひょっとして標準ではそういう関数は用意されていないんでしょうか?
自分でMax関数作らないとダメでしょうか?
0667デフォルトの名無しさん
2009/03/18(水) 10:37:330668デフォルトの名無しさん
2009/03/18(水) 10:37:330669デフォルトの名無しさん
2009/03/18(水) 10:42:28自己解決しました
math.hをつかえばできるみたいですね
0670デフォルトの名無しさん
2009/03/18(水) 11:50:19borlandのCを使って、WindowsAPIをいじることはできますか?
どうしてもC言語で音をいじりたいんですが、borlandでは無理ですかねえ。
Visual Cならできるんですか?
0671デフォルトの名無しさん
2009/03/18(水) 11:53:19できるよ
0672デフォルトの名無しさん
2009/03/18(水) 12:10:43本当ですか!???
C++ではなくCから音をいじれるんですか?
0673デフォルトの名無しさん
2009/03/18(水) 12:15:390675デフォルトの名無しさん
2009/03/18(水) 12:43:41それ使えば他の環境と変わらないやりかたで作れるよ
0676デフォルトの名無しさん
2009/03/18(水) 12:52:29APIがなんだかわかってるのか?
ああここで聞くなよ
APIスレ行け
0677デフォルトの名無しさん
2009/03/18(水) 13:13:26>>676
入門篇なんだから仕方ないじゃないか。
0678デフォルトの名無しさん
2009/03/18(水) 13:20:370679デフォルトの名無しさん
2009/03/18(水) 13:35:26670のレベルだとwaveOutくらいで十分な気がする。
0680デフォルトの名無しさん
2009/03/18(水) 13:41:010681デフォルトの名無しさん
2009/03/18(水) 13:46:38どの程度いじるのかにもよるが
0682670
2009/03/18(水) 13:51:14ですので、C言語超初心者の俺がC言語で音やグラフィックをいじるにはどうしたらいいかを教えてほしかったんです。
>>679
waveファイルを鳴らすやつですか?
そういうのじゃなく、加算合成で音色を作ったりするのがやりたいです。
Max/mspなんかよりもプログラミング言語で作ったほうが面白そうだから。
例えば一番単純な例だけど、ランダムでmidiの音を鳴らしたりするプログラムはどんなやり方で作れますか?
0683デフォルトの名無しさん
2009/03/18(水) 13:53:44乱数生成はプログラム言語C標準ライブラリのsrand,rand関数
MIDI音源からの出力はwin32 APIのmidiOut関数
0684デフォルトの名無しさん
2009/03/18(水) 13:58:24という区別が付くレベルの人ばかりじゃない、ってことさ。
>>682
http://pc11.2ch.net/test/read.cgi/tech/1212409946/56
と同じ人?
>waveファイルを鳴らすやつですか?
・ファイルから波形データを読んで鳴らす
・メモリ上で波形データを作って鳴らす
同じこと。
いいからAPIスレ池。
0685デフォルトの名無しさん
2009/03/18(水) 14:37:40まず初心者を脱してください
話はそれからです
0686デフォルトの名無しさん
2009/03/18(水) 14:43:570687デフォルトの名無しさん
2009/03/18(水) 14:55:48超初心者だったら無理。
言語仕様とかライブラリとかそう言う問題じゃなくて経験的に無理。
0688デフォルトの名無しさん
2009/03/18(水) 14:57:13他の言語やってから来なさいw
0689デフォルトの名無しさん
2009/03/18(水) 15:03:51プログラムを作りたいなら、あれこれ考えずにMS製の開発環境を
購入しなさい。他人に聞いても、その言葉の意味を理解するまでに
時間が掛かるでしょ?
0690デフォルトの名無しさん
2009/03/18(水) 16:08:330691デフォルトの名無しさん
2009/03/18(水) 16:52:16だってー
このスレちゃんと「入門篇」って書いてあるじゃんかあ。
Javaならいいの?かえって難しい様な気がするよ。
他のはN88basicしかやったことない。こんなの実用性ないし
とりあえず無料でできるやつで高機能なやつって考えたらCになった。
>>690
そうではなくて、アルゴリズムに基づいてmidiを鳴らしてみたいのだ実験的に。
たとえば、すごく簡単なのだと、演歌のスタイルをあらかじめプログラミングしておいて、そのスタイルに沿ったランダム音楽を鳴らすとか。
そうやってバッハ風のランダム音楽とか、シェーンベルク風のランダム音楽とかできるでしょ。
とりあえずそれで実験してみたいのだ。
Cを使って。
0692デフォルトの名無しさん
2009/03/18(水) 16:56:440693デフォルトの名無しさん
2009/03/18(水) 17:00:24俺はC#からWin32APIを使ったよ
Cよりは簡単
0694デフォルトの名無しさん
2009/03/18(水) 17:21:13貴方のような人を「身の程知らず」といいます
0695デフォルトの名無しさん
2009/03/18(水) 17:23:35とりあえずmmlを経由すれば簡単
0696デフォルトの名無しさん
2009/03/18(水) 17:42:49だから、midiを鳴らすのは既存アプリでいいだろ。
免許のアナロジーで言うなら、宅配便の集配所まで原ちゃりで荷物を持っていくようなもんだ。
0697デフォルトの名無しさん
2009/03/18(水) 18:47:48答えが大きく変わるなw
0698デフォルトの名無しさん
2009/03/18(水) 21:38:130699デフォルトの名無しさん
2009/03/18(水) 21:53:450700デフォルトの名無しさん
2009/03/19(木) 00:39:51あげてるのはすべてつり。
WinAPIスレでも見かけたが、相手にされなくなって移動してきているんだろう。
0701デフォルトの名無しさん
2009/03/19(木) 02:38:21ああ、つまり重症ってことか。
0702デフォルトの名無しさん
2009/03/19(木) 15:22:24http://pc11.2ch.net/test/read.cgi/tech/1217147291/
0703デフォルトの名無しさん
2009/03/19(木) 20:09:310704デフォルトの名無しさん
2009/03/19(木) 20:12:160705デフォルトの名無しさん
2009/03/19(木) 22:18:13標準Cでは言及がないけどPOSIXでは言及があるらしい。
>>704の言うとおり。
0706デフォルトの名無しさん
2009/03/20(金) 03:27:420707デフォルトの名無しさん
2009/03/20(金) 04:11:310708デフォルトの名無しさん
2009/03/20(金) 07:32:450709634
2009/03/20(金) 09:16:570710デフォルトの名無しさん
2009/03/20(金) 09:45:250711デフォルトの名無しさん
2009/03/20(金) 09:49:29ttp://www.wdic.org/w/TECH/wchar%EF%BC%BFt
この_tは、typedefであることの目印である。
_tが付いているが、C++においてはこれは組み込み型の予約語であり、typedefではない。
このような奇妙な名になったのは、Cの遺物といえる。
0712デフォルトの名無しさん
2009/03/20(金) 10:08:030713デフォルトの名無しさん
2009/03/20(金) 18:42:34この前どこかで、long charとして入れようとしたけど期限がぎりぎりだからtypedefでお茶を濁したという話を見た。
0714デフォルトの名無しさん
2009/03/20(金) 19:26:06【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc11.2ch.net/test/read.cgi/tech/1201153965/
規格スレ
http://pc11.2ch.net/test/read.cgi/tech/1235468462/
0715デフォルトの名無しさん
2009/03/20(金) 19:32:44の真偽はともかく
現状そう捉えて差し支えなさそう
0716デフォルトの名無しさん
2009/03/21(土) 04:26:530717デフォルトの名無しさん
2009/03/21(土) 04:31:380718デフォルトの名無しさん
2009/03/21(土) 04:39:16なにかいい勉強方法などありますか?
0719デフォルトの名無しさん
2009/03/21(土) 04:42:180720デフォルトの名無しさん
2009/03/21(土) 08:53:180721デフォルトの名無しさん
2009/03/21(土) 08:54:520722デフォルトの名無しさん
2009/03/21(土) 08:56:55それぞれの違いを意識しながらやれば問題ない
0723デフォルトの名無しさん
2009/03/21(土) 08:59:36既に習得しているプログラミング言語がない(プログラミング言語の学習自体が初めて)レベルならやめといたほうがいい。
0724デフォルトの名無しさん
2009/03/21(土) 09:03:19JavaScriptと(C/C++/Javaの何れか)を同時学習するのは
中級者になる迄は絶対に避けたほうがいい。期間を分けてそれぞれ
独立に学習する。(行きつ戻りつせざるを得ないだろうが)
理由は変数という考え方が全然違うから。
0725デフォルトの名無しさん
2009/03/21(土) 09:03:46そういう質問をするレベルならJavaから入ったほうがいい
0726デフォルトの名無しさん
2009/03/21(土) 09:09:15大丈夫
少なくともJavaと言われてJavaScriptを持ち出すようなアフォにはならんw
0727デフォルトの名無しさん
2009/03/21(土) 10:51:52誰もJavascriptのことなんざ(ry
0728デフォルトの名無しさん
2009/03/21(土) 11:40:05といいたいんだろうが、コンソールでチャットみたいにパタパタやって
プログラムが出来ると考える奴はオカシイと考える人は
テキストエディタでJavaScriptでコード書いてブラウザで表示させる
ことでプログラミングやりだした世代以降確実に増加する予定
Win95発売当時高校生だった世代は既に30代に突入しとるw
0729デフォルトの名無しさん
2009/03/21(土) 11:46:26そんな必死に言い訳しなくてもいいよ
0730デフォルトの名無しさん
2009/03/21(土) 17:01:410731476
2009/03/21(土) 20:35:04break;
この条件なんですが、gets(name[i])で入力した値があったらbreakで終了するんですか?
本にはエンターを押したら終了っていうかんじで答えの場所にありました
エンターを押したら終了ぜんぜんよくわかりませんが
if(!*name[i])
break;
野意味教えてください
0732デフォルトの名無しさん
2009/03/21(土) 20:45:370733デフォルトの名無しさん
2009/03/21(土) 20:55:08if(!*name[i])
は
if(*name[i] == '\0')
if(name[i][0] == '\0')
と等価
gets(name[i])
でEnterのみ入力すると
name[i][0]に'\0'が代入される
0734476
2009/03/21(土) 20:58:27すごいわかりやすい返答ありがとうございます
\0が入るとは思ってませんでした
回答ありがとうございました
0735476
2009/03/21(土) 21:30:21#include <string.h>
#include <stdlib.h>
#define MAX 100
void input(void);
int menu(void);
int i=0;
char title[MAX][80];
char name[MAX][80];
char pubs[MAX][80];
int main(void)
{
switch(menu())
{
case 1:input();
break;
}
return 0;
}
int menu(void)
{
int a;
do{
printf("\n*******select*****\n");
printf("1,title\n");
printf("2,search\n");
printf("3,book search\n");
printf("input:");
0736デフォルトの名無しさん
2009/03/21(土) 21:31:190737476
2009/03/21(土) 21:36:07}while(a<1 || a>3);
return a;
}
void input(void)
{
int u;
for(u=i; u<=MAX; u++){
printf("\nname input (Enter quit):");
gets(name[u]);
if(*name[u]=='\0')
break;
printf("title:");
gets(title[u]);
printf("pubs:");
gets(pubs[u]);
u++;
}
i=u;
}
これなんですが
int menu(void) のscanf("%d",&a);で入力した
aをreturnで返して
その1 menu()でcase 1:input(); をやろうとするのですが
うまく次の入力 図書情報を入れる場所までいかずにおわってしまいます
gets(a);
本にはint u; u=atoi(a);とかいてあって
わざわざ文字列の1aなど1などをatoi(整数)して渡すとうまく1の動作ができ入力できるのですが
なぜか整数のintのuに値をいれて 1を渡すと 1の入力の場所がでて入力できずに終わってしまいます
何故終了してしまうのか教えてください
0738デフォルトの名無しさん
2009/03/21(土) 22:55:44menu関数を呼ぶ
もし戻り値が1ならinput関数を呼ぶ
終了
main関数の中でループさせたかったのだろうと想像
0739デフォルトの名無しさん
2009/03/21(土) 23:08:590740デフォルトの名無しさん
2009/03/21(土) 23:52:03>>なぜか整数のintのuに値をいれて 1を渡すと 1の入力の場所がでて入力できずに終わってしまいます
さすがにこれは日本語でおkだろう
0741デフォルトの名無しさん
2009/03/22(日) 01:51:34そんな御託より直接
C言語でおkだろう
0742デフォルトの名無しさん
2009/03/22(日) 02:07:41C使ってゲーム作ってんだけどフリー素材が見つからない助けて!
0743デフォルトの名無しさん
2009/03/22(日) 02:09:53ヒント:C言語なら俺に聞け
0744デフォルトの名無しさん
2009/03/22(日) 02:12:10ggrks
0745デフォルトの名無しさん
2009/03/22(日) 03:09:27VIPでヤレ
0746デフォルトの名無しさん
2009/03/22(日) 12:10:24#include <stdio.h>
//xミリ秒経過するのを待つ
int sleep(unsigned long x)
{
clock_t c2, c1 = clock();
do {
if ((c2 = clock()) == (clock_t)-1);
return 0;
}while(1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
return 1;
}
int main(void)
{
printf("My name is Bohyou.");
fflush(stdout);
sleep(2000);
printf("\rHow do you do?");
fflush(stdout);
sleep(2000);
printf("\rThanks. ");
return 0;
}
2秒ごとに表示される文が変わっていくようなんだけど
Thanks.だけしか表示されないです。ぼすけて
0747デフォルトの名無しさん
2009/03/22(日) 12:15:050748デフォルトの名無しさん
2009/03/22(日) 13:06:550749デフォルトの名無しさん
2009/03/22(日) 13:12:29今回のように思わぬバグを招きやすい
if (a == 0) b = 1;
if (a == 1) b = 5;
↑のようなのはまだいいけど
if (a ==0)
return 0;
↑のようなのは間にセミコロンが入ったりw
命令を追加したときにバグりやすい
0750デフォルトの名無しさん
2009/03/22(日) 13:21:36{
return 0;
}
防げんやないかw
0751デフォルトの名無しさん
2009/03/22(日) 13:57:24if(){
}
と書く少数派だが、おかげでそういう間違いは起きない
0752デフォルトの名無しさん
2009/03/22(日) 14:04:260753デフォルトの名無しさん
2009/03/22(日) 14:24:030754デフォルトの名無しさん
2009/03/22(日) 14:26:15if ()
{
}
だとifだけコメントアウトできると知ってちょっと心が揺らいでいる
0755デフォルトの名無しさん
2009/03/22(日) 14:44:08> clock_t c2, c1 = clock();
これできるの?
0756デフォルトの名無しさん
2009/03/22(日) 14:47:380757デフォルトの名無しさん
2009/03/22(日) 15:11:11>>749
あっ、できました。何でifの後ろに;を打ったんだろう
それ以前に何でエラーにならないでコンパイルされたんだろう
0758デフォルトの名無しさん
2009/03/22(日) 15:14:46論理バグではあるけど
0759デフォルトの名無しさん
2009/03/22(日) 16:14:53警告レベル上げれば警告するコンパイラはあるけども
0760デフォルトの名無しさん
2009/03/22(日) 16:31:45定数以外での宣言時初期化っていつからできるようになったんだ?
0761デフォルトの名無しさん
2009/03/22(日) 16:33:20その内容で sleep() と名付けるセンスが許せない。
0762デフォルトの名無しさん
2009/03/22(日) 16:37:31sleep()は元々マルチタスク環境で他のCPUプロセスにCPU時間を
明け渡すって意味だもんな
0763デフォルトの名無しさん
2009/03/22(日) 16:46:02C ではできない。>>746 は C++ だろうな。
0764デフォルトの名無しさん
2009/03/22(日) 16:53:350765デフォルトの名無しさん
2009/03/22(日) 16:55:58へぇ!そりゃ新説だ
0766デフォルトの名無しさん
2009/03/22(日) 17:02:09死ね
0767デフォルトの名無しさん
2009/03/22(日) 17:08:27試してみたかい?
0768デフォルトの名無しさん
2009/03/22(日) 17:16:52???
0769デフォルトの名無しさん
2009/03/22(日) 17:21:29確かに出来た
gcc -std=c89 a.c
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
int tmp=(srand(time(NULL)),0);
int i, data[]={rand(),rand(),rand(),rand(),rand()};
for(i=0;i<sizeof(data)/sizeof(data[0]);i++) printf("%d\n", data[i]);
return 0;
}
0770デフォルトの名無しさん
2009/03/22(日) 17:32:06さらしあげ
0771デフォルトの名無しさん
2009/03/22(日) 18:03:48そういうときは、-pedantic-errorsつけるべき。
0772デフォルトの名無しさん
2009/03/22(日) 18:08:340773デフォルトの名無しさん
2009/03/22(日) 18:13:49ということは c89 では本来初期化時に関数の返値で初期化できるべきではない?
0774デフォルトの名無しさん
2009/03/22(日) 18:16:59以下のコード、VC++でもBCCでも、
.cのままでコンパイル通りますけど?
gccの独自拡張は、配列要素の初期化だけでしょ。
int n0;
int func(int n);
int fnc(void) {
int n1 = func(1), n2 = func(2), n3 = 5;
return n1 * n2 + n3 * n0;
}
最初に提示された>>755のコードも、当然通りますね。
clock_t cx(void) {
clock_t c2, c1 = clock();
c2 = clock();
return c2 - c1;
}
当たり前ですけど。
0775デフォルトの名無しさん
2009/03/22(日) 18:22:21int main()
{
int a;
a = func();
int b; /*これは駄目*/
return 0;
}
0776デフォルトの名無しさん
2009/03/22(日) 18:23:52付けたけど問題ないよ。
0777デフォルトの名無しさん
2009/03/22(日) 18:25:03そういう意味じゃなくて
-pedantic
もつけずに、できたとか言うんじゃないよ馬鹿って言う意味
0778デフォルトの名無しさん
2009/03/22(日) 18:25:44c89ではそうだね
で、突然なんでそんな話を?
0779デフォルトの名無しさん
2009/03/22(日) 18:27:49失礼。勘違いしてたよ。
0780デフォルトの名無しさん
2009/03/22(日) 18:59:010781デフォルトの名無しさん
2009/03/22(日) 19:02:360782デフォルトの名無しさん
2009/03/22(日) 19:02:38無知が騒いでただけだから
0783デフォルトの名無しさん
2009/03/22(日) 19:57:17#include <conio.h>
getch();
だと環境依存で、
getchar()
だとbcc5.5.1で死ぬ。
0784783
2009/03/22(日) 19:58:41(Cで無理ならC++限定でもおk。)
0785デフォルトの名無しさん
2009/03/22(日) 20:01:150786デフォルトの名無しさん
2009/03/22(日) 20:11:03無理じゃね?
制御文を前に置けないから無限再帰になるような
0787デフォルトの名無しさん
2009/03/22(日) 20:11:510788デフォルトの名無しさん
2009/03/22(日) 20:16:140789デフォルトの名無しさん
2009/03/22(日) 20:16:57死ね
0790デフォルトの名無しさん
2009/03/22(日) 20:18:11教えてください。お助け〜
Unix上でPro*Cのプログラムをdbxでデバッグしたいんですが、
ソースがずれてるみたいなんです。
stop in main、run、listとやっているのに、ぜんぜんへんな場所が表示されます。
おそらくCのソースのつもりでブレイクしてるけど、Pro*cのソースが表示されている、
みたいなずれ方だなぁ、と予想しています。
こういう場合どういうぐあいにやると良いのでしょうか?
0791デフォルトの名無しさん
2009/03/22(日) 20:18:200792デフォルトの名無しさん
2009/03/22(日) 20:19:05なんでgetcharが使えないのかわからないけど、fgets あたりが
簡単でいいのでは
#define wait_enter { char buf[10]; fgets(buf, 10, stdin); }
とか
0793デフォルトの名無しさん
2009/03/22(日) 20:20:35これだと意味無いけどこういう奴のこと?
#include<stdio.h>
void countdown(int count){
int temp=count?(printf("%d\n", count),countdown(count-1),1):0;
}
int main(void){
countdown(10);
return 0;
}
0794デフォルトの名無しさん
2009/03/22(日) 20:24:39ありがとう!
これで大丈夫だ
0795785
2009/03/22(日) 20:30:16詩ね
>>791
氏ね
>>793
int f(int n){
return g(n)
}
int g(int n){
int x[]={f(0),f(1),f(2),....(略)};
return x[n];
}
でコンパイルとおるんだろうけど、倫理面
で問題があるような無いような
0796デフォルトの名無しさん
2009/03/22(日) 20:32:00どうみても通らねぇよwwwwwwwww
0797デフォルトの名無しさん
2009/03/22(日) 20:33:380798デフォルトの名無しさん
2009/03/22(日) 20:36:41それが通るコンパイラの名前plz
0799785
2009/03/22(日) 20:37:070800デフォルトの名無しさん
2009/03/22(日) 20:40:140801デフォルトの名無しさん
2009/03/22(日) 20:40:23「所属関数」とは何かという問いに答えないから
答える必要がないという態度に取られたんだろ
それにおまえさんは C89 と言っていた
「問題ない」とは何に対して言ったんだ?
0802デフォルトの名無しさん
2009/03/22(日) 20:45:08えええええ??????
マジで言ってんの!?!?
0803デフォルトの名無しさん
2009/03/22(日) 20:45:25その関数がその関数に依存していないか程度くらい解析して
親切にエラーを出してくれるんだろうけど
このスレの回答者ときたら、頭がどんな石で出来ているのか知りたい
もんだ...
0804デフォルトの名無しさん
2009/03/22(日) 20:53:20だから、どのコンパイラだよ?
具体的に言えってw
0805デフォルトの名無しさん
2009/03/22(日) 20:56:18お花畑な脳みそを持ってる人の御言葉ですから。
0806デフォルトの名無しさん
2009/03/22(日) 20:56:39だからスルーしろと言ったのに…。
0807デフォルトの名無しさん
2009/03/22(日) 21:04:48所属関数=その識別子が所属している関数定義スコープ
という意味だろw
この程度でいちいち揚げ足取らなくてもいいってw
それよか、「問題無い?」って>>795の表現は
コンパイラ作成者にとってか、コンパイラ使用者にとってか
で意味が相当変わってくるだろうけど、
まさかこのスレの目的性から考えるとどう考えても
Cコンパイラ使用者だろ
答えは、「問題あり。処理系依存。コンパイルが通っても
正しく動作することは期待しないほうが良い」
0808デフォルトの名無しさん
2009/03/22(日) 21:08:180809デフォルトの名無しさん
2009/03/22(日) 21:09:110810デフォルトの名無しさん
2009/03/22(日) 21:14:46指示語は適切に使えよ
助け船のつもりか知らんがミイラ取りがミイラだ、それじゃw
0811デフォルトの名無しさん
2009/03/22(日) 21:21:290812デフォルトの名無しさん
2009/03/22(日) 21:23:510813デフォルトの名無しさん
2009/03/22(日) 21:54:56スレ違いな話題だと思いますので、他で議論してください。
0814デフォルトの名無しさん
2009/03/22(日) 22:08:10聞きたいことがあるなら流れぶった切ってでも聞けばいいだろ
自分にできることもやらずに、人のせいにしてろよkz
0816デフォルトの名無しさん
2009/03/22(日) 22:09:42いいよ、聞いてくれ。
ここは2chだ。
0817デフォルトの名無しさん
2009/03/22(日) 22:12:50入門者向けの話題かどうか判断出来てる時点で
少なくとも初心者じゃないの、出来ればここで
議論してよその初心者スレにはいって迷惑
かけないで欲しいと思いまつ。
あとスレタイトル見ればわかるように
入門者向けスレなので、初心者に常に
適しているとは言えない話題も議論
されても良いと思いまつ。
0818デフォルトの名無しさん
2009/03/23(月) 13:12:36OracleとかのプリコンパイラのPro*Cのこと?
あれってSQL入った元ソースをCコードに
トランスレートする奴だよね。
デバッグ作業の時、元ソース見ても多分
ずれる。コンパイラはトランスレートされた
Cソース以外関知しないから。(関知したら
そのコンパイラはアヤシイ)
0819デフォルトの名無しさん
2009/03/23(月) 13:23:57ということで、トランスレートされたCソースをデバッグすればいいと思います。
0821デフォルトの名無しさん
2009/03/23(月) 17:13:310822デフォルトの名無しさん
2009/03/23(月) 17:23:090823デフォルトの名無しさん
2009/03/23(月) 17:30:330825デフォルトの名無しさん
2009/03/23(月) 19:37:23勉強をつまらなくできるでしょうか?
0826デフォルトの名無しさん
2009/03/23(月) 19:43:44C言語に関する書籍の一文字一文字を丹念に読み解くとつまらなく勉強することができます
ためしてみてください
0827825
2009/03/23(月) 19:49:18ありがとうございます。けど
Java言語に関する書籍の一文字一文字を丹念に読み解いてもつまらなく
なりませんでしたが、C言語でも大丈夫でしょうか?
0828デフォルトの名無しさん
2009/03/23(月) 19:52:07それは丹念に読み解くということを本質的に理解していないからですよ
心を無にして、世間というしがらみを開放し、
大自然の恩恵を体に浴びる感じで読み解くことを体得することからはじめなくてはいけませんね
あと10年がんばってください
0829デフォルトの名無しさん
2009/03/23(月) 20:03:47}
はC89では認められていないそうですが本当でしょうか?
0830デフォルトの名無しさん
2009/03/23(月) 20:13:200831デフォルトの名無しさん
2009/03/23(月) 21:00:01mainをvoidとして宣言して「mainの戻り値がない」という警告を消すことができるか。
A:
できない。mainはintを戻り値とし、(適切な型の)0個か2個の引数を持つと
定義しなければならない。
Q 11.14:
void main()と宣言してうまくいかないわけがないと思う。なぜならmainからreturnする代わりに、
exit()を呼んでいるから。だいたい今使っているOSはプログラムのexit値/戻り値を無視する。
A:
mainからreturnで戻ってくるかどうかは関係ないし、そのステータスを見るかどうかも関係ない。
問題はmainの宣言がおかしいと、呼び出し側(実行時のスタートアップのコード)が
mainを正しく呼び出すことすらできないかもしれないことにある
(呼び出しの規約にあるかもしれない不統一による)。
void main()と宣言しても多くのシステムで動くようである。こう書くほうが好都合だと思っていて
移植性についてあまり気にしていないなら、誰も止めはしない。
Q 11.15:
それでは、どうして私の持っている本はmainをvoidと宣言しているのか。
A:
そういう本は間違っているか、void mainがたまたま動くシステム向けに
コードを書くことを想定しているかのどちらかである。
0832デフォルトの名無しさん
2009/03/23(月) 21:40:52もし処理系がmain関数をvoid(void)と定義していれば
それも規格に合致する。
0833デフォルトの名無しさん
2009/03/23(月) 21:47:30それは規格に合致しないかどうかですね。
0834デフォルトの名無しさん
2009/03/23(月) 22:26:330835デフォルトの名無しさん
2009/03/23(月) 22:35:22間違いが少ないんでしょうか?
(仕様問題、設計問題、処理方式の問題、コーディングポカミスを除く)
0836デフォルトの名無しさん
2009/03/23(月) 22:57:05そのとおり。コードは短いほどいい。
> (仕様問題、設計問題、処理方式の問題、コーディングポカミスを除く)
これ以外にあるのかしら?
0837デフォルトの名無しさん
2009/03/23(月) 23:03:150838デフォルトの名無しさん
2009/03/23(月) 23:18:58必要条件であって十分条件ではない。
0839デフォルトの名無しさん
2009/03/23(月) 23:26:33短ければ良いってもんじゃない
0840デフォルトの名無しさん
2009/03/23(月) 23:30:020841デフォルトの名無しさん
2009/03/23(月) 23:31:13良いことですか?
0842デフォルトの名無しさん
2009/03/23(月) 23:31:49短いコードのほうがポカミスは少ない
ちがうか?
0843デフォルトの名無しさん
2009/03/23(月) 23:32:56悪いことです
0844デフォルトの名無しさん
2009/03/23(月) 23:34:27言葉を鵜呑みにする人には危険な言葉
0845デフォルトの名無しさん
2009/03/23(月) 23:34:400846デフォルトの名無しさん
2009/03/23(月) 23:44:57おまい大丈夫か?
同じ多機能で大規模なプログラムを、だらだらと2万行で作るより、きちんと設計して
1万行で作ったものの方が、コーディングにかかるコスト、テスト&デバッグのコストが
小さくなるということだよ。
0847デフォルトの名無しさん
2009/03/24(火) 00:35:35更に偽の戻り値にも3項演算子が入っていて、さらにその3項演算子の中にも3項演算子あって
設計して行数を少なくしました、キリッ!
とか、目に浮かぶw
0848デフォルトの名無しさん
2009/03/24(火) 01:23:210849デフォルトの名無しさん
2009/03/24(火) 04:41:300850790
2009/03/24(火) 07:06:43はい。そうです、オラクルのPro*Cです。
やっぱりずれるんですね。
トランスレートされた奴をソースとして指定すればよいのですね。
ありがとうございます。
ちょっとオプションが分からないので調べてやります。
分からなかったらまたお聞きするかも・・
ありがとうございました。
0851790
2009/03/24(火) 07:07:52pathmapって奴なのかなぁ。。
分からなかったらまたここに聞きに来ます。
0852デフォルトの名無しさん
2009/03/24(火) 07:35:580853デフォルトの名無しさん
2009/03/24(火) 08:08:240854デフォルトの名無しさん
2009/03/24(火) 08:13:47全角も半角も関係ない。草生やしてる段階で低能だろ。
0855デフォルトの名無しさん
2009/03/24(火) 08:18:29void main()
{
while(1) printf("w");
}
0856デフォルトの名無しさん
2009/03/24(火) 09:37:040858デフォルトの名無しさん
2009/03/24(火) 10:51:300859デフォルトの名無しさん
2009/03/24(火) 11:03:24の回答なんて無視無視.推測でしか書いてないだしょ
その点819の回答は潔い。余計な文は
一切無し。すっきりと短くコードしてる。
818が認めているように、偉いのは819。
礼を言うのは819にね。(もう今更求めないけど)
0860デフォルトの名無しさん
2009/03/24(火) 11:32:570861デフォルトの名無しさん
2009/03/24(火) 12:15:50http://www.bohyoh.com/CandCPP/C/Library/strcmp.html
/*--- strcmpの実現例 ---*/
int strcmp(const char *s1, const char *s2)
{
while (n && *s1 && *s2) {
if (*s1 != *s2) /* 等しくない */
return ((unsigned char)*s1 - (unsigned char)*s2);
s1++;
s2++;
n--;
}
if (!n) return (0);
if (*s1) return (1);
return (-1);
}
の変数 n が突然出てきているのがよくわかりません
これはなんでしょう
0862デフォルトの名無しさん
2009/03/24(火) 12:18:50>>819 は尤もな意見だってのと
俺自身 Pro*C は解るが dbx はあんまし知らないって理由で
スルーしたんだが、こんだけ引っ張られるとは思わなんだ。
>>818
>コンパイラはトランスレートされた
>Cソース以外関知しないから。
Pro*C のオプションに LINES=YES を指定すると
生成されたCコードに、プリプロセッサディレクティブ #lines が
追加され、変換前のソースファイル名と行番号がデバッグ情報に
取り込まれる。
…かも知れない。
(少なくとも MS Visual Studio ではそうなる)
0863デフォルトの名無しさん
2009/03/24(火) 12:19:31バグ。
0864デフォルトの名無しさん
2009/03/24(火) 12:46:510865デフォルトの名無しさん
2009/03/24(火) 12:47:340866デフォルトの名無しさん
2009/03/24(火) 16:49:070867デフォルトの名無しさん
2009/03/24(火) 17:03:530868790
2009/03/24(火) 21:51:11>>819さん、大変失礼いたしました。
ありがとうございました。
>>862さん
ありがとうございます。
ためさせていただきます。
スレッド汚してしまってすみませんでした。
0869デフォルトの名無しさん
2009/03/24(火) 23:38:37Oracle Power Objects使えよ
0870デフォルトの名無しさん
2009/03/25(水) 09:23:53やあ、釣れますか?
0872デフォルトの名無しさん
2009/03/25(水) 10:39:21以下のソースなのですが、
コンパイルは通るが、実行時にエラーがでます。
どなたか、エラー原因を教えていただけないでしょうか?
よろしくお願いします。
===============
#include<stdio.h>
#include<string.h>
int main()
{
int n = 0;
char *str;
sprintf(str,"ほげほげ");
printf("%d",n);
return 0;
}
===============
エラーは実数を出力する際にでているようなのですが・・・・
0873デフォルトの名無しさん
2009/03/25(水) 10:41:18sprintf(str,"ほげほげ"); ここででたらめな場所に"ほげほげ"を書き込んでいる。
0874デフォルトの名無しさん
2009/03/25(水) 10:41:44strが就職難民なので、得体の知れないところに"ほげほげ"をコピーしてしまっています。
strには、"ほげほげ"が入るだけの土地を与えてください。
0875デフォルトの名無しさん
2009/03/25(水) 10:46:550876デフォルトの名無しさん
2009/03/25(水) 10:58:37↓
char str[256];
0877デフォルトの名無しさん
2009/03/25(水) 10:59:190878デフォルトの名無しさん
2009/03/25(水) 11:02:19256はなんですか?魔法の数字ですか?
0879デフォルトの名無しさん
2009/03/25(水) 11:03:41単にキリのいい数字なだけ
0880872
2009/03/25(水) 11:07:50回答ありがとうございます。
ポインタの指す場所が不明だという部分はわかったのですが、
それがなぜ、printf("%d",n)を実行したことでエラーとなって表れるのでしょうか?
逆に言うと↓を以下のようにすると問題なく実行できてしまうんですが・・・
>sprintf(str,"ほげほげ");
>printf("%d",n);
↓
sprintf(str,"ほげほげ",n);
printf("%s",str);
>>877
sprintf関数はstring.hにあるのかと思ったら
stdio.hにありました。ただの勘違いです。
0881872
2009/03/25(水) 11:10:26すいませんコピペミスしました
× sprintf(str,"ほげほげ",n);
○ sprintf(str,"ほげほげ");
0882デフォルトの名無しさん
2009/03/25(水) 11:11:58でたらめな場所に書き込まれるんだから
たまたまうまくいくときもあるだろうし、あとでおかしくなることもある。
0883書いてて飽きたw
2009/03/25(水) 11:21:530884872
2009/03/25(水) 11:35:51つまり、定義のあやふやな文字列があることで
他の出力にも影響を及ぼすかもしれない、ということですか
回答いただきありがとうございました
0885デフォルトの名無しさん
2009/03/25(水) 12:04:06アドレス帳に適当な住所を書いても、自分の土地じゃないと住むことが出来ない。
警察を呼ばれる(エラーが出てくれる)か、たまたま空き地だったので何も起きないかは、
使用しているOSと、その時の状態によって予測できない。
って、この前小6の娘の説明したら、理解してる風だった。
いつか娘マクロが、コーディングしてくれるようになるといいな。
0886デフォルトの名無しさん
2009/03/25(水) 12:06:02順調に病んでいる
0887デフォルトの名無しさん
2009/03/25(水) 12:10:37体で覚えるべし
0888デフォルトの名無しさん
2009/03/25(水) 12:12:32>>790に哀れみをかけられた>>819の姿は涙を誘うなw
0889デフォルトの名無しさん
2009/03/25(水) 12:25:14一律一括に初期化するコードを入れなければならないって
コーディング流儀って美徳ですか?
変数に値を設定するステップが、プロシージャの重要なステップに
なっているようなコードって無駄ですか?
0890デフォルトの名無しさん
2009/03/25(水) 12:27:51どこか病んでいると思う。
0891デフォルトの名無しさん
2009/03/25(水) 13:07:12腐ってると思う。
0892デフォルトの名無しさん
2009/03/25(水) 13:15:420893デフォルトの名無しさん
2009/03/25(水) 13:22:210894デフォルトの名無しさん
2009/03/25(水) 13:27:04意味がないだろう、やっぱり未設定のまま使うんだろうし。
0895デフォルトの名無しさん
2009/03/25(水) 13:27:34「初期化」を整数なら0にすることと言う意味に定義してるなら、その定義がおかしい。
ロジックに対して必要な値にしておくのが「初期化」。
「プロシージャ」が何を指しているかは知らん。
0896デフォルトの名無しさん
2009/03/25(水) 13:40:36ロジックと区別される、セキュリティ対策(バグが発生した場合に
スタックの上に残っているデータから余計な情報が流出する事故
を防止したい場合)や無限ループ突入型のバグ(昔の環境ではリ
セットしなければならない場合もあり、作業の遅滞の原因だった)
防止の為の一括一律初期化は一昔前の貧弱なマシンでの集団開発
作業ではルールだったし、高い事故防止効果を持っていた。
今でもある程度それは有効。Cのようにネィティブコードで実行される
アプリの場合、プロセスを強制終了させると、Windowsとかではリソ
ースリークが起こらないとも限らないからそれが原因になって不安定
になるというのは余り変わってないから。
ただロジックとは区別されるべき初期化はロジックの可読性を損なう
として嫌う人もかなり出てきてるのは、専門プログラマ以外の
人もコードを読んだり資産の一部であると考えるようになってき
ていることが関係してるんじゃないか?
0897(896)
2009/03/25(水) 13:42:48→
+ Cで書かれたアプリのように
0898デフォルトの名無しさん
2009/03/25(水) 14:27:27セキュリティ対策なら逆だろ
ゼロクリアは初期化時ではなく使用終了時であるべき
0899デフォルトの名無しさん
2009/03/25(水) 14:44:54残念ながらすべてのライブラリ関数がそうしてくれてるとは
限らないから
やっぱり最初じゃないと
0900デフォルトの名無しさん
2009/03/25(水) 15:23:58残念ながらすべてのライブラリ関数がそうしてくれてるとは
限らないから
やっぱり最後じゃないと
0901デフォルトの名無しさん
2009/03/25(水) 15:24:470902デフォルトの名無しさん
2009/03/25(水) 15:40:49自分がアホなこと言ってるのに気付いてるかな?
0903デフォルトの名無しさん
2009/03/25(水) 15:44:26>>902
0904デフォルトの名無しさん
2009/03/25(水) 16:04:42標準ライブラリなど、ソースが無いかあっても書き換えることは許されない
ような関数を呼び出した直後に呼び出されたユーザー関数内では、
スタックの一括初期化による「清掃」は、関数の先頭で
やらないと自分の関数のバグで、情報が流出してしまうかもしれないので
やるのがマナーというのなら他の関数が自分の関数終了後に呼び出される
ことを想定して、使用した変数でデータを残す必要が無いものは、
同様に「清掃」をしておくのもマナーになるかも知れないな。
保養所とかの共有物の共同利用とかに比べて常識がちょっと違う感じ。
0905デフォルトの名無しさん
2009/03/25(水) 16:05:03>>902
0906デフォルトの名無しさん
2009/03/25(水) 16:16:460907デフォルトの名無しさん
2009/03/25(水) 16:20:430908デフォルトの名無しさん
2009/03/25(水) 16:29:56/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ まピョーん☆
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
0909デフォルトの名無しさん
2009/03/25(水) 16:51:060910デフォルトの名無しさん
2009/03/25(水) 16:52:360911デフォルトの名無しさん
2009/03/25(水) 16:55:440912デフォルトの名無しさん
2009/03/25(水) 16:58:19だいたい、自分がこの世に生まれてプログラミングをし始めて何年経った?
死ぬまでそうしているの?悪い、俺はそいつらを利用して金儲けすることにしたわ。
だるい。PCの前であーだこーだ必死に考えて、無機質な物体を相手に必死になって
ムキになって、馬鹿らしいわ。そんな詰まらない人生を送りたいとは思わない。
なんで理系に進んだんだろう?別に生まれたときから理系に進学する予定はなかった。
高校で理数科に所属したがために、英語がやりたかったのに数学を主に学ぶ選択肢を
選んだわけでもないのに、大学でC言語を2単位程度だが必須科目で履修して
今を生きているわけだが。ネットワークの管理をしていても良いかもな。
お前らの馬鹿発言を目の当たりに出来て、笑えるw
0913デフォルトの名無しさん
2009/03/25(水) 17:16:32空気読んでないし長文必死過ぎ
どうせ国家試験の勉強でも始めるんだろ?www
0914デフォルトの名無しさん
2009/03/25(水) 17:23:05だろw
文体がずいぶん変わるな
0915デフォルトの名無しさん
2009/03/25(水) 17:24:260916デフォルトの名無しさん
2009/03/25(水) 17:40:340917デフォルトの名無しさん
2009/03/25(水) 18:29:120919デフォルトの名無しさん
2009/03/25(水) 21:18:070920デフォルトの名無しさん
2009/03/25(水) 22:38:09本を読む前と後に手を洗えって、
図書カードのポケットに書いてあったろ。
0921デフォルトの名無しさん
2009/03/25(水) 22:51:22具体的には、ミニマックス法で最善手を探してその座標を引数へのポインタでセットする関数があり、
いつもは適切に動いていると思うのですが、終盤になると置けない場所に打とうとする時があるのです。
よく見ると自分が前回打った場所と同じ場所に打とうとしてくるようですが
ソースからはどこがおかしいのか判らない状況です。
評価関数は自分の石の数 - 敵の石の数という単純なものです。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9001.zip
なおソースはコンピュータvsコンピュータになっており
もう一人のコンピュータは別のアルゴリズムで乱数で判断するので
ゲームが正常に終了するときと、エラーになるときとがあります。
どうぞよろしくお願いします。
0922デフォルトの名無しさん
2009/03/25(水) 22:55:440923デフォルトの名無しさん
2009/03/25(水) 22:56:38intの変数に0を代入することが手を洗うことなのか
ということ。
0924デフォルトの名無しさん
2009/03/25(水) 23:15:55まず乱数の使用をやめて現象の再現手順を見つけろ
0925デフォルトの名無しさん
2009/03/25(水) 23:26:54void fun(char *a[]){
int i;
for(i=1;i<=10;i++){
a[i]="test";}}
void main(void){
char cr[10][100];
int i;
fun(cr);
for(i=0;i<=10;i++){
printf("test->%s\n",cr[i]);
}}
上記の様なことをしたいのですが、どの様に訂正したら問題なく動くのでしょうか?
0926デフォルトの名無しさん
2009/03/25(水) 23:30:070927デフォルトの名無しさん
2009/03/25(水) 23:35:060928デフォルトの名無しさん
2009/03/25(水) 23:42:59何をさておいてもまず、for 文の中の i の初期値と終了条件が正しいか確かめること。
君が何をしたいのかについては二通りの解釈がある。
ポインタの配列の各要素に文字列リテラルを指させたいのか、
文字配列の配列の各要素に文字列を格納したいのかだ。
まず、君自身がこの違いを理解しているか。
前者は、メモリ空間上のどこかに用意された固定の文字列の場所を、
配列の要素それぞれに覚えこませるだけである。
後者は、文字配列というメモリ空間を意識的に用意して、
そこに目的の文字列の内容をコピーすることである。
前者ならば、cr は以下のように宣言しなければならない。
char *cr[10];
後者ならば、fun() は以下のように定義されなければならない。
void fun(char a[][100]){
int i;
for(i=0;i<10;i++){
strcpy(a[i], "test"); /* 安全上は問題がある可能性がある */
}
}
なお、main() における printf() の呼び出しは変更する必要がない。
これは、cr[i] が配列(後者)であっても、ポインタに成り下がることによって
cr[i] がポインタ(前者)であった場合と同じことになるからである。
なぜ fun() の呼び出しでは同じことが起きないかと言えば、
ポインタの配列(前者)はポインタへのポインタに成り下がるが、
配列の配列(前者)は配列へのポインタに成り下がるからである。
0929デフォルトの名無しさん
2009/03/25(水) 23:44:58○配列の配列(後者)は
0930デフォルトの名無しさん
2009/03/26(木) 00:23:21>>928さん
ホントありがとうございます。
これで明日、作業を進めることが出来ます。
>>928さんホント丁寧な説明ありがとうございました。
0931デフォルトの名無しさん
2009/03/26(木) 00:26:38#include <stdio.h>
#include <string.h>
void fun(char (*a)[100])
{
int i;
for (i = 0; i < 10; i++)
sprintf(a[i], "test %d", i);
}
int main(void)
{
char cr[10][100];
int i;
fun(cr);
for (i = 0; i < 10; i++)
printf("test->%s\n", cr[i]);
return 0;
}
0932デフォルトの名無しさん
2009/03/26(木) 12:44:39マルチかよ。
あっちで答えちまった。
http://pc12.2ch.net/test/read.cgi/tech/1233404556/55-56
0933デフォルトの名無しさん
2009/03/26(木) 15:17:45お前向こうで答えてるのあれ間違ってるじゃん。
あれじゃ3次元配列を受け取る意味になっちまうぞ。
0934932
2009/03/26(木) 15:28:07確かに3次元配列が2次元配列へのポインタに成り下がることを考えればそうだな。
だが2次元配列へのポインタを受け取るという意味では間違っていない。
char cr[10][100];
fun(&cr);
こういう渡し方を知らんのか?
0935デフォルトの名無しさん
2009/03/26(木) 15:57:48大本が2次元配列になってるのでgdgdだからな
0936デフォルトの名無しさん
2009/03/26(木) 16:03:33なにそれ意味ないじゃん
配列渡しは配列へのポインタを渡しているので
わざわざアドレス渡しをする意味がわからない
0937デフォルトの名無しさん
2009/03/26(木) 16:13:140938デフォルトの名無しさん
2009/03/26(木) 16:30:42fun(cr);
とするならば
1.void fun(char a[10][100]);
2.void fun(char a[][100]);
3.void fun(char (*a)[100]);
の何れかになる
1.が一番分かりやすいが[10]の10は無視されるので2.と同一
2.の引数a[]はポインタ*aと同義になるので3.と同一
3.は初心者には分かりづらいので、やっぱ2.がお奨めかな
0939デフォルトの名無しさん
2009/03/26(木) 16:38:01char型の2次元配列(n行100列)の先頭アドレスを格納した変数
0940デフォルトの名無しさん
2009/03/26(木) 17:02:111. がいいと思うよ。10が無視されるとしても
0941デフォルトの名無しさん
2009/03/26(木) 17:10:55VC9でReleaseにしたらfun()が消えてインライン化されちまった
0942デフォルトの名無しさん
2009/03/26(木) 17:16:01struct foo { char elem[100]; };
void fun(struct foo* a); /* void fun(struct foo a[]); */
0943デフォルトの名無しさん
2009/03/26(木) 17:16:240944デフォルトの名無しさん
2009/03/26(木) 17:24:20残念、違うよ。お前が必死なだけ
0945デフォルトの名無しさん
2009/03/26(木) 18:13:370946デフォルトの名無しさん
2009/03/26(木) 18:17:2810 とは限らないところに 10 と書いてあるのは美しくないと思うが?
0947デフォルトの名無しさん
2009/03/26(木) 18:23:20俺もそう思う。
むしろ行数は別パラメータで渡すようにするべき。
どうせ無視されるのだから。
C++なら配列もサイズ毎渡せるんだがな。
0948デフォルトの名無しさん
2009/03/26(木) 18:32:55typedef struct {
char cr[10][100];
} AA;
void fun(AA* paa)
{
int i;
for (i = 0; i < 10; i++) {
sprintf(paa->cr[i], "hoge %d", i);
}
}
int main()
{
AA aa;
int i;
fun(&aa);
for (i = 0; i < 10; i++) {
printf("%s\n", aa.cr[i]);
}
return 0;
}
0949デフォルトの名無しさん
2009/03/26(木) 18:37:290950デフォルトの名無しさん
2009/03/26(木) 18:56:42いからこそ、2次元配列以上になると引数で渡すのには一苦
労も二苦労もしなければならない。例えば構造体でくるんで
渡すように。
例えば
char a[1000];void f(char*);で
f( (char*)&a );とかf(&a)と書くべきところを
f(a)と書いても通るのは、慣習に従ってコンパイラが融通を利かせて
くれてるだけ
0951デフォルトの名無しさん
2009/03/26(木) 18:59:17/V\ |
/◎;;;,;,,,,ヽ |
_ ム::::(,,゚д゚):| J
ヽツ.(ノ:::::::::.:::::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
0952デフォルトの名無しさん
2009/03/26(木) 19:06:07strcpy(&a, "hello, world");
0953デフォルトの名無しさん
2009/03/26(木) 19:13:45それ自体のアドレスはない
だからして&(アドレス取得演算子)は使えないぞなもし
0954デフォルトの名無しさん
2009/03/26(木) 19:17:32> f(&a)
wwwwwwwwwwwwwwwwww
0955デフォルトの名無しさん
2009/03/26(木) 19:18:49おまえもか
馬鹿ばっか>>953
0956デフォルトの名無しさん
2009/03/26(木) 19:24:310957デフォルトの名無しさん
2009/03/26(木) 19:25:30( ゚,_ゝ゚)バカジャネーノ
0958デフォルトの名無しさん
2009/03/26(木) 19:41:17ま
f((char*)&(a[0]) );
とか
f( & (a[0] ) );
だな
配列名(アドレスが定義されていない識別子)にアドレス取得
演算子を直接使えると誤解されかねない慣習解釈は問題があるな
だが最近のコンパイラではf( &a )でも通る。C++の影響かな?
0959デフォルトの名無しさん
2009/03/26(木) 19:42:46どっちなんだよ・・。
配列名は単純に先頭配列へのポインタって理解じゃダメなんかね。。
0960デフォルトの名無しさん
2009/03/26(木) 19:45:280961デフォルトの名無しさん
2009/03/26(木) 19:50:47ポインタ=アドレスを格納する変数
という定義に従えば
配列名は変数でないからアウツ
0962デフォルトの名無しさん
2009/03/26(木) 19:52:25通るには通ってるだろ
警告が出るが止まりはしていない
6.3.2.3で認められているし
0963デフォルトの名無しさん
2009/03/26(木) 19:56:54アドレスは取れるだろ
0964デフォルトの名無しさん
2009/03/26(木) 20:04:44そのツッコミはちょっと不親切じゃね。
「配列」のアドレスはとれるけど、「配列の先頭」のポインタとして渡されないってんじゃなかったっけ
0965デフォルトの名無しさん
2009/03/26(木) 20:09:28&a[0]にしたら問題なく通るけど、
&aなら通らないけどな・・。
0966デフォルトの名無しさん
2009/03/26(木) 20:14:49§6.3.2.3にはそんな事書いてねえだろ
よく読み返してみろ
0967デフォルトの名無しさん
2009/03/26(木) 20:17:550968デフォルトの名無しさん
2009/03/26(木) 20:19:09何か目標を持て。
ゲームを作るとか、人工知能対戦ロボットを作るとか。
0969デフォルトの名無しさん
2009/03/26(木) 20:19:557
0970デフォルトの名無しさん
2009/03/26(木) 20:32:50その辺実装依存だったりするし、深入りしない方が良いんじゃないかなあ
普通は
1.配列とポインタは異なる
2.「関数の引数内の配列名」は、ポインタ
3.「式中の配列名」は、ポインタ
とかだけ覚えとけば、書くのも読むのも問題ないんじゃね
0971デフォルトの名無しさん
2009/03/26(木) 20:36:00JIS X3010:2003だよな?
7なんてどこにある?
0972デフォルトの名無しさん
2009/03/26(木) 20:37:060973デフォルトの名無しさん
2009/03/26(木) 20:40:13|3つの例外を除いて、配列の最初の要素を指すポインタに意味が格下げになる。
|結果としてできるポインタの型は「Tへのポインタ」となる。
|
|3つの例外とは、
|1) 配列がsizeofのオペランドとなるとき
|2) アドレス演算子&のオペランドとなるとき
|3) )char型の配列を文字列リテラルで初期値するとき
|を指す。
配列に&が使えないとか言ってるのは以前からいる馬鹿なので放置で。
0974デフォルトの名無しさん
2009/03/26(木) 20:40:53アドレス演算子のオペランドになり得る。
(但し、演算結果は単なるポインタではなく、「配列を指すポインタ」)
実装依存じゃないし、C90から変わってない。
因みに、BCC はその辺バグ多し。
0975デフォルトの名無しさん
2009/03/26(木) 20:42:02ISO/IEC 9899:1999 (E)
JIS には段落番号がついてないから自分で字下げを数える
0976デフォルトの名無しさん
2009/03/26(木) 20:45:500977デフォルトの名無しさん
2009/03/26(木) 20:47:19>>970のこといってるなら、ANSI Cにあるだろ
6.2.2.1に、「式中の配列名が、コンパイラによって配列の最初の要素へのポインタとして扱われる」
6.7.1に、「関数の引数宣言中の配列名は、コンパイラによって配列の最初の要素へのポインタとして扱われる」
この辺まではどのコンパイラでもちゃんと実装されてる。
&演算子で「配列のアドレス」を取得するときの挙動が、なんかまちまちな気がするんだが。
0978デフォルトの名無しさん
2009/03/26(木) 20:47:24理解してれば文脈で区別できるんだけどね
なるべくなら面倒がらずにポインタ値/ポインタ変数と書き分けたほうがいい
0979デフォルトの名無しさん
2009/03/26(木) 20:48:16違うよ
配列はポインタに成り下がらないとか
&演算子は使えないとか言ってるバカのほうだよ
0980デフォルトの名無しさん
2009/03/26(木) 20:50:06おまえはなにをいってるんだ
「規約で決まっていることが、正しく実装されているとは限らない」という意味で実装依存といったが、あんまりそういう言い方はしないか。
規約で決まっていないことは、不定って書くだろ。
0981デフォルトの名無しさん
2009/03/26(木) 20:51:37春だなぁ・・・
0982デフォルトの名無しさん
2009/03/26(木) 20:53:13実装ごとに異なってもよいことになっている動作のこと。
実装が規格に従っていないのならそれはもはや実装依存以前の問題だ。
0983デフォルトの名無しさん
2009/03/26(木) 20:55:18オブジェクト型または不完全型へのポインタは、他のオブジェクト型又は不完全型
へのポインタに型変換できる。その結果のポインタが、被参照型に対して正しく
境界調整されていなければ、その動作は未定義とする。そうでない場合、再び
型変換で元の型に戻すならば、その結果は元のポインタと比較して等しくなければ
ならない。オブジェクトへのポインタを文字型へのポインタに型変換する場合、その
結果はオブジェクトの最も低位のアドレスを指す。その結果をオブジェクトの大きさまで
連続して増分すると、そのオブジェクトの残りのバイトへのポインタを順次生成できる。
えーと、これがJISの該当部分なんですけど、これと配列に&演算子を付けるのとは
どういう関係があるんでしょうか?どうしてもわかりませんでした。
0984デフォルトの名無しさん
2009/03/26(木) 21:15:040985デフォルトの名無しさん
2009/03/26(木) 21:17:20cr へのポインタは、char
へのポインタに型変換できる。その結果のポインタが、char 型に対して正しく
境界調整されていなければ、その動作は未定義とする。そうでない場合、再び
型変換で char(*)[100] に戻すならば、その結果は &cr と比較して等しくなければ
ならない。cr へのポインタを文字型へのポインタに型変換する場合、その
結果は cr の最も低位のアドレスを指す。その結果をオブジェクトの大きさまで
連続して増分すると、cr の残りのバイトへのポインタを順次生成できる。
要は cr がオブジェクトかどうかだ
0986985
2009/03/26(木) 21:19:050987985
2009/03/26(木) 21:25:36a へのポインタは、char
へのポインタに型変換できる。その結果のポインタが、char 型に対して正しく
境界調整されていなければ、その動作は未定義とする。そうでない場合、再び
型変換で char (*)[1000] に戻すならば、その結果は &a と比較して等しくなければ
ならない。a へのポインタを char 型へのポインタに型変換する場合、その
結果は a の最も低位のアドレスを指す。その結果を a の大きさまで
連続して増分すると、a の残りのバイトへのポインタを順次生成できる。
今日は早寝すんべ
0988934
2009/03/26(木) 21:55:13・structでくるんだ例が>>942で出てるが結局はそれと同じこと
・文字列は終端が分かるからいわば可変長配列のように扱えるから添え字を消してもかまわない。
 しかし,>>934の場合「10×100の配列」(ただし渡すときはポインタお願い)であることを
 強制したい/できることに意味があるわけで。
設計の問題であって,意味が無いわけではないからな。ぷんぷん。
0989デフォルトの名無しさん
2009/03/26(木) 22:15:50#include <stdio.h>
#include <string.h>
void fun(char (*a)[10][100])
{
int i;
for (i = 0; i < 10; i++)
sprintf(a[0][i], "test %d", i);
}
int main(void)
{
char cr[10][100];
int i;
fun(&cr);
for (i = 0; i < 10; i++)
printf("test->%s\n", cr[i]);
getchar();
return 0;
}
0990デフォルトの名無しさん
2009/03/26(木) 23:02:470991デフォルトの名無しさん
2009/03/26(木) 23:09:240992デフォルトの名無しさん
2009/03/26(木) 23:10:420993デフォルトの名無しさん
2009/03/26(木) 23:20:300994デフォルトの名無しさん
2009/03/26(木) 23:44:570995デフォルトの名無しさん
2009/03/27(金) 01:18:55母国語として使う人が一番多いんだよな・・・まぁ、地方によって差はあるけどな。
0996デフォルトの名無しさん
2009/03/27(金) 01:22:290997デフォルトの名無しさん
2009/03/27(金) 01:26:12どんなものか?母国語、国籍に拘らずとも日常生活で使う言語としては
より多くの国で選択されるが、現実的に見ると、ヨーロッパ、中東は無視できない。
その他、植民地、支配された国はその支配国の言葉が公用語として使われているが
中には原住民の言葉も根強く残っている国もある。世界は広いぞ。
己の浅はかな知識で語ることなかれ。
0998デフォルトの名無しさん
2009/03/27(金) 01:33:34それらがいくつか合わせると結構な人数にはなる。
http://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%B3%E3%83%93%E3%82%A2
http://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%8D%E3%82%AC%E3%83%AB
こんな地形で囲まれた国もあるわけだが、公用語は英語、フランス語。
しかし、島国ジャポネーゼでは考えもしないだろう。陸地で接する国境。
渡航せずにお隣の国に行けるのだが、隣の県が別の国の言葉みたいなものだ。
まぁ、そんな状況説明はともかく、南米にしろヨーロッパ諸国の領地、支配下の国は
普通に存在する。しかし、英語は扱いやすい。エスパニョールやフレンチ、イタリアーノは
ちょっと英語ができる俺でも、肌に合わない。
0999デフォルトの名無しさん
2009/03/27(金) 01:34:51我 是 日本人、不是 中国人 なんで、そこんとこよろしくー
1000デフォルトの名無しさん
2009/03/27(金) 01:35:06同じ言語としてくくるのは非常に政治的と言わざるをえないけどね。
「中国語」なんてものがあるのかどうかすら怪しい。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。