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

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

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

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

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

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 104
http://pc5.2ch.net/test/read.cgi/tech/1110099763/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:05/03/18 12:38:40
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.cygwin.com/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003
http://msdn.microsoft.com/visualc/vctoolkit2003/

【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
3デフォルトの名無しさん:05/03/18 12:41:05
修正は次スレ移行お願いします
4デフォルトの名無しさん:05/03/18 12:41:28
>>3
何語だ俺
5デフォルトの名無しさん:05/03/18 12:45:48
>>1
乙。隔離されなくなったね。
6デフォルトの名無しさん:05/03/18 13:07:46
ねずみ,うし,とら
という文字列を
ねずみ
うし
とら
の3つに分割するにはどうすればいいですか?
7デフォルトの名無しさん:05/03/18 13:25:16
CSV
宿題っぽ
8デフォルトの名無しさん:05/03/18 13:32:35
>>6
strtok を使う。但し、日本語文字列が入っている場合は誤分割する可能性もあるので注意。
9デフォルトの名無しさん:05/03/18 13:37:12
>>7,8
説明が下手なので、自分なりに分かりやすく書いたら
宿題っぽくなってしまいました・・・すみません
ありがとうございました
10デフォルトの名無しさん:05/03/18 14:43:37
>>6
use sscanf()
11デフォルトの名無しさん:05/03/18 15:09:34
>>10
使っても文字列は分割されない。
12デフォルトの名無しさん:05/03/18 19:02:03
>>11
','で分割することはできるよ
13デフォルトの名無しさん:05/03/18 20:09:54
>>12
私の環境では出来ませんでした。

【ソースプログラム】
/* separatebycomma.c */
#include <stdio.h>

int main(int argc, char** argv)
{
char* str = "ねずみ,うし,とら";
char s[3][7];
int i;

sscanf(str, "%s,%s,%s", s[0], s[1], s[2]);
for (i=0; i<3; i++)
printf("%s\n", s[i]);
return 0;
}

【実行結果】
>separatebycomma
ねずみ,うし,とら
うし,とら


>
14デフォルトの名無しさん:05/03/18 21:05:23
こんなでできた、けど、実装依存?

#include <stdio.h>
char s1[7], s2[5], s3[5]; /* '\0'が入らないのでここ */
main()
{
sscanf("ねずみ,うし,とら", "%6c,%4c,%4c", s1, s2, s3);
printf("[%s|%s|%s]\n", s1, s2, s3);
}
15デフォルトの名無しさん:05/03/18 21:09:10
>>14
うし,ねずみ,とら に変更するにはソースを書き直さないといけないのか
汎用性のかけらも無いソースだ
16デフォルトの名無しさん:05/03/18 21:12:33
>>13
sscanf(str, "%[^,],%[^,],%[^,]", s[0], s[1], s[2]);

>>14
仮名一文字が2バイトとは限らない。
1713:05/03/18 21:23:00
>>16
実行結果は変わりませんでした。

全角文字の入った文字列に ','(コンマ)に該当する文字コードが含まれているか、
そうでなければ sscanf で文字列を区切り文字で分割すること自体が出来ないのでは?
後で Linux 環境でも試してみます。

strtok を使って、

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

/* 中略 */
char* str = "ねずみ,うし,とら";
char* ptr;
・・・・・・

ptr = strtok(str, ",");
while (ptr) {
printf("%s\n", ptr);
ptr = strtok(NULL, ",");
}

/* 以下略 */

とすれば問題なく出来ます。
18デフォルトの名無しさん:05/03/18 21:30:20
Win2000 Borland C++ 5.5.1
普通に出たが。
1910:05/03/18 21:37:28
しかし、なんでこんな初心者向けネタ引き摺ってるんだ?

>>17
>全角文字の入った文字列に ','(コンマ)に該当する文字コードが含まれているか
確認してから書け。

>sscanf で文字列を区切り文字で分割すること自体が出来ないのでは?
憶測を書くな。

>実行結果は変わりませんでした。
試したソースを貼ってみろ。
20デフォルトの名無しさん:05/03/18 21:55:36
>>19
Please Use your head and skill , Show me your nice code.
21デフォルトの名無しさん:05/03/18 22:04:51
もう出てると思うが・・・
あふれるからniceとは言わないけど。
22415:05/03/18 22:15:29
>>19
>>全角文字の入った文字列に ','(コンマ)に該当する文字コードが含まれているか
>確認してから書け。
確認したところ、少なくとも SJIS では「ねずみ」「うし」「とら」のいずれにもコンマに該当するコードがないことを確認しました。

>>sscanf で文字列を区切り文字で分割すること自体が出来ないのでは?
>憶測を書くな。
現に私の環境では出来なかったので、少なくとも C の標準的な仕様(ANSI等)では保証されていないことだけは確かです。
そうでなければ、私の持っている C コンパイラに欠陥(仕様に違反しているなど)があるのでしょう。

>>実行結果は変わりませんでした。
>試したソースを貼ってみろ。
すみません、コンマとピリオドを間違えていたので今訂正して再びコンパイル・実行しました。
(長くて1レスに入りきらなかったので、ソースコードと実行結果は次レスに書きます)
23415:05/03/18 22:19:21
続きです。

【ソースコード(separatebycomma2.c)】
#include <stdio.h>

int main(int argc, char** argv)
{
char* str = "ねずみ,うし,とら";
char s[3][7];
int i;

sscanf(str, "%[^,]%[^,]%[^,]", s[0], s[1], s[2]);
for (i=0; i<3; i++)
printf("%s\n", s[i]);
return 0;
}

【実行結果】
>separatebycomma2
ねずみ


>
【以上】

実行結果は変わりましたが、期待通りの実行結果にはなりませんでした。
よって、C言語の仕様上 sscanf を使った文字列分割は保証されていないと言えます。
後で Linux 環境でも試してみますが、おそらく正常に実行されないでしょう。
24デフォルトの名無しさん:05/03/18 22:22:54
sscanf(str, "%[^,],%[^,],%[^,]", s[0], s[1], s[2]);
糸冬了
25デフォルトの名無しさん:05/03/18 22:25:56
>>23
まず最初に自分を疑えよ・・・
26デフォルトの名無しさん:05/03/18 22:35:44
人の意見も聞かず自分だけの世界に閉じこもって
仕様仕様って……
27415:05/03/18 22:51:47
>>24
どこがおかしいんですか?

>>25
少なくとも文法上は間違っていないはずです(コンパイラを通ったので)。
問題があるとすれば
s[0] -> &(s[0][0])
とかだと思いますが、この場合 s[0] と &(s[0][0]) は同じもの(アドレス)を指します。

>>26
人の意見をちゃんと聞いて、それに忠実に従ってプログラムを書いてコンパイル・実行した結果が
おかしいのですが・・・
もし私が人の意見を聞いていないというならば、具体的にどの意見を聞いていないかを
教えていただけますか?
もしどなたかの意見を聞いていなかったり何らかの間違いがあれば素直に認めます。

自分の正当性を意地でも主張するつもりはありません。
ただ、私の環境で>>16さんのコードなどを実行した結果正常に動作しなかったという事実を伝え、
その原因が
>>16さんのコードが標準的なC言語の仕様で期待通りの動作が保証されていない(たとえ多くの場合問題がないとしても)
・当方の環境に問題がある(インストールしたCコンパイラ(フリー)のバグなど)
のいずれかであると考えている、と言っているだけです。
2813:05/03/18 22:53:03
>>27の名前欄は入力ミスです。すみません。
29デフォルトの名無しさん:05/03/18 22:53:35
>>27
一 字 一 句 間 違 え ず に 打 て ! !
30デフォルトの名無しさん:05/03/18 22:58:35
(・∀・)ニヤニヤ
31デフォルトの名無しさん:05/03/18 23:04:13
printf("%p\n", (void *)0);
これって仕様としては何が出力されるのが正しいのですか?
32デフォルトの名無しさん:05/03/18 23:05:57
>>27はわざと間違えて釣りを楽しんでるんだろ
暇なこった
3327:05/03/18 23:15:11
>>29
すみません、sscanf の第2引数の文字列を写し間違えました。
コンマが多くて見づらかったので、つい間違えてしまいました。
コピペして再び試してみたら、正常に実行されました。

(自分で設定したフォントの環境で)見づらいプログラムをコピペしないで書き写してしまったのが
ミスの原因でした。すみません、お騒がせしましたm(_ _)m
34デフォルトの名無しさん:05/03/18 23:21:55
>>31
%pの出力形式は処理系定義。「正しい出力」はコンパイラによって違う。
(出力するのが[ナ|ヌ]ルポインタかどうかには関係ない。)
3527:05/03/18 23:27:32
>>31
0 だと思いますが・・・
当方の環境では「00000000」と表示されました。

ヌルポインタは、それを指しているポインタ変数に値を入力しない限り、
ただの 0 です。

FILE* fp;

if ((fp = fopen("something.txt", "rt")) == NULL) {
/* エラーメッセージを表示 */
exit(0);
}

とかで、fopen に失敗したら fp に NULL(= 0) が代入されることを考えれば、
ヌルポインタ の値(この場合は fp )は 0 で、それを指すもの(この場合は *fp )は存在しない、
という解釈でいいと思われます。

>>32
釣りではありません。(目が悪いから)小さな記号を見落として、それに気づかなかったんです。
36デフォルトの名無しさん:05/03/18 23:38:16
>>1
37デフォルトの名無しさん:05/03/18 23:39:13
>>27 が釣りでないのは信用しても良いが、
>>35 はどう見ても釣りにしか見えん。
38デフォルトの名無しさん:05/03/18 23:46:33
あんま関係ないが、自分がよく使う環境の printf() は
printf("%s", 0); とすると「(null)」なんて結果になるな。
3935:05/03/19 00:18:02
>>37
試しにフォントを「MS Pゴシック 9pt」にして>>16の前半を読んでみて下さい。
どれだけ見づらいかが分かりますから。
40デフォルトの名無しさん:05/03/19 00:31:31
言い訳スンナボケ
41デフォルトの名無しさん:05/03/19 00:32:43
コンマではなくカンマだ ぼけ
42デフォルトの名無しさん:05/03/19 00:45:19
0.01
レイコンマレイイチ(水泳とかで)
43デフォルトの名無しさん:05/03/19 00:47:48
さかさまからよんでみろ!
4435:05/03/19 00:58:44
>>40
言い訳じゃなくて、「釣りではない」と言っただけです。

>>41
ttp://www.excite.co.jp/dictionary/english_japanese/?search=comma&match=beginswith&dictionary=NEW_EJJE&block=36172&offset=4
発音記号を見ても「カンマ」と「コンマ」の2通りあるから、「コンマ」が間違いとは言えません。
「コンマ」の方がよく使われるし分かりやすいと思ったから「コンマ」と書いたんです。
NULL の正しい読みを「ナル」だと思っている人が多いけど実はドイツ語だから「ヌル」が正しいように、
もしかしたら comma も英語以外の言語が由来で「コンマ」が正しい、という可能性もあります。
日常生活でよく使うほうを使えばそれでいいじゃないですか。
45デフォルトの名無しさん:05/03/19 01:00:54
自分のミスを正当化したいだけだろ
46デフォルトの名無しさん:05/03/19 01:01:23
もう、コンマじゃなくてマンコって呼べばいいじゃん。
47デフォルトの名無しさん:05/03/19 01:02:10
comma==カンマ
null==ナル
だ、それぐらい おぼとけ ぼけ
48デフォルトの名無しさん:05/03/19 01:02:38
> NULL の正しい読みを「ナル」だと思っている人が多いけど実はドイツ語だから「ヌル」

いいえドイツ語じゃないです。
4910:05/03/19 01:02:40
やっと帰れた。

>>39
自分が如何にプログラミングに向いていないか理解できたかね。
50デフォルトの名無しさん:05/03/19 01:04:21
英語のnullは、フランス語もしくはラテン語のnullusが語源。
だから「ナル」が正解。ドイツ語はそれからの派生。

voidはフランス語が語源。
51デフォルトの名無しさん:05/03/19 01:32:51
ウソをウソと・・・・
52デフォルトの名無しさん:05/03/19 01:39:39
いい加減見苦しい。
53デフォルトの名無しさん:05/03/19 01:40:44
おまえがな
5435:05/03/19 01:43:11
>>45
ミスについては私が悪かった、その原因は文字が小さくて読みづらかったから、と言っているだけです。
「釣りではない」というのが「自分を正当化している」と解釈される方が不思議です。

>>47
>comma==カンマ
これは間違っていません。でも、「コンマ」も間違っていません。

>null==ナル
それは英語の発音です。書店で独和辞典を立ち読みして null を調べれば載っていますし、
発音が「ヌル」だと分かるはずです。ドイツ語は基本的にローマ字風に発音するので。

ドイツ語の null(ゼロの意味) → 英語圏に伝わって「ナル」と読まれる → 日本に伝わって、null は英語由来だと思われる

だから、null==ヌル が本当で、null==ナル は本来の読み方ではありません。

>>48
ドイツ語の授業で習ったので間違いありません。null は「ヌル」と発音し、意味は「0(ゼロ)」です。

>>49
プログラミングのスキルと視力は別問題です。

>>50
>英語のnullは、フランス語もしくはラテン語のnullusが語源。
>だから「ナル」が正解。ドイツ語はそれからの派生。
それは知りませんでした。調べてみます。

>voidはフランス語が語源。
それはうろ覚えですが聞いたことがあります。
55デフォルトの名無しさん:05/03/19 01:48:55
ソースに書かれている意味を理解しようともせず、視力のせいか。
スキルも無いし、見苦しい。
56デフォルトの名無しさん:05/03/19 01:48:59
> でも、「コンマ」も間違っていません。

いいえ。カンマです
57デフォルトの名無しさん:05/03/19 01:49:49
> ドイツ語の null(ゼロの意味) → 英語圏に伝わって

こういうデマを平気でいうのが ぼけ
フランス語や英語が先。
ドイツ語があと
5810:05/03/19 01:51:17
>>54
漢字コードについて、調べもしないで憶測で書く。
調べるとなったらコード全体について調べずに該当文字のみを調べる。
コードについて、コピペせずに自分で入力する。
巧く動かないとなったらコピペも試さず他人の指摘を間違いと思い込む。
挙句自説に拘泥する。
枚挙に暇がないが、どれもこれもプログラマ(というよりはモノ作り全般)に向かない資質だと思うがね。
59デフォルトの名無しさん:05/03/19 01:53:34
> 向かない資質

こいつぼけ。向くのは「資質」だか、
向かないのは資質とは よばん。

おまえぼけすぎ
60デフォルトの名無しさん:05/03/19 01:54:11

こんまつけだく
61デフォルトの名無しさん:05/03/19 01:58:54
>向くのは「資質」だか
?
62デフォルトの名無しさん:05/03/19 02:08:35
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void hoge(char* str, char *foo[]);
int main()
{
char foo[2][8];
char str[256] = "123,abc";
hoge(str, (char**)foo);
printf("%s:%s\n", foo[0], foo[1]);
return 0;
}
void hoge(char *str, char *foo[])
{
char* temp;
temp = strtok(str, ",");
puts(temp);
strcpy(foo[0], temp);
temp = strtok(NULL, ",");
puts(temp);
strcpy(foo[1], temp);
}

writtenになることができないとエラーが出ます
どうにかしてください
63デフォルトの名無しさん:05/03/19 02:16:15
>>62
どうにもする気にはならんが、fooの関数への渡し方が間違い。
64デフォルトの名無しさん:05/03/19 02:19:43
void hoge(char* str, char **foo);
void hoge(char* str, char ***foo);
どっち?
6527:05/03/19 02:21:49
>>55
視力のせいにして自分を正当化してなんかいません。
見慣れないコードだったから読み間違えてしまったのです。
それに、私が悪かったと認めました。
言い訳ではなく、ミスしてしまった原因を書いただけです。
コピペすればミスを防げたのに、それをしなかった私に落ち度があることは認めました。
どうしてそこまで「言い訳」にこだわるのですか?

>>56
カンマも正しいですが、コンマも間違いではありません。
その証拠として、excite へのリンクを貼りました。
発音記号が読めればコンマも正しいことが分かるはずです。

>>57
>フランス語や英語が先。
フランス語はともかく、英語が先だとは思えません。
アメリカが出来たのは 1776 年で、ドイツはそれより以前から存在します。
英語が世界に広まったのは、アメリカが力を持つようになったからではないですか?

>>58
>漢字コードについて、調べもしないで憶測で書く。
漢字コードには主にJIS,SJIS,EUCの3種類が存在することや、それぞれの特徴も知っています。
コード変換のプログラムも作ったことがあります。
調べなかったのは、問題が発生する可能性が低く、あえて調べる必要がないと判断したからです。

>調べるとなったらコード全体について調べずに該当文字のみを調べる。
この問題については該当文字を調べれば必要十分だからです。

>コードについて、コピペせずに自分で入力する。
それは私の落ち度でした。
66デフォルトの名無しさん:05/03/19 02:26:43
>>65
あなたは人を不快にする才能があるな
自分の書き込みを読みかえせ
67デフォルトの名無しさん:05/03/19 02:29:42
ついでに、煽り耐性が低いことや言い訳がましいこともプログラマ向きじゃないね。
つーか、2ch向きじゃないというべきか。

>釣りではありません。(目が悪いから)小さな記号を見落として、それに気づかなかったんです。
>視力のせいにして自分を正当化してなんかいません。
何をかいわんや。
6835:05/03/19 02:33:57
>>58
>巧く動かないとなったらコピペも試さず他人の指摘を間違いと思い込む。
指摘の意図が分からなかったからです。

>挙句自説に拘泥する。
確かにその傾向はあると自覚しています。それは私の悪い癖の一つですが、
高校の頃に数学の授業や問題集の解答に誤りが多く、それをよく指摘していたことがあったので、
その頃の癖を未だに引きずってしまっているのが原因だと思います。
でも、自分が間違っていることが納得できれば素直に認めます。

>枚挙に暇がないが、どれもこれもプログラマ(というよりはモノ作り全般)に向かない資質だと思うがね。
向かないも何も、現にプログラマをやっていますが。
69デフォルトの名無しさん:05/03/19 02:35:35
うわー、頼むから漏れと同じプロジェクトで仕事しないでね。
70デフォルトの名無しさん:05/03/19 02:36:46
>>68
もう来るな。
71デフォルトの名無しさん:05/03/19 02:37:09
他人の間違いを指摘する前に、自分に間違いがないか検証する習慣がなくてよく社会に適合でき・・・てないのか(プ
7235:05/03/19 02:40:04
>>66
攻撃的なレスが多いからです。

>>67
>ついでに、煽り耐性が低いことや言い訳がましいこともプログラマ向きじゃないね。
現職のプログラマにプログラマ向きじゃないと言うのはおかしいと思いますが。
プログラマ向きじゃないのに、どうしてプログラマになれたんでしょうかね。

>つーか、2ch向きじゃないというべきか。
2chで煽りや荒らしがよくあるのは知っています。
煽りだと判断したレスは無視しています。
それとも、あなたも煽りですか?
73デフォルトの名無しさん:05/03/19 02:42:14
雉も鳴かずば撃たれまいに・・・
74デフォルトの名無しさん:05/03/19 02:44:15
犬も歩まざれば棒に当たるまいに・・・
7535:05/03/19 02:46:56
>>69
ご心配なく。(おそらく)会社が違うから同じプロジェクトを担当することはまずないでしょう。

>>70
あなたに言われる筋合いはありません。

>>71
多くの場合、自説に間違いが無いかどうか十分に検証しています。
自説を検証して間違いが無いと判断し、かつ相手に誤りがあると確信したときに
初めて相手の誤りを指摘します。
それに、現に社会に適合しているから会社で何の問題も無く働いているのですが。
76デフォルトの名無しさん:05/03/19 02:56:47
おー面白い奴が来ているからage
77デフォルトの名無しさん:05/03/19 03:07:14
なんだ。終わったのかよ。
やだねえ、自尊心のかたまりは。
78デフォルトの名無しさん:05/03/19 03:10:52
丸い卵も切りようで四角
ものも言いようで角が立つ
79デフォルトの名無しさん:05/03/19 03:54:38
「自分は間違っていない」

「自分が間違えたのは○○のせいで、仕方がない。嘘だと思うなら試してみろ」

「自分は社会に適合している。周りに煙たがられてなどいない」
80デフォルトの名無しさん:05/03/19 05:13:54
くそうぜーな、長文レスなんとかしてけろ・・・
81デフォルトの名無しさん:05/03/19 07:03:37
>>31 >>35 >>38
C99の規格書はもってないので、
kandrから関係ありそうなところをしらべてみた。

APPENDIX A7.10
Equality operators
...
a pointer may be compared
to a constant integral expression with value 0, or
to a pointer to void.

APPENDIX A6.6
Pointers and Integers
...
An integral constant expression with value 0,
or such an expression cast to type void *,
may be converted,
by a cast, by assignment, or by comparision,
to a pointer of any type. This produces a null pointer...

APPENDIX A7.3.2 Function Calls
...
The order of evaluation of arguments is unspecified;
...
However, the arguments and function designator
are completely evaluated,
including all side effects,
before the function is entered.

あと、APPENDIX A7.17代入式, APPENDIX B 表B-1 Printf変換あたり。
82デフォルトの名無しさん:05/03/19 07:30:18
NULL がオールゼロビットとは限らないなんて事
プロならみんな知ってるだろ
83デフォルトの名無しさん:05/03/19 10:12:04
ですなぁ。
84デフォルトの名無しさん:05/03/19 11:07:43
>>82
ANSI とかの規格では NULL をゼロと定めていないかもしれないけど、
世界の C コンパイラの99%は stdio.h とかで
#define NULL 0
と定義されているはず。
もし NULL != 0 というCコンパイラが実在したらソースよろ。
85デフォルトの名無しさん:05/03/19 11:46:10
煽り耐性がないのはお前らもだろ。
自説に固執するのは、お前らもだろ。
なんて見苦しいスレだ。
8682:05/03/19 11:47:08
>>84

>>35あたりからの流れを読んでレスしてくれよ…
87デフォルトの名無しさん:05/03/19 12:27:04
>>84
過去ログも読んだ方がいいよ
88デフォルトの名無しさん:05/03/19 12:42:54
89デフォルトの名無しさん:05/03/19 13:06:23
コンピュータ内部表現のヌルポインタは0とは限らない
しかしC言語でのNULLは0(または(void*)0)であり
処理系に応じたヌルポインタにしてくれる
90デフォルトの名無しさん:05/03/19 13:14:19
いつまでもぬるぽなことやってんじゃないよ〜
91デフォルトの名無しさん:05/03/19 13:24:12
>>90
ガッ

NULL PO
92デフォルトの名無しさん:05/03/19 14:33:22
配列a[ ]とb[ ]の値を交換するのに

#include <stdio.h>
#include <math.h>
int main (void)
{
int a[100],b[100];
int *p=a,*q=b,*r;
int i,j;

for (i=0 ;i<=99 ; i++){
a[i]=i+1;
b[i]=100-i;
printf("a[%d]=%d,b[%d]=%d\n",i,a[i],i,b[i]);
}

a=q;
b=p;

for (i=0 ;i<=99 ; i++){
printf("a[%d]=%d,b[%d]=%d\n",i,a[i],i,b[i]);
}
}

ではなぜ駄目なのでしょうか?
93デフォルトの名無しさん:05/03/19 14:39:13
>>92
「中身の交換」という言葉のとおりに書いて味噌。
君は中身ではなく、入れ物だけ入れ替えて誤魔化そうとしている。
94デフォルトの名無しさん:05/03/19 14:39:35
自分の胸に聞いてみろ。
95デフォルトの名無しさん:05/03/19 14:45:08
> コンピュータ内部表現のヌルポインタは0とは限らない

ナルだろ ぼけ
96デフォルトの名無しさん:05/03/19 14:47:30
> ANSI とかの規格では NULL をゼロと定めていないかもしれないけど、
> 世界の C コンパイラの99%は stdio.h とかで
> #define NULL 0
> と定義されているはず。

こいつおおぼけ。Kusakabe先生が「NULLが0なんじゃなくて0がNULLなんです」と
教えている通り、NULLのビットパターンは0じゃなくても、
ポインターに代入したり比較したりする文脈に書かれる「0」はNULLの意味になるという
Cの基本的性質から、NULLのビットパターンに変換されるんだよ ぼけ
だからNULLがたとえばFFFFというビットパターンのマシンでも、
定義は#define NULL 0 でいいんだよ ぼけ
97デフォルトの名無しさん:05/03/19 14:49:24
> >フランス語や英語が先。
> フランス語はともかく、英語が先だとは思えません。
> アメリカが出来たのは 1776 年で、ドイツはそれより以前から存在します。

はあ? こいつはぼけ。英語はアメリカでできたんだと思ってるらしい。
98デフォルトの名無しさん:05/03/19 14:50:59
> 漢字コードには主にJIS,SJIS,EUCの3種類が存在することや、それぞれの特徴も知っています。

ぼけ、主流はEUC-JP、ISO-2022-JP、UTF-8の3つだよぼけ。ShiftJISなんてのは主流ではない。
99デフォルトの名無しさん:05/03/19 14:52:53
>>97
君は知識が有るねぇ。尊敬するよ。ここまで凄いと、僕・・・ハァハァ
100デフォルトの名無しさん:05/03/19 14:53:02
またageぼけ厨が出たか
101デフォルトの名無しさん:05/03/19 14:53:09
>>92
そんなことが可能だったら配列のメモリ開放はどうやるんだ?
102デフォルトの名無しさん:05/03/19 14:55:36
> 開放は

ぼけ
103デフォルトの名無しさん:05/03/19 15:00:01
>>27がぼけなのは既知。これ以上荒らすな。
104デフォルトの名無しさん:05/03/19 15:19:55
いや おまえがいちばんぼけ
105デフォルトの名無しさん:05/03/19 15:20:14
102 :デフォルトの名無しさん :05/03/19 14:55:36
> 開放は

ぼけ

かならず出てくるね( ´_ゝ`)
106デフォルトの名無しさん:05/03/19 15:23:46
iya- meiThreaddane
107デフォルトの名無しさん:05/03/19 15:52:20
日下部いい加減にしろ(苦笑)
108デフォルトの名無しさん:05/03/19 15:59:09
ーーまとめーー
NULLは
おそらくどこかのヘッダで定義されている怪しい定数で、
プリプロセッサがたいてい0か(void *)0に展開して、

その定数が、代入や初期化の式の
真中の代入演算子 = からみて
右側のオペランドの位置にあり、そのとき、
左側のオペランドが、都合よくポインタであると、

その式の評価の結果、ポインタの値にぬるぽが入って、
そのぬるぽがどんな表現なのかは、実装依存。
109デフォルトの名無しさん:05/03/19 16:05:15
ごめん、条件反射

  Λ_Λ  \\
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >_Λ∩
  _/し' //. V`Д´)/
 (_フ彡        / ←>>108
110デフォルトの名無しさん:05/03/19 16:09:24
> その式の評価の結果、ポインタの値にぬるぽが入って、

ナルだろ ぼけ
111デフォルトの名無しさん:05/03/19 16:10:50
> 日下部いい加減にしろ

こわいものはぜんぶKusakabeにみえてしまう症候群 ;-)
112デフォルトの名無しさん:05/03/19 16:11:13
NULLの話がでてきたのでちょっと質問。
これって誰が正しいの?

896 名前:風の谷の名無しさん@実況は実況板で[sage] 投稿日:05/03/19 00:19:48 ID:Jg/N2N2N
NULLって0でもなく1でもなく、何も無い状態なんだがなぁ

897 名前:桃色頭脳 ◆C5EKtMD8/k [] 投稿日:05/03/19 00:26:11 ID:8D6ZP6Xt
何も無いじゃないんだな、これが
決まってない、なんだな

898 名前:風の谷の名無しさん@実況は実況板で[sage] 投稿日:05/03/19 00:26:23 ID:ZRcR+c9F
>896
自分解釈乙。
英和辞書引け。
113デフォルトの名無しさん:05/03/19 16:11:52
↑こわがりすぎー ってやつですね
114デフォルトの名無しさん:05/03/19 16:12:24
> NULLの話がでてきたのでちょっと質問。
> これって誰が正しいの?

わたしが正しい。
115デフォルトの名無しさん:05/03/19 16:13:22
わたしが正論です。

--スリランカ首相ウィクラマシンハ
116デフォルトの名無しさん:05/03/19 16:16:07
教えてくれない。・゚・(ノД`)・゚・。
117デフォルトの名無しさん:05/03/19 16:16:36
わたしが正義です!!

--ソフトバンク社長 孫
118デフォルトの名無しさん:05/03/19 16:24:21
そんなの、想定の範囲内でしょう、どこがおかしいの?
119デフォルトの名無しさん:05/03/19 16:24:55
> NULLって0でもなく1でもなく、何も無い状態なんだがなぁ

ぼけ。NULLが0なんじゃなくて、0がNULLなんだよ ぼけめ
120デフォルトの名無しさん:05/03/19 16:26:09
>>112
C言語の話をしているのなら3人とも間違ってる。
哲学的意味を語っているなら3人とも正しい。
英単語の辞書的意味が知りたいなら898の言うとおり。
121デフォルトの名無しさん:05/03/19 16:27:03
堀江先生の言う事には、ルールに書いてなければどれでも正しいんじゃないの?
122デフォルトの名無しさん:05/03/19 16:27:56
このスレはC言語スレです。
C++と混同してる馬鹿はお帰り下さい。
123デフォルトの名無しさん:05/03/19 16:29:58
要は可読性の問題らしいよ。;)
124デフォルトの名無しさん:05/03/19 16:31:06
> C言語の話をしているのなら3人とも間違ってる。

いや。わたしが規格的に正しい。
あとはまちがい
125デフォルトの名無しさん:05/03/19 16:36:33
春なのか。
126デフォルトの名無しさん:05/03/19 16:37:06
NULLって恐い…ぽ
NULLは便利だけど、恐い…ぽ
NULLつかうと実行時に型が違ったりして…ぽ
NULL…ぽ
127デフォルトの名無しさん:05/03/19 16:38:04
>>126
ガッ
ガッ
ガッ
ガッ
128デフォルトの名無しさん:05/03/19 17:15:21
129デフォルトの名無しさん:05/03/19 17:19:59
明示的なポインタって要らないね。
130デフォルトの名無しさん:05/03/19 17:24:30
ポインタは要らないが、アドレスは必要。
131デフォルトの名無しさん:05/03/19 19:06:43
ANSI準拠 ポータブル...なのか?

??=include<stdio.h>
main()
??<
char test??(??) = "a-tesutesu";
puts(test);
??>

$ gcc -Wall -ansi test.c -o test
test.c:1:1: 警告: トライグラフ ??= は # に変換されました
test.c:3:1: 警告: トライグラフ ??< は { に変換されました
test.c:3: 警告: return type defaults to 'int'
test.c:4:11: 警告: トライグラフ ??( は [ に変換されました
test.c:4:12: 警告: トライグラフ ??) は ] に変換されました
test.c:6:1: 警告: トライグラフ ??> は } に変換されました
test.c: In function 'main':
test.c:6: 警告: control reaches end of non-void function
132デフォルトの名無しさん:05/03/19 19:55:25
?
133デフォルトの名無しさん:05/03/19 21:33:33
ださ... > -ansi
134デフォルトの名無しさん:05/03/19 21:34:32
常識的に
alias cc gcc -Wall -std=c99 -O3
だ。
135デフォルトの名無しさん:05/03/19 21:35:25
> 明示的なポインタって要らないね。

そういう日本語はない > 明示的
英和辞典用語だ。
136デフォルトの名無しさん:05/03/19 21:37:24
>>135
広辞苑に載ってるよ
137デフォルトの名無しさん:05/03/19 21:43:03
#も{もちゃんとあるlocaleで??=や??<をつかえばgccはウォーニング出すよ。
そんなのあたりまえじゃん。
おまえ馬鹿か?
138デフォルトの名無しさん:05/03/19 21:44:37
そもそも辞書に載ってる、載ってないじゃないしな
アホらし
139デフォルトの名無しさん:05/03/19 21:45:49
では、日本語かどうかってどうやって判断しているの?
140デフォルトの名無しさん:05/03/19 21:46:33
> そもそも辞書に載ってる、載ってないじゃないしな

はあ? おまえぼけか。辞書には載ってるんだよ。だから「英和辞典用語」だろうが ぼけ
あたまわるいなーこいつ
141デフォルトの名無しさん:05/03/19 21:47:45
>>140
>>138が辞書に載ってないとでも言ったのかい?
142デフォルトの名無しさん:05/03/19 21:50:10
>>138
辞書に載っていない日本語もあれば、載っていない日本語もある、ということ?
143デフォルトの名無しさん:05/03/19 21:50:49
× 載っていない日本語もあれば、
○ 載っている日本語もあれば、
144デフォルトの名無しさん:05/03/19 21:51:24
どっちみち載ってないのか。
145デフォルトの名無しさん:05/03/19 21:51:32
>>140は素で恥かいたっぽいな
146デフォルトの名無しさん:05/03/19 21:54:44
>>140=天然ぼけ
147デフォルトの名無しさん:05/03/19 21:56:41
誰にでもかぶりつくから恥かくんだよ、くそじじい
148デフォルトの名無しさん:05/03/19 21:57:25
gccは知らないな。
俺は昔からVisualStudio なんで
149デフォルトの名無しさん:05/03/19 22:03:21
ageぼけ厨イタ杉w
150デフォルトの名無しさん:05/03/19 22:03:40
ボケ同士結構なことで
151デフォルトの名無しさん:05/03/19 22:07:42
>>126
ネタか?一応マジレスするぞ

>NULLって恐い…ぽ
>NULLは便利だけど、恐い…ぽ
だったら0を使え

>NULLつかうと実行時に型が違ったりして…ぽ
実行時には型も何もないと思うぞ
コンパイル時の間違いか?
だとしても可変数引数の関数にNULLを渡すときぐらいにしか
NULLの型は問題にならんぞ

>NULL…ぽ
カ(r
152デフォルトの名無しさん:05/03/19 22:13:10
>>151
インスタンスだったら?
153デフォルトの名無しさん:05/03/19 22:19:09
> だとしても可変数引数の関数にNULLを渡すときぐらいにしか

ぼけ。プロトタイプなしのときもだよ
154151:05/03/19 22:24:47
>>152
インスタンスって何だ?
NULLの話だぞ
そもそもC言語か?

>>153@ageぼけ厨
補足どうも
155デフォルトの名無しさん:05/03/19 22:25:42
0だと通常の数値代入に思われるから、
NULLとわかりやすく明示するに決まってる。
156デフォルトの名無しさん:05/03/19 22:30:24
ただの数値代入じゃん。
157デフォルトの名無しさん:05/03/19 22:37:25
>決まってる。
こういう断定的な表現すると論争の元になるぞ

0っていう表記は整数の0と(C言語で)NULLを表す0だけじゃない
他の意味になる場合だってある
とにかく0(とだけ書いた場合)は特殊なんだと
C言語を使うものなら覚えておいた方がいいと思う

個人的にNULLを使わず0を使っているソースをみると
こいつ分かってるなって思う
(もちろん逆にも取れるけどw)
158デフォルトの名無しさん:05/03/19 22:43:43
いや、ポインタが無効領域である、何も指してないという意味合いをわかりやすくするためにNULLと書いたほうがいいと思う。
ただ、0でも構わん。
これは見た目の美学に関わることだろ。
少しでも美しいソースを記述したいのはどのPGもそうだろうし。
159デフォルトの名無しさん:05/03/19 22:49:20
>>158
そうだね
俺も自分でコーディングするときはNULLって書くよ
宿題スレだったらタイプめんどいから0にするかもw
160デフォルトの名無しさん:05/03/19 22:50:01
NULLがintの0だと思って使っているのはCプログラマぐらいのものだね。
161デフォルトの名無しさん:05/03/19 22:51:01
int c;
for(c=NULL;c<256;c++){

}
162デフォルトの名無しさん:05/03/19 22:52:35
他のMLとかLispとかetcの言語触った事あるんやろか…
163デフォルトの名無しさん:05/03/19 22:54:23
その言語に応じたコーディングをすればええやん
C言語はNULLとしたほうがええやん
ぷれいやん
164デフォルトの名無しさん:05/03/19 22:56:06
>>162
cppll ML読んでC++の勉強してますが何か?
Lispとかetcの言語っていうのは知らない
165デフォルトの名無しさん:05/03/19 22:57:12
すみません、無効ポインタを記述するためにNULLの代わりに
0と書いた場合の利点がこれまでのカキコを読んでもよく
わからないのですが、どなたかわかりやすい解説をして
いただけないでしょうか。
166デフォルトの名無しさん:05/03/19 22:58:39
>>164
ごめん、誤解されたかも。。ML=The Meta Language
167デフォルトの名無しさん:05/03/19 22:59:21
>>165
見た目の問題
どっちが美しいって思うかは感性による
168デフォルトの名無しさん:05/03/19 23:00:07
>>165
型付けがあいまいなC言語では人間が見て区別しないといけないから、NULLも同様に0と区別して
使わなければならない。
169デフォルトの名無しさん:05/03/19 23:00:56
170デフォルトの名無しさん:05/03/19 23:03:35
>>168
ログ読んでる?
NULLって書いても0って書いてもC言語では同じ
区別はない。よって人間が区別する必要はない
処理系が処理系に応じたヌルポインタにしてくれるの!!

>型付けがあいまいな
void * あたりではそう思う
C++では改善されてるけど
171デフォルトの名無しさん:05/03/19 23:05:34
DWORDとかLPCTSTRとかを使うより、unsigned intやwchar_tを使ったほうが美しいと思う。
172デフォルトの名無しさん:05/03/19 23:15:32
>>165
規格で関数へのポインタ型←→オブジェクトへのポインタ型(含void *)はキャスト演算子を使っても出来ない事になっている。
だからNULLが(void *)0となっているヘッダを使ったときに関数へのポインタへNULLを代入するとエラーになったり警告が出たりかもしれない。
173デフォルトの名無しさん:05/03/19 23:19:26
>>170
同じものを指すのに別のラベルが付けられている言葉ってあるよね。
ほら、たとえば、
かたつむり でんでんむし まいまい
でも、これらって微妙に意味が違うんだよねー
174デフォルトの名無しさん:05/03/19 23:20:33
>>171
DWORDとかLPCTSTR
これってVC特有のものなんじゃない?
なんでこんなもの定義してあるんだろう…移植性低いなぁ
175デフォルトの名無しさん:05/03/19 23:21:22
>>172
このスレで勉強なったの2回目だ
あんたネ申だよ
176デフォルトの名無しさん:05/03/19 23:29:55
>>174
WIN32API
177デフォルトの名無しさん:05/03/19 23:33:09
WIN32プログラミング>>>>>>>>>その他マイナープログラミング
178デフォルトの名無しさん:05/03/19 23:39:47
>>174
64Bitに移行しかけてるんだからマクロ使った方が移植性は上だ。
179デフォルトの名無しさん:05/03/19 23:49:46
パケットモニタ作りたいんだけど、送信パケットってどうやって
キャプチャするんですか?
使用OSはlinuxです
180デフォルトの名無しさん:05/03/19 23:50:38
普通Cって言ったらUNIX系がメッカなんだが。
181デフォルトの名無しさん:05/03/19 23:53:48
>>179
pcapでも使えば?
182デフォルトの名無しさん:05/03/19 23:54:57
>>181
仕組みが知りたいんです。
183デフォルトの名無しさん:05/03/19 23:55:05
>>165
NULLが定義されていなくても使える。
184デフォルトの名無しさん:05/03/19 23:55:47
>>182
ドキュメント読め。
185デフォルトの名無しさん:05/03/19 23:59:16
>>183
このスレで勉強なったの3回目だ
あんたネ申だよ
186デフォルトの名無しさん:05/03/19 23:59:22
>>183
自分で追加してくれ。

ポインタに0代入は気持ち悪くて出来ないな。
187デフォルトの名無しさん:05/03/20 00:07:44
>>186
その場しのぎで勝手にdefineされる方が気持ち悪いが。
188デフォルトの名無しさん:05/03/20 00:07:45
>>172
すると、たとえば構造体のメンバにコールバック関数が
あったとして、それを無効ポインタに初期化するときは
0を代入すべき?

struct foo {
 int (*callback)(int arg);
};

foo.callback = 0;
189デフォルトの名無しさん:05/03/20 00:10:25
>>186
ポインタは値だから0以前に何も代入で金
190デフォルトの名無しさん:05/03/20 00:11:34
>>187
そこに突っ込むなよ…。
NULLが定義されてない事自体が変だろ。
191179:05/03/20 00:15:28
>>182
そのとおりです。

受信はココに乗ってたんだけどなー
ttp://www.whiteboard.ne.jp/~admin2/socket2.html
192デフォルトの名無しさん:05/03/20 00:17:37
>>190
変か?
193デフォルトの名無しさん:05/03/20 00:19:47
独学してるんですが、コールバック関数というものがよくわかりません。
web検索しても、呼ばれる関数(つまりコールバック関数なんですが)の説明は
WinAPI関連で出て来るのですが、呼び出す側の説明はあまりなく、よく理解できません。
想像の出来る範囲で書いたのが下記ですが、これってコールバック関数使ってることに
なりますか?

#include <stdio.h>

void called(void)
{
printf("I am called\n");
}


void call(void (*cald)(void))
{
cald();
}

int main(void)
{
call(called);
return 0;

}

194デフォルトの名無しさん:05/03/20 00:20:10
NULLって標準で定義されていて当り前なんじゃないの???
195デフォルトの名無しさん:05/03/20 00:22:17
>>193
それは単に関数のポインタを渡したに過ぎない。
コールバック関数そのものというよりも、イベントドリブンの考え方を理解している?
196デフォルトの名無しさん:05/03/20 00:26:05
>>194
定義されている部分をincludeで取り込んだらね。
197デフォルトの名無しさん:05/03/20 00:27:32
バリアント型追加きぼん
198デフォルトの名無しさん:05/03/20 00:27:38
>>196
コンパイラが最初から定義しているという実装は反則?
199デフォルトの名無しさん:05/03/20 00:29:55
>>193
大抵の場合、呼び出す側のことは考えなくてもいい。
200デフォルトの名無しさん:05/03/20 00:49:53
>>195
GUIなら、マウスが押されたら、とかそういうやつですよね?
イベントドリブンという概念はわかっていると思いますが、
なぜイベントドリブンでコールバック関数なのか、というあたりが
理解できていないのかも知れません。
実際、GTK+のチュートリアルを見ていてコールバックに出会ったんです。
定義されている側を調べようとしたんですが、僕のレベルでは良くわからなかったんです。
201デフォルトの名無しさん:05/03/20 01:01:43
>>193
それじゃ一般の「コールバック関数」にはならない。
というか、そういうふうにプログラムを数行書いて説明できるような
ことじゃない。
「コールバック関数」は「○○したときに××しろ」みたいな
プログラムを書くために用意されてるけど、OSに依存する概念だから、
まだANSI-Cをマスターしてないなら知らなくていい。
マスターしてるなら、WindowsAPIの勉強をすれば自然と出てくる。
202デフォルトの名無しさん:05/03/20 01:03:16
コールバック関数は単に関数のポインタを渡してるにすぎないでしょ。

ウィンドウプロシージャもコールバック関数だし。
あるウィンドウのイベント処理を受け持つのがウィンドウプロシージャ。

ウィンドウを作る前に、ウィンドウクラスを作成して登録するだろ。
そのとき、イベント処理を行う関数を登録(その関数のポインタを渡す)
203デフォルトの名無しさん:05/03/20 01:11:31
NULLの代わりに0を代入って、構造体の初期化でオール0にしたりする場合に有効なんじゃ無いの?
204デフォルトの名無しさん:05/03/20 01:13:55
NULLは視覚上の問題でしょ。
あくまで0でも構わん。
205デフォルトの名無しさん:05/03/20 01:21:31
亀レスで悪いが、strtokで良くないか?
漏れは正規表現厨なのでキャプチャをよく使うが
206デフォルトの名無しさん:05/03/20 01:24:32
>>6のことなorz
207デフォルトの名無しさん:05/03/20 01:26:11
俺は独自に関数を作って処理。
208デフォルトの名無しさん:05/03/20 01:49:44
>>200
なにかイベントが起きた時に、特定の処理を行いたい時に
「イベントが発生したらこの関数を呼んでね」
と登録する。
どうやってその関数が呼ばれるのかは知らなくていいこと。
209デフォルトの名無しさん:05/03/20 01:56:58
WNDCLASSEX wcex;
wcex.lpfnWndProc= (WNDPROC)WndProcA;

ウィンドウA→WndProcA()
ウィンドウB→WndProcB()
210デフォルトの名無しさん:05/03/20 02:03:55
while true do
match イベント with
イベント1 -> イベント1が起きたら呼ぶ関数
| イベント2 -> イベント2が起きたら呼ぶ関数
| _ -> ()
done

C流の関数へのポインタは本質的ではない。
211デフォルトの名無しさん:05/03/20 02:04:43
C言語というかmmapに関する動作がいまいち理解できないので教えてください。
たとえば

#define SIZE 536870912
int main() {
void *map;
int fd = open("tmp_file", O_RDWR);
size_t size = (SIZE / getpagesize() + 1) * getpagesize();

map = mmap(0, size, PROT_READ | PROT_WRITE, MAP_FIXED, fd, 0);
munmap(map, SIZE);

return 0;
}

というプログラムを動かすとバスエラーになってしまいます。
また、変数sizeを使わずにSIZEを使うとセグメントエラーになります。
mmapはファイルをメモリに全部読み込まずに必要な分だけキャッシュする
とmanに書いてあるように読めたのですが、間違いでしょうか。
環境はFreeBSD 5.3R, gcc 3.4.2です。メモリは512MBです。
tmp_fileは
dd if=/dev/zero of=tmp_file bs=512 count=1048576
として作成しました。
212デフォルトの名無しさん:05/03/20 02:08:52
>>211
このスレで聞くな
213デフォルトの名無しさん:05/03/20 02:10:39
>>205
strtok()はスレッドセーフではないので使用に注意が必要。
必然的にconst char * 渡せないしね。
214デフォルトの名無しさん:05/03/20 02:17:57
区切りで分割した文字をリストで返してくれるものがいいね。
かってに区切り文字をNULLに置き換えられても困る場合ある。
215211:05/03/20 02:25:27
すみません、確かに標準Cではありませんね。
別のスレで聞いてみます。ありがとうございました。
216デフォルトの名無しさん:05/03/20 02:39:56
これで完璧
my @array = split(/,/, $string);
217デフォルトの名無しさん:05/03/20 02:47:17
それC?
218デフォルトの名無しさん:05/03/20 13:54:15
@!!a A!(!a)
@番でもいいですか?
219デフォルトの名無しさん:05/03/20 14:23:40
>>218
そんなのにいちいち括弧は要らない。
220デフォルトの名無しさん:05/03/20 14:27:35
わかりました。
221デフォルトの名無しさん:05/03/20 16:11:29
> NULLの代わりに0を代入って、構造体の初期化でオール0にしたりする場合に有効なんじゃ

おまえはおおぼけ。たとえばmemsetで0クリアしたら、メンバーにはNULLじゃなくて
all bit 0のパターンがはいるだけ。
0がNULLに変換されるのは、あくまでも代入や引数渡しの場面だけだ ぼけ
222デフォルトの名無しさん:05/03/20 16:20:42
223デフォルトの名無しさん:05/03/20 16:41:00
> かってに区切り文字をNULLに置き換えられても困る場合ある。

は? こいつぼけ。区切りがNULLなわけねーだろ ぼけ。
NULLはポインターにいれる値だ。
224デフォルトの名無しさん:05/03/20 16:41:35
っていうか、文字化けしてる > 218
ぼけ
225デフォルトの名無しさん:05/03/20 17:04:40
文字列をアイウエオ順にソートするアルゴリズム教えて
226デフォルトの名無しさん:05/03/20 17:06:56
qsort一発!
227デフォルトの名無しさん:05/03/20 17:09:46
比較関数の作り方のこつだけおしえておこう。

単純にコード順にならべると
ハンバーガー
バンズ
パン
の順になってしまうが、正しくアイウエオ順の場合は
パン
バンズ
ハンバーガー
の順にならねければならない。つまり濁点や半濁点はついていない状態で比較し、
それでもまったく同一だった場合だけつけてくらべるのである。
228デフォルトの名無しさん:05/03/20 17:45:10
正しいあいうえお順ってなんだろね。
>227は所謂辞書順ではあるけど、そうでない順序も世の中にはあるわけで。
229デフォルトの名無しさん:05/03/20 17:46:03
脳内辞書だろ
230デフォルトの名無しさん:05/03/20 17:50:26
不可能は無い
231デフォルトの名無しさん:05/03/20 17:53:33
STL勉強しなおせ、うましか。
232デフォルトの名無しさん:05/03/20 17:59:48
固定小数点って、その処理系が演算としては
小数が扱えるから固定小数点が使えるんですよね?

変数に小数が使えないだけで、
演算は出来ないと小数が使えない。ということで。
初心者なんで、分かりません。
完全に小数が使えないと、固定小数使う意味無いということが言いたいのです。
間違ってますか?
233232:05/03/20 18:00:20
↑C言語とは限らない質問ですみません。
234デフォルトの名無しさん:05/03/20 18:04:59
>>232
Cでも固定小数点実数演算ライブラリを作ることはできる。
235デフォルトの名無しさん:05/03/20 18:05:23
>>231
スレタイよく読め。
236デフォルトの名無しさん:05/03/20 18:07:52
> そうでない順序も世の中にはあるわけで

ありません
237デフォルトの名無しさん:05/03/20 18:34:33
>227では拗音などについて書いてないからなんとも言えないが、その辺りは辞書によっても違うらしい。
ttp://www2.odn.ne.jp/~cbp91480/sort.html
ttp://help.yahoo.co.jp/help/jp/dic/jj/jj2_3.html
また、辞書ではないが電話帳の配列はまた違うし、調べるといろいろありそうだ。
238デフォルトの名無しさん:05/03/20 18:37:40
それを決めておくのが仕様だろう
239232:05/03/20 18:42:34
>>234
演算自体を自分で管理するということですか。
頭混乱してきました。

一般的には
整数しか使えない場合、最終的には整数出力なので、
固定小数にした変数を独自整数キャストして使うのかな。
机上で語ってるのでサッパリです。
ありがとうございました。
240デフォルトの名無しさん:05/03/20 18:58:42
241デフォルトの名無しさん:05/03/20 19:02:48
>>239
こういうのはC++だと綺麗に実装できるが、
演算速度や外部I/Fの都合で固定小数点を扱うことは度々ある。
今や、実数演算が充分高速なので殆ど必要はなくなったが、
8ビットCPUの時代にはしばしば固定小数点演算を行なっていた。

いずれにしても、C++ならCAST演算子オーバーロード、Cならば変換や出力に用いる関数を用意すればいい。
勿論、必要に応じて四則演算関数も用意する必要があるが。
242デフォルトの名無しさん:05/03/20 20:56:42
環境依存の質問なのでスレ違いかも知れませんが、他に適切なスレが見当たらなかったのでここに来ました。

OS は Windows XP で、コンパイラは mingw-jp の gcc です。
コマンドプロンプトのウインドウの現在の縦のサイズ(行数)を得るにはどうすればよろしいのでしょうか。
それとも、それは不可能なのでしょうか。

よろしくお願い致しますm(_ _)m
243デフォルトの名無しさん:05/03/20 20:59:14
スレ違い
氏ね
244242:05/03/20 21:00:55
>>243
では、ご存知でしたら適切なスレに誘導して下さいm(_ _)m
245デフォルトの名無しさん:05/03/20 21:08:11
246242:05/03/20 21:14:42
>>245
ふざけないで下さい。
このスレでは適切なご回答を頂けそうにないので、>>242の質問はキャンセルさせて頂きます。
247デフォルトの名無しさん:05/03/20 21:18:55
>>246
お前がふざけたまねをしてるんじゃないか
248デフォルトの名無しさん:05/03/20 21:20:16
そりゃ自分が低脳だなんて、認めたくないだろうよ
249デフォルトの名無しさん:05/03/20 21:23:47
客 ラーメンくれ
店 ここは寿司屋だ。ラーメンは無い。
客 じゃあラーメンがある店を教えろよ!
店 しらんがな
客 なんだと!!!ふざけやがって!!!
250デフォルトの名無しさん:05/03/20 21:24:07
なんだと
251デフォルトの名無しさん:05/03/20 23:11:10
>>249
爆笑した
252デフォルトの名無しさん:05/03/20 23:14:58
<パターン1>
客:ラーメンください
店:ここは寿司屋です。ラーメン無いです。
客:じゃあ、ラーメンください。
店:そうかい、すまないね。
〜完〜

<パターン2>
客:ラーメンください
店:ここは寿司屋です。ラーメン無いです。
客:じゃあラーメンの店どこにありますか?
店:そこを右に曲がって...(略)
客:ありがとうございました。(いい店だね。また今度来てみようかな)
〜完〜

<パターン3>
客:ラーメンください。
店:ここは寿司屋です。ラーメンは無いです。
客:ラーメンください。
店:ラーメン無いよ。
客:ラーメンください。
店:無いって。
.....続く。
253デフォルトの名無しさん:05/03/20 23:16:37
パターン1間違えた...
254デフォルトの名無しさん:05/03/20 23:24:10
結局>>242はラーメン屋に逝ったのに
自分でカップラーメン作れって言われてるぞw
http://pc5.2ch.net/test/read.cgi/tech/1110281860/493-494
255デフォルトの名無しさん:05/03/20 23:31:02
>>252
パターン2は、客が次に来たときも寿司を注文するとは限らないところに罠があるな。
256デフォルトの名無しさん:05/03/20 23:41:27
ここは店や客の立場じゃ無いからな
優しくする義理も無いし、そやつが二度とこなくてもかまわないし。
257デフォルトの名無しさん:05/03/21 00:17:40
freopen的にstdin, stdout, stderrをchar*に置き換えるにはどうすればよいでしょうか?
とある巨大プログラムを自分のアプリに組み込もうとしているんですが、
ほとんどの出力を標準出力に返してるんでそれを拾って使いたいと思ってます。
パフォーマンスを超重視してるんでpopenとかはなしです。
258デフォルトの名無しさん:05/03/21 00:20:36
質問者を客並みに扱えとのたまう弱者が
いらっしゃるスレはここでしょうか?
259デフォルトの名無しさん:05/03/21 00:29:15
誰か >>257 の1行目を翻訳してくれないか。
>パフォーマンスを超重視してるんでpopenとかはなしです。
popen のパフォーマンスがどうだか知らんが
そーゆー話だと、スレ違いの予感。
260257:05/03/21 00:31:25
プロセスって言語の外になるから微妙かもしれないですけど
実際問題として対象外なんでお願いします。
261デフォルトの名無しさん:05/03/21 00:39:37
ことわる
262デフォルトの名無しさん:05/03/21 00:41:21
>252 のパターン3の開始?
263デフォルトの名無しさん:05/03/21 00:45:34
>>257
環境によるけど、メモリマップドファイルが使えるならfreopen()でいいじゃん。
264デフォルトの名無しさん:05/03/21 00:59:04
>>257
オブジェクトとして組み込むんですか?
モジュールとしてですか?
265デフォルトの名無しさん:05/03/21 01:07:39
>>257
stdioのショボサを語るのならこのスレでいいが、
環境依存の解決方法を求めるならスレ違い
266デフォルトの名無しさん:05/03/21 01:18:59
#include<stdio.h>

void card(int *a, char *n, char *o, char *q)
{
char card[] = {'0', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'};
char mark[] = {'0', 'D', 'H', 'S', 'C'}; //ダイヤ、ハート、スペード、クラブ

if(*a == 1) *o = mark[1];
if(*a == 2) *o = mark[2];
if(*a == 3) *o = mark[3];
if(*a == 4) *o = mark[4];

if(*n == 1) *q = card[1];
if(*n == 2) *q = card[2];
if(*n == 3) *q = card[3];
if(*n == 4) *q = card[4];
if(*n == 5) *q = card[5];
if(*n == 6) *q = card[6];
if(*n == 7) *q = card[7];
if(*n == 8) *q = card[8];
if(*n == 9) *q = card[9];
if(*n == 10) *q = card[10];
if(*n == 11) *q = card[11];
if(*n == 12) *q = card[12];
if(*n == 13) *q = card[13];
}

初心者です。凄い無駄なことやってるかも知れませんが。
数字をトランプの記号に置き換えする関数ですが0が表示される場合があります…
別のとこでrandで13の余り+1してるから問題はなさそうなんですが。
267デフォルトの名無しさん:05/03/21 01:23:34
"if"の前に"else"が抜けてるだけじゃないの
268デフォルトの名無しさん:05/03/21 01:27:36
これでいいのか?

void card(int a, char *n, char *o, char *q)
{
 char card[] = "0A234567890JQK";
 char mark[] = "0DHSC"; //ダイヤ、ハート、スペード、クラブ

 o[0] = mark[a];
 q[0] = card[*n]
 if (q[0] == '0') {
  q[0] = '1';
  q[1] = '0';
 }
}
269デフォルトの名無しさん:05/03/21 01:28:55
aやnの範囲チェックが欲しい所だな
270デフォルトの名無しさん:05/03/21 01:30:42
>>266
某診断室にありそうなプログラムだ・・・・。
271デフォルトの名無しさん:05/03/21 01:36:45
みなさんありがとうございます。
これよくよく考えると無駄ありすぎですね。最悪for使えよとか…
配列の先頭に0いれる必要性も特にないですね…ちなみにnは間違いでint型でした。
一部分だけじゃ分かりにくかったですね。とりあえず範囲チェックしてみます。
ありがとうございました。
272デフォルトの名無しさん:05/03/21 01:49:46
質問です。
#include<stdio.h>

main()
{
int p, c;

p = &c;

printf("%d",p);

return 0;
}

なんですけれども、

警告 W8069 050321-x.c 7: 移植性のないポインタ変換(関数 main )

というエラーが出てしまいます。

使い方がおかしいらしいのですが、いまいちポインタを上手く使えなくて困っています。
273デフォルトの名無しさん:05/03/21 01:51:06
え”?
274デフォルトの名無しさん:05/03/21 01:57:40
自己解決しました。

int *p, c;
に訂正したら、治りました
275デフォルトの名無しさん:05/03/21 01:59:31
お騒がせしました。照
276257:05/03/21 02:05:07
>>263
検討中なんですがきちんと排他制御できるか心配っす。

>>264
オブジェクトです。具体的にいうと環境依存になりますので割愛。

>>265
標準Cで>>257を満たすならなんでも結構です。
# このスレでPOSIXは無し?

277デフォルトの名無しさん:05/03/21 02:08:37
<パターン3>
客:ラーメンください。
店:ここは寿司屋です。ラーメンは無いです。
客:ラーメンください。
店:ラーメン無いよ。
客:ラーメンください。
店:無いって。
.....続く。
278デフォルトの名無しさん:05/03/21 02:27:45
>>276
標準Cでは満たせません
さようなら
279デフォルトの名無しさん:05/03/21 03:21:03
(void)strcpy(a, b);
みたいなのをよくみかけます
このキャストなんか意味あるんすか?
280デフォルトの名無しさん:05/03/21 03:30:21
>279
たしかlint(文法チェッカー)で
 strcpyの戻り値を使ってないYO!
という警告を抑制する意味があったはず。

最近はコンパイラ自体の文法チェックが強力になってきたんで
コンパイラと独立した文法チェッカはあまり使わない希ガス
281デフォルトの名無しさん:05/03/21 03:32:11
>>279
太古の昔のコンパイラでは、戻り値を使わないと警告が出たようなことを
聞いたことがあるような。
282デフォルトの名無しさん:2005/03/21(月) 04:14:21
客:ラーメンください。
店:あげない
EOF
283デフォルトの名無しさん:2005/03/21(月) 04:15:10
客:ラーメンください。
店:ぼけ
284デフォルトの名無しさん:2005/03/21(月) 04:18:42
>>281
ぼけ
むしろ逆。
むかしはそんなことぐらいでいちいち文句いうようなコンパイラーは1つもなかった。

void型が導入されてからだな。そういう警告をオプションで出せるようになったのは。
なのでごく最近(ここ15年ほど)だ。
285デフォルトの名無しさん:2005/03/21(月) 08:09:01
へんな基準
286デフォルトの名無しさん:2005/03/21(月) 08:40:41
>>279
c++で申し訳ないのですが、voidにキャストしている理由は同じかと...↓
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdndeepc/htm/deep05182000.asp?frame=true&hidetoc=true
void への変換 で、何故void型に変換するのか書いてあるのですが、その2番目の理由を読んでみてください。
287デフォルトの名無しさん:2005/03/21(月) 11:12:11
>>278
アホですか?できるにきまってるだろ。
288デフォルトの名無しさん:2005/03/21(月) 11:16:09
       ,,,,,,,,,,                          ,,ii,,、         ,,,i,,、  
      .,lllllllll,,,,,,,,,,,,,,,,,,,,,,,                  ,iillllllllllii,,    ,,,iillllllllii,,,  
  iiiiiiiillllllllllllllllllllllllllllllllllllllll|                ゙゙!lllllllllllllir .,,,iilllllllllllllll!゙゙′
  .llllllllllllllllllllllllll!!!!!!!!!!!!!!!!!″                ゙゙!!ll!゙",,,iilllllllllllll!!゙゙゜   
  .゙゙゙゙゙゙”゛ llllllllllliiiiiiii,,,,,,,、                       ,,,iillllllllllll!!゙゙゜ ___,,,,, 
    ,,,iiillllllllllllllllllllllllllllllliii,,                  ,,,,,,,,,iiiiiiilllllllllllllllllllllllllllllllllllllllll 
  .,,illlllllllllllllllllll゙゙゙゙゙゙!!llllllllllllli,    .,,,,,iiiiiiiiiiiiiiiiiii,,,、  .llllllllllllllllllllllllllllllllllllllllllllllll!!!!!!l 
  ,illllllllll!゙゙llllllllll|  ,illlllllllllllllll,  liilllllllllllllllllllllllllllllllli,,  lllllllllll!!lllllllllllllll!!゙゙゙”`     
 ,llllllllll゙ .lllllllllll .,,illlllllllllllllllllll、 ゙llllll!!゙゙゙’   ゚゙llllllllll  ゙゙”`.,illllllllll!l゙’         
: llllllllll° .llllllllllll,illllllllll!゙`lllllllllll  .゙゙゜      ,llllllllll!   ,llllllllllll°         
: llllllllll,  lllllllllllllllllll!゙゜ ,lllllllllll          ,,,illllllllll!゜   .llllllllllllli,_    ,,,,,,,,iiiiiii、 
: 'lllllllllllliiilllllllllllllll!!゙’  ,lllllllllll°    .,,,,iiillllllllllll!゙゜    ゙!llllllllllllllllliillllllllllllllllllllllll,、 
 .゙!!lllllllllllllllll!!!゙゙`   .l!!llllllll°    .゙!lllllll!!!゙°     ゙゙!!llllllllllllllllllllllllllllll  
289デフォルトの名無しさん:2005/03/21(月) 11:43:44
>>287
だったらお前が答えて差し上げなさいませ。
290デフォルトの名無しさん:2005/03/21(月) 17:51:03
やっと書き込めた。
291デフォルトの名無しさん:2005/03/21(月) 17:52:05
int st,st2,i=0,j=0;

char ss[]="C:\\美少女学園\\禁断\\個人データ\\画像\\110012.jpg";
char ss2[x];

st=strlen(ss);
while(ss[st-i]!='\\') { i--; j++; }
for(i=st-j;i=st';i++) { ss2[st2] = ss[i]; st2++: }

110012.jpg これをss2に入れたいんですが
出来ませんどうしたら良いでしょうか?

printf("%d %d %d\n",i,j,st);

こうすると文字数が出たらめになってるんですけど
'\\'これを認識させる方法がダメなんでしょうか? 
292デフォルトの名無しさん:2005/03/21(月) 18:00:05
>>291
char *ptr;
char ss[]="C:\\美少女学園\\禁断\\個人データ\\画像\\110012.jpg";
char ss2[100];

ptr = strrchr(ss, '\\');
if (ptr) {
strcpy(ss2, ptr + 1);
printf("%s\n", ss2);
}
293デフォルトの名無しさん:2005/03/21(月) 18:52:46
>>292
ありがとうございます

>ptr = strrchr(ss, '\\');
>if (ptr) {
>strcpy(ss2, ptr + 1);

これだと 始めの C:\\ が引っかかると思うのですが
なぜ最後の 110012.jpg が取得出来るんでしょうか?
 
294デフォルトの名無しさん:2005/03/21(月) 18:54:04
どっかのスレで、

187 :デフォルトの名無しさん :05/01/24 01:53:05
キーボードから入力を受付けるときに、
「キー連打」と「一定時間以上キー押しっぱなし」
を区別したいのですが、どうすればよいでしょうか?

188 :デフォルトの名無しさん :05/01/24 08:02:34
押しっ放しはkbhitが反応しっ放し
連打はkbhitが反応しないことがある

とあったのですが、なぜ連打は kbhit が反応しないことがあるのでしょう?
295デフォルトの名無しさん:2005/03/21(月) 19:00:59
>>294
どっかのスレで聞けやボケ
296デフォルトの名無しさん:2005/03/21(月) 19:09:14
>>293
> >ptr = strrchr(ss, '\\');
> >if (ptr) {
> >strcpy(ss2, ptr + 1);
>
> これだと 始めの C:\\ が引っかかると思うのですが

いえ、それはあなたの勘違いです
主要な関数の使い方を覚えていないのなら手元に参考書を用意してください
297デフォルトの名無しさん:2005/03/21(月) 19:13:22
>>296
そうなんですか

strstr()は
後ろから検索するんですね
知りませんでした
(参考書読んでませんが・・・)

ホントありがとうございました
298デフォルトの名無しさん:2005/03/21(月) 19:25:10
>>297
あんた視力悪いの?
299デフォルトの名無しさん:2005/03/21(月) 19:28:34
strstr
300作者:2005/03/21(月) 19:33:28
目も頭も悪い
301297:2005/03/21(月) 20:32:58
やっちまった・・・ orz
302デフォルトの名無しさん:2005/03/21(月) 21:40:05
あれ?
なんで隔離スレの冠を外しちゃったの?
303デフォルトの名無しさん:2005/03/21(月) 21:50:33
今まで大学でしかプログラミングしたことなかった俺が家のPCでもやろうと思うんだが、
まずコンパイラ何がいいか教えてくれ・・・・教えてください・・orz
WindowsXPでできるやつでお願いします
304デフォルトの名無しさん:2005/03/21(月) 21:51:59
305デフォルトの名無しさん:2005/03/21(月) 22:05:24
> まずコンパイラ何がいいか教えてくれ

gcc
306デフォルトの名無しさん:2005/03/21(月) 22:05:54
>>303
Linux入れろ。
おそらくgccをインストールすることになるだろう。
エディタはemacs。
これで始めとけ。
307デフォルトの名無しさん:2005/03/21(月) 22:06:54
>>303
windowsでカネを掛けないでイビツでない環境を作るのは不可能だから、
Linuxの方が勉強向きだ。
308デフォルトの名無しさん:2005/03/21(月) 22:07:46
>>303
FreeBSD
309デフォルトの名無しさん:2005/03/21(月) 22:12:09
っていうかWindowsでもcygwinやSFUでふつうgccだ。常識だろ!

で、gccより機能的にましなものおまえもってるか?
gccより標準規格に準拠度が高いものおまえもってるか?
gccの普及率というかシェアがどれだけか知ってるか?
Webでgccに関する情報量がどれだけあるかしってるか?
gccがサポートしているプラットフォームの多さを知っているか?
さらに、
gccは無料だ。

で、おまえgcc以外に何か薦めるものがあるとでも思ってるのか? ぼけ
さらには、
gccにはコンパイラーのソースもついている
これ以上強力な「おすすめ」があるか?
310デフォルトの名無しさん:2005/03/21(月) 22:16:13
普通にVC.NETのほうが良いと思うが
311デフォルトの名無しさん:2005/03/21(月) 22:19:54
別に無料という制限は無いし、VS.netでも薦めてみる。
でも、IDEの使い方で迷いそうだな
312デフォルトの名無しさん:2005/03/21(月) 22:21:52
>>309
プログラミング環境はコンパイラだけではなりたたないぞ。
313デフォルトの名無しさん:2005/03/21(月) 22:23:47
(笑
314デフォルトの名無しさん:2005/03/21(月) 22:36:31
>>303
まず大学で何を使っていたかを言えよ。
それと同じような環境を家で構築できるかどうか尋ねたほうがいいんじゃないか?
315デフォルトの名無しさん:2005/03/21(月) 22:43:12
>>309
長々と書いた割にはつまらんな。
適切なスレで宜しく。
316デフォルトの名無しさん:2005/03/21(月) 22:45:45
>>303
Visual Studioにしとけ
そしてWin32API+C言語が一番簡単
317デフォルトの名無しさん:2005/03/21(月) 22:51:50
なわけねー > 316
318デフォルトの名無しさん:2005/03/21(月) 22:52:54
VC++6.0が最強
319デフォルトの名無しさん:2005/03/21(月) 22:53:04
> プログラミング環境はコンパイラだけではなりたたないぞ

いや。成り立つ。

viもemacsもない環境でしょっちゅう開発してたからな。
% cat > foo.c
で足りる。
320ビル・ジョブス:2005/03/21(月) 23:15:25
XPにもEDLIN入ってるね。今でもEDLIN使える自分が怖いです。
321デフォルトの名無しさん:2005/03/21(月) 23:18:14
XPにはもうはいってませんよ > edlin
かなり以前に廃止になった。

DOSプロンプトなら
COPY CON > foo.c
です。常識!
edlinなんて軟弱ものがつかうものだ!
322デフォルトの名無しさん:2005/03/21(月) 23:18:54
> VC++6.0が最強

ふ。そんな厨房のつかうものを
たいしたもんだと思い込んでいるやつはかなりのぼけ
323デフォルトの名無しさん:2005/03/21(月) 23:21:30
ゴメン ゴメン
VC++6.0は
厨房や消防、ニート、引きこもりには買えないんだったな
324デフォルトの名無しさん:2005/03/21(月) 23:27:10
っていうか、そういうやつらしかつかわん。

ふつうgcc
325ビル・ジョブス:2005/03/21(月) 23:31:52
>321
あれれ?俺US版XPだからかな?おまいEDLIN使いこなせるのか?

で、細かくて悪いんだけど
>COPY CON > foo.c
のCONの後の'>'は要らないよ、まだまだ甘いね。

>322
C#が最強・・じゃなくて、VS.NETと.NET Frameworkが最強。
よくここまでWIN32をラップしたね。(チョット嫌味)
VS.NETはアタッチしてるサービスをTMから強制終了すると再アタッチ時にお亡くなりになってしまう。
なぜなら、悪い事をした罰だから。この辺が俺の作品らしいだろ。
326デフォルトの名無しさん:2005/03/21(月) 23:46:39
char ss[]="C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg";
char ss2[255];
char ss3[255];
int st,i,j=0;

st=strlen(ss);j=0;

for( i = 0; i<st; i++)
{
  if(ss[i] =='\\') {ss2[j]='\\'; j++; st++; ss2[j]='\\';}
  else ss2[j]=ss[i];
  j++;
}

ss[] = C:\ラピュタ\魔女\\トトロ\move0202.mpg を 
ss2[] = C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg に変更しているのですが

こうすると ss3[](他の変数)に影響してしまうのですが
なにが間違ってるのでしょうか?
327デフォルトの名無しさん:2005/03/21(月) 23:50:54
>>326
フォルダ構成が間違ってる
328デフォルトの名無しさん:2005/03/21(月) 23:51:11
>>326
> ss[] = C:\ラピュタ\魔女\\トトロ\move0202.mpg を 
> ss2[] = C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg に変更しているのですが

何がやりたいのかサッパリわからん
329デフォルトの名無しさん:2005/03/21(月) 23:55:07
すいません、少し間違ってましたね

char ss[]="C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg";

こうするとデータ上
ss[] = C:\ラピュタ\魔女\トトロ\move0202.mpg こうなります

それをデータ上で
ss2[] = C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg こう変更して
いるんですが

変更はうまくいくんですが
他の変数値がおかしくなってしまうんです
 
330デフォルトの名無しさん:2005/03/22(火) 00:01:21
これでいいのか?

int i, j, st;
char ss[]="C:\\ラピュタ\\魔女\\トトロ\\move0202.mpg";
char ss2[255];

st = strlen(ss);
for(i=0, j=0; i<st; i++, j++)
{
 if(ss[i] == '\\') {
  ss2[j++] = '\\';
 }
 ss2[j] = ss[i];
}
ss2[j] = '\0';
331デフォルトの名無しさん:2005/03/22(火) 00:02:53
すいません、解決しました

ss2[]={0};
ss3[]={0};

こう定義しちゃってました(^^;
332ビル・ジョブス:2005/03/22(火) 00:10:53
>326
st++って何?関係無いからいじっちゃダメよ。

> ss[] = C:\ラピュタ\魔女\\トトロ\move0202.mpg を
の\\はネタ?
333デフォルトの名無しさん:2005/03/22(火) 00:13:12
333 ∈(・◎・)∋ 333
334ビル・ジョブス:2005/03/22(火) 00:16:57
おいおい!解決が早すぎるだろ!(遅レスしちまっただろーが!)

まーそれはいいとしても、st++について触れられてないがおまい本当に大丈夫か?
ループカウンタはいじっちゃダメよ。これはプログラム界の常識だよ。
335デフォルトの名無しさん:2005/03/22(火) 20:11:47
>>334
相変わらずだな、お前は…
ちったぁ進歩しろよ。
336デフォルトの名無しさん:2005/03/22(火) 20:14:40
コンソールで他のEXEを実行させるプログラムを作りたいんだけど
たとえば、1を入力するとエクセルが起動とか2を入力するとワードが
起動するとか。だれかわかる人起動のとこのソースだけ教えてください
337デフォルトの名無しさん:2005/03/22(火) 20:17:23
C言語をこれから覚えようと思うのですが、解説サイトでお勧めのところはありますか?
338デフォルトの名無しさん:2005/03/22(火) 20:20:45
早速ですが教えてください。
文字列“/TEMP/DIR/TEST/ABC.sh”
があります。”ABC.sh”のみを抽出したいのですが
何方さまかご教授お願いいたします。
339デフォルトの名無しさん:2005/03/22(火) 20:31:41
char* s = "TEMP/DIR/TEST/ABC.sh";
char* p = strrchr(s, '/') + 1;
printf("%s", p);
340デフォルトの名無しさん:2005/03/22(火) 20:43:24
>>339
非常にたすかりました。感謝いたします。
ありがとうございます!!
341デフォルトの名無しさん:2005/03/22(火) 20:57:25
system
Wisdom
342デフォルトの名無しさん:2005/03/22(火) 21:18:18
tmpfile()で作成したファイル名を知りたいのですがどうしたらよいでしょうか。

または、プログラム中で、ファイルディスクリプタの番号しかわからない場合
にそのファイル名を知りたい場合はどうしたらよいでしょうか。
343デフォルトの名無しさん:2005/03/22(火) 21:29:00
K&Rの日本語版って、数字の1をアルファベットのlで書いてある箇所が何箇所かあるんですが、
これは嫌がらせですか?
344デフォルトの名無しさん:2005/03/22(火) 21:43:42
昔はフォントの節約のために、0とO、1とlは同じ字を使っていたんだよ。
と書いたものの、そういう話ではない気がした。

そう、たぶん、その現象の名は、誤植。
345デフォルトの名無しさん:2005/03/22(火) 21:48:15
>>342
直接の回答ではないけど、tmpnamとfopenを組み合わせるとか
346デフォルトの名無しさん:2005/03/23(水) 01:15:45
>>342
> tmpfile()で作成したファイル名を知りたいのですがどうしたらよいでしょうか。
そういう用途にはmkstemp()を使うのが良い

> または、プログラム中で、ファイルディスクリプタの番号しかわからない場合
> にそのファイル名を知りたい場合はどうしたらよいでしょうか。
無理
347デフォルトの名無しさん:2005/03/23(水) 01:16:21
>>346
ゴメン・・・mkstemp()って標準Cじゃなかった・・・
348デフォルトの名無しさん:2005/03/23(水) 07:39:28
>>342
>>345が正解だと思う

ファイルディスクリプタ云々は標準Cから外れると思われ
349デフォルトの名無しさん:2005/03/23(水) 10:55:03
int *a
a = (int *)calloc(20,sizeof(int));

ってやった場合,あとあと配列aの要素数を調べる方法ってありませんか?

int a[20];
なら sizeof で調べられるのは分かって感動したんですが・・・この場合は無理でした
350デフォルトの名無しさん:2005/03/23(水) 10:58:44
>>349
残念ながら、ない
351デフォルトの名無しさん:2005/03/23(水) 11:00:59
たまに fopen( "aaa", "w" ) ;
とかってやると、Documents and Settings 直下のフォルダに aaa が出来るんですけど、
これってどういう時なんですか? 普通にカレントディレクトリに作成される事もあるんです。
352デフォルトの名無しさん:2005/03/23(水) 11:01:28
>>349
その場合の変数「a」は配列ではなくポインタ。
「a」が指している領域は配列としてアクセス可能である。
しかし、要素数を得ることは出来ない。
自分で覚えておくのが普通だ。
353デフォルトの名無しさん:2005/03/23(水) 11:12:43
>>351
カレントディレクトリが
Documents and Settings 直下
になってたんだろ。
どうせコマンドプロンプトにファイルドラッグアンドドロップして
実行したとかそんなとこだろ
354デフォルトの名無しさん:2005/03/23(水) 11:18:49
>>349
sizeofってのはコンパイル時に定数に置き換えるだけだよ。
355デフォルトの名無しさん:2005/03/23(水) 11:25:36
>>350
>>352
そうですか,残念
回答ありがとう!
356デフォルトの名無しさん:2005/03/23(水) 11:30:31
>>354
それは知りませんでした
ありがとう!
357デフォルトの名無しさん:2005/03/23(水) 13:47:59
>>354
>>349の場合はそうだがC99では可変長の配列もある
その時sizeofは動的にサイズを計算して返してくれる
358デフォルトの名無しさん:2005/03/23(水) 15:03:42
sizeofってすごーい\&heart;
359デフォルトの名無しさん:2005/03/23(水) 15:06:17
ぎゃ♥
360354:2005/03/23(水) 18:26:03
>>357
正直すまんかった。
アセンブラコード見たとき定数だったから動的な計算は出来ないと思ってたよ。

>>356
ごめん。忘れてくれ…。
361デフォルトの名無しさん:2005/03/23(水) 18:37:36
RHEL3でgccで環境変数を使うプログラムを書いているのですが
この環境変数に書き込める値の限界が見えません。

今環境変数に書き込みしているテストプログラムが710万行(一行100byte)を超えました…

top vmstat freeで見張っているのですが、メモリを使用しているように見えません。

このプロセスが使用している環境変数のメモリ量はどのように知ればいいのですか?
362デフォルトの名無しさん:2005/03/23(水) 18:39:47
>>361
お前のような馬鹿は氏ななきゃ治らない
363デフォルトの名無しさん:2005/03/23(水) 18:43:33
>>362
1つのプロセスにつき、使用できる環境変数は1つの値ということですか?

なんかnullっぽいです…
364デフォルトの名無しさん:2005/03/23(水) 18:44:53
>>363
ガッ!
365デフォルトの名無しさん:2005/03/23(水) 18:45:51
>>361
glibc がどうしてるかはソースを見ないとわからんが、UNIX 系なら
malloc() と変わらんのじゃないかな。
同じ名前の環境変数を次々とセットして「メモリ使用量が増えない」と
か言ってないよね?
366デフォルトの名無しさん:2005/03/23(水) 18:49:17
>>364
Environmental Variableでも検索しているのですが、よく分からない。。。
367デフォルトの名無しさん:2005/03/23(水) 18:54:51
>>365
ありがとうございます。

mallocだと親プロセスが使用しているメモリを子プロセスが引き継いでしまい、
データが重複してメモリを占有してしまうと、あんまりきれいじゃないと思うので、
避けてました。

>同じ名前の環境変数を次々とセットして「メモリ使用量が増えない」と
>か言ってないよね?

それはないです。すいません。
368デフォルトの名無しさん:2005/03/23(水) 19:07:15
親プロセスがmallocで500MBを確保し、子を10個作成した(エラー表示なし)のですが、
topなどではほとんどメモリを使用しているように見えません。

500MB×10プロセス=5GB占有?
369デフォルトの名無しさん:2005/03/23(水) 19:08:33
クラスタ上の話か…?
370デフォルトの名無しさん:2005/03/23(水) 19:23:32
Cに「子プロセス」や「top」なんてあったっけ?
という話は置いといて

書き込まれるまで、物理メモリは確保されないという実装も多いけど。
特に現状のfork等を使っているのなら。
371デフォルトの名無しさん:2005/03/23(水) 19:43:59
>>368
copy-on-writeって言葉を知ってますか?
あとは、UNIX関連のスレでね。
372デフォルトの名無しさん:2005/03/23(水) 20:10:37
switch文で文字列を評価したんだけどコンパイルは通るんだけど反映されない
のは無理なんですか?
char str[80]
gets(str)ここでstrにBDって入力して

switch(str){ case 'BD':・・・}って感じで評価したんだけど
if文ではいけたんだけど、本見てもcaseの時は1とか数字で評価してるのしか
のってないし。教えてください

373デフォルトの名無しさん:2005/03/23(水) 20:29:08
switchの評価対象はchar型またはint型の変数に限られる。

char str[80];
switch(str){ case 'BD':・・・}

上記の場合、変数配列strのアドレスを評価してるね。
つまり、str[0]が128番地であった場合、str == 128 となる。
文字列は評価されないよ。
あと、シングルコーテーションは文字を囲むのに使用し、
文字列を囲むときにはダブルコーテーションを使用する。

もし評価したければ
if (strcmp(str, "BD") == 0){・・・}
というふうになるだろうね。
switchは万能じゃないから気をつけて。
これはC言語以外にも言える。switchは基本的に整数型のみ。



というか、'BD'でコンパイルエラーにならないのか・・・。
「if文ではいけた」らしいが怪しい・・・。
374デフォルトの名無しさん:2005/03/23(水) 20:29:36
>>373>>372に対するレスね。
375デフォルトの名無しさん:2005/03/23(水) 20:46:05
>>373
なるほど、具体的にはstrがアドレスになるのは知ってるけど
最初switch(*str)で、あとの”で評価したんだけどエラーでとおらなくて
シングルコーテションにしたらとおったから
ちなみif文では*strで評価したらうまいこと処理にいっったんですけど
同じ処理が続くんでswitchにしたんだけど、やっぱり無理みたいですね。
switchでは。ありがとうございました
376デフォルトの名無しさん:2005/03/23(水) 20:52:15
'BD'
って書くと値は処理系依存なので...
それに、*str は最初の1文字だけの値だし...
377デフォルトの名無しさん:2005/03/23(水) 21:07:42
> ちなみif文では*strで評価したらうまいこと処理にいっったんですけど

これは偶々。
378デフォルトの名無しさん:2005/03/23(水) 21:47:52
時刻を表すプログラム

#include<time.h>
#include<iostream>
using namespace std;

void main()
{
time_t localTime;

time(&localTime);
char* strTime = ctime(&localTime)

cout << "今は、" << strTime << endl;
}
379デフォルトの名無しさん:2005/03/23(水) 21:52:53
>>378
せっかく書くなら
#include <time.h>

#include <ctime>
380側近中の側近 ◆0351148456 :2005/03/23(水) 22:59:51
(っ´▽`)っ 必ずコンパイルして実行するように!

#include<stdio.h>
int main(void){
char Res[20];
printf("(っ´▽`)っ 私ってかわいい?\n");
while(1){
fgets(Res, sizeof(Res), stdin);
if(((Res[0] == 'Y') || (Res[0] == 'y')) && (Res[1] == '\n')){
printf("(っ´▽`)っ ありがと(抱)\n");
break;
}
else{
printf("(っ´▽`)っ もう一度聞くよ?私ってかわいい?\n");
}
}
return(0);
}
381デフォルトの名無しさん:2005/03/23(水) 23:39:15
>>380
文字化けした
382デフォルトの名無しさん:2005/03/24(木) 01:02:03
文字コード変換はLinuxならnkfだっけ?
Winならエディタ使うけど
383デフォルトの名無しさん:2005/03/24(木) 01:18:27
>>379
ここどこだ。
384デフォルトの名無しさん:2005/03/24(木) 01:20:05
>>382
スレ違い。
Linuxでもエディタで変換することもあれば、Winでもnkfを使うこともある。
385デフォルトの名無しさん:2005/03/24(木) 01:20:24
コピペだが。
C++相談室 part39
http://pc8.2ch.net/test/read.cgi/tech/1106527792/484

また1つ優秀なデスクトップ開発環境がなくなりました。

ttp://www.metrowerks.co.jp/information/2005/info0323.html

お客様各位
2005年3月23日
メトロワークス株式会社
CodeWarrior Desktop製品販売終了のお知らせ

拝啓 時下ますますご清栄のこととお喜び申し上げます。平素は格別の
ご高配を賜り、厚くお礼申し上げます。このたび弊社では、2005年4月30日
をもちまして下記のDesktop向けCodeWarrior各製品の販売を終了いたし
ます。一部の日本語版製品につきましては在庫終了のため、本日をもって
販売を終了させていただきます。長年にわたり弊社製品にご愛顧を賜り
誠にありがとうございました。今後もGame、Embeddedシステム向けに、
より良いCodeWarrior開発ツールとサポートを提供してまいる所存です
ので、何卒よろしくお願い申し上げます。
(後略)
386デフォルトの名無しさん:2005/03/24(木) 14:42:56
こんにちは、NIDA といいます。

# Vine 3.1 の gcc 3.3.2 、nasm 0.98.38 です。
# 自作 PC です。

CUI のプログラムで、"Password :" と表示した後、
パスワードを入力してもらおうと思います。

その際、入力したキーを表示しないようにするには、
どうすればいいのでしょうか。
# "su" のような事がしたい。

よろしくおねがいします。 m(_ _)m
387デフォルトの名無しさん:2005/03/24(木) 15:04:06
>>386
実装依存
388デフォルトの名無しさん:2005/03/24(木) 15:04:36
>>386

>やれやれ、Cには上のようなことをおこなう標準的な方法も移植性の 高い方法もない。
>(C FAQ 19.1 より引用。)
ttp://www.kouno.jp/home/c_faq/c19.html#1

Unix系スレで質問する事をお薦めする。
389デフォルトの名無しさん:2005/03/24(木) 15:05:24
>>387
誰もそんなこと聞いてないんだよ。
お前社会性ないだろ?
390デフォルトの名無しさん:2005/03/24(木) 15:18:32
>>389
藻前がな。
スレタイ位嫁。
391デフォルトの名無しさん:2005/03/24(木) 15:22:23
>>390
そんなこと言ってるんじゃないんだよ^^
392デフォルトの名無しさん:2005/03/24(木) 15:53:33
ヘッダーファイルの二重include防止に
#ifndef〜を使え!とあるんですが、
そもそも二重includeされるような状況って
どんな場合なんでしょう?
あと、関数ポインタって何の役に立つんですか?
393デフォルトの名無しさん:2005/03/24(木) 16:05:06
>>392
> そもそも二重includeされるような状況って
> どんな場合なんでしょう?

例えば、別々のファイルに書かれている関数をお互いに呼びあったりするプログラムだったら
無限にincludeしつづけるよね。

> あと、関数ポインタって何の役に立つんですか?
実行時に使いたい関数を選択できることです。
実行時にアルゴリズムを選択できる関数があれば汎用性が高まると思いませんか?
テストをする段階ではごく単純なアルゴリズムでテストしておいて、後で複雑なアルゴリズムを
作る、という事も簡単にできますね。
ファンクショナルプログラミングではもっと別の意味で使いますが…
394デフォルトの名無しさん:2005/03/24(木) 17:10:25
可変個引数の関数を呼び出す時にオプション引数に2Byteの変数を指定し、
関数の中でva_argマクロで参照するとき1Byteで参照した時の戻り値は、
2byte変数の上位8bitが1度目の戻り値で、
次の参照時の参照位置が下位8bitを指しているって言う事であっていますか?
395デフォルトの名無しさん:2005/03/24(木) 17:22:30
>>394
実装依存。
例えば32bit intのCコンパイラなら4byte境界に詰め込む。
つーか、intとして取り出せばOK。
396394:2005/03/24(木) 17:38:42
>>395
なるほど、ありがとうございました。
397デフォルトの名無しさん:2005/03/24(木) 18:16:48
linuxで組んでますが、
シグナルハンドラの中にいるときに該当するシグナルが発生したら中断するんですか?
セマフォとか使う必要がある?
398397:2005/03/24(木) 18:17:57
捕捉
自分の場合SIGCHLDについて気になってます。
399デフォルトの名無しさん:2005/03/24(木) 18:18:24
>>397
そんなのテストコード書いて調べりゃいいじゃない
馬鹿じゃないの?
400デフォルトの名無しさん:2005/03/24(木) 18:19:29
>>399
じゃおまえがテストコード書け。
俺がテストしてやるから。
401デフォルトの名無しさん:2005/03/24(木) 18:21:04
>>400
プププ
402デフォルトの名無しさん:2005/03/24(木) 18:33:17
すいません、教えてください
mainで配列に値を入れ、関数testで合計と平均を求め、mainで表示する例題をやっているのですがえらーが出て出来ません
#include <stdio.h>

void test(float data[],float *p1,float *p2)
{
int i;
float sum,ave;
for(i=0;i<5;i++){
sum+=data[i];
}
ave=sum/i;
p1=∑
p2=&ave;
}

void main(void)
{
int i;
float data[5],*p1,*p2;
for(i=0;i<5;i++){
printf("data[%d]>>",i);
scanf("%f",&data[i]);
}
test(data,p1,p2);
printf("sum=%f\nave=%f",*p1,*p2);
}
これをやるとprintf("sum=%f\nave=%f",*p1,*p2);のところで「不正なアドレス参照」とエラーが出ます
403デフォルトの名無しさん:2005/03/24(木) 18:37:02
p1=∑
404デフォルトの名無しさん:2005/03/24(木) 18:37:31
引数**p1 **p2
にしたらダメ?
405404:2005/03/24(木) 18:40:37
ごめん
見当ちがいだった。
406402:2005/03/24(木) 18:41:09
>>403
それはp1=&sum;
です。勝手に変換されてしまたようです

>>404
void test(float data[],float **p1,float **p2)
ってことですよね?
エラーが増えました
407デフォルトの名無しさん:2005/03/24(木) 18:46:43
また違ったらすまないですが、mainからtest()内の(スタック上の)sum,aveを参照していいの?
408402:2005/03/24(木) 18:53:23
すいません、そこまで高度なことはわかりません
ただ、配列のやり取りと同じようなイメージでやっているだけなんで・・・
409デフォルトの名無しさん:2005/03/24(木) 18:55:01
>>402
test()内の
p1=& sum;
p2=&ave;

*p1=sum;
*p2=ave;
に、

main()内の
float data[5],*p1,*p2;

float data[5],d1,d2,*p1=&d1,*p2=&d2;
にする。
410402:2005/03/24(木) 18:59:37
できました!

理解できるかどうかわかりませんがこうする目的をおしえてください
411デフォルトの名無しさん:2005/03/24(木) 19:05:28
>>410
ローカル変数の寿命はスコープが閉じるまでだから
test関数を抜けた時点でaveとsumは参照してはいけない。
>>409は、d1,d2という実体をあらかじめ作って、そちらにデータを入れているからOK。
別の解決策としては
float sum, ave;

static float sum, ave;
にするとか。
412402:2005/03/24(木) 19:12:37
んーなるほど
「家」だけポツンと用意するのではなく、きちんと「家と住所」を用意してやる
といった感じでしょうか(^_^;)・・・
413デフォルトの名無しさん:2005/03/24(木) 19:15:15
>>412
ローカル変数(家)は関数を抜けると取り壊されちゃうから、
住所を辿っていったら駐車場だった、なんて困るだろ。
414402:2005/03/24(木) 19:21:26
をを!わかりやすいっす
なるほどなるほど
415402:2005/03/24(木) 19:29:35
ちなみにstatic変数を使った場合って
単純に>>402のソースで
float sum, ave;

static float sum, ave;
にするだけでいいんでしょうか?

これでやると不正終了してしまったんですが
416デフォルトの名無しさん:2005/03/24(木) 19:52:32
>>415
うちの環境じゃ
test()が不要になった、main最後のprintf()の段階ではaveがNULLになってるみたいに見える。
コンパイラの最適の問題かな。
-O2指定したらエラーにならなかった。
417デフォルトの名無しさん:2005/03/24(木) 19:53:32
もちろん、指定しないと>>415さんと同じにエラーになります。
418デフォルトの名無しさん:2005/03/24(木) 19:54:08
>>415
いやそれだけじゃダメ
419402:2005/03/24(木) 19:58:24
実体を用意するのは必須ですか?
420デフォルトの名無しさん:2005/03/24(木) 20:01:25
スマートじゃないが…
void test(float data[],float **p1,float **p2)
{
int i;
static float sum=0, ave;
for(i=0;i<5;i++){
sum+=data[i];
}
ave=sum/i;
*p1=∑
*p2=&ave;
}

void main(void)
{
int i;
float data[5],*p1,*p2;
for(i=0;i<5;i++){
printf("data[%d]>>",i);
scanf("%f",&data[i]);
}
test(data,&p1,&p2);
printf("sum=%f\nave=%f",*p1,*p2);
}
421デフォルトの名無しさん:2005/03/24(木) 20:04:31
void test(float data[],float **p1,float **p2)
にして
test(data,&p1,&p2);
でよびだしたら出来た。
422402:2005/03/24(木) 20:06:49
なるほど
素直に>>409を使ったほうがよさそうですね
調べたらstatic変数はメモリの無駄遣いになりかねないとありますし

どうもありがとうございました
423デフォルトの名無しさん:2005/03/24(木) 20:14:20
>>409
それなら、これでよくない?

void test(float data[],float *p1,float *p2)
{
int i;
float sum=0,ave=0;
for(i=0;i<5;i++){
sum += data[i];
}
ave=sum/i;
*p1=sum;
*p2=ave;
}

void main(void)
{
int i;
float data[5],d1,d2;
for(i=0;i<5;i++){
printf("data[%d]>>",i);
scanf("%f",&data[i]);
}
test(data,&d1,&d2);
printf("sum=%f\nave=%f",d1,d2);
getch();
}

424デフォルトの名無しさん:2005/03/24(木) 20:48:10
if((fp==fopen("test.text","r")==NULL))
ってがあった場合testのところをscanfとかで入力した値にしたいんだけど
たとえば123を入力したら123.textってなる感じで今日いろいろ試したんですけど
うまくいきません教えてください
425デフォルトの名無しさん:2005/03/24(木) 20:52:24
char str[256];
char suffix[] = ".text";

printf("ファイル名:");
fgets(str, sizeof(str)-sizeof(suffix), stdin);
str[strlen(str)-1] = '\0';
strcat(str, suffix);

if ((fp = fopen(str, "r")) == NULL)
426デフォルトの名無しさん:2005/03/24(木) 22:10:06
>>425
ありがとうございます
やってみます
427デフォルトの名無しさん:2005/03/24(木) 22:38:56
strdup()がC99の仕様に載っていないんですが、
もしかして非標準なんですか?
428デフォルトの名無しさん:2005/03/24(木) 22:43:48
>>427
はい,非標準です。
429デフォルトの名無しさん:2005/03/24(木) 22:44:09
>>427
自分で調べろ
430デフォルトの名無しさん:2005/03/24(木) 22:54:24
こんにちは、NIDA といいます。

# Vine 3.1 の gcc 3.3.2 、nasm 0.98.38 です。
# 自作 PC です。

388 wrote:
>>やれやれ、Cには上のようなことをおこなう標準的な方法も移植性の 高い方法もない。
>>(C FAQ 19.1 より引用。)
>ttp://www.kouno.jp/home/c_faq/c19.html#1
>
>Unix系スレで質問する事をお薦めする。

Windows 上で動くやつは、masm でキー入力の部分を書いて、
他を C で作っていたんですが、Linux 上で同じものを作る際に、
全部 C で書けなかったかなーと思いちょっと質問してみました。

今のやつは、Linux 上で動作すればいいので、getpass() で十分です。

ありがとうございました。 m(_ _)m

431デフォルトの名無しさん:2005/03/24(木) 23:14:53
標準ライブラリ関数のソースコードを見たいのですが
ネットで見れるとこないでしょうか?
432デフォルトの名無しさん:2005/03/24(木) 23:16:57
BSDのソースとか、wikipediaにも一部載ってた気がする
433デフォルトの名無しさん:2005/03/24(木) 23:17:14
どこにでもころがってる
434デフォルトの名無しさん:2005/03/24(木) 23:18:04
GCCのソースコードを見ろ>431
435デフォルトの名無しさん:2005/03/24(木) 23:21:58
436431:2005/03/24(木) 23:25:54
>>435
そのものズバリの直リンクありがとうございました!
こういうの探してました!
437デフォルトの名無しさん:2005/03/24(木) 23:27:41
また甘やかして・・・本人のためにならんだろうね
438デフォルトの名無しさん:2005/03/24(木) 23:36:28
char str[200];
char tuki[5];
char hinichi[5];
char text[20];
char kakutyou[]=".txt";
char suji[]="050";
******************

printf("月を入力してください・・・");
gets(tuki);
printf("日にちを入力してください・・・");
gets(hinichi);

printf("[%s]月[%s]日\n",tuki,hinichi);

tuki[strlen(tuki)-1] = '\0';
x=strlen(tuki);
hinichi[strlen(hinichi)-1] = '\0';
strcat(suji,tuki);
どうも連結がうまくいきません050で連結されませんどこがまずいんでしょうか?
いろいろためしたんですけど
439デフォルトの名無しさん:2005/03/24(木) 23:38:05
>>438
tuki[strlen(tuki)-1] = '\0';
hinichi[strlen(hinichi)-1] = '\0';
はそれぞれfgetsの'\n'も読み込まれることへの対処法。
だからgetsを使うときには不要……じゃなくてfgets使え。
440デフォルトの名無しさん:2005/03/24(木) 23:45:25
そのうちgets_sになるんだろな
441デフォルトの名無しさん:2005/03/24(木) 23:57:35
fsage()とか
442デフォルトの名無しさん:2005/03/25(金) 01:12:07
>>438
suji配列の要素数は幾つでしょう。また、strcat()は何をする関数でしょう。

初心者スレに行って欲しいと思うよ。
443デフォルトの名無しさん:2005/03/25(金) 01:40:58
つーか何で>>425はわざわざstrcatなんか使うのさ。
sprintfだけで充分じゃん。
444デフォルトの名無しさん:2005/03/25(金) 01:42:32
strcatが使いたい。。。
そんな時期が私もありました。。。
445デフォルトの名無しさん:2005/03/25(金) 01:48:34
バッファ領域二つ使いたくないとか
446デフォルトの名無しさん:2005/03/25(金) 02:10:47
>>443
タイプ量が少ないだろ
447デフォルトの名無しさん:2005/03/25(金) 02:12:18
お前ら、本質とは違う妙なところに拘るのな。
なんで?strcatだろうとsprintfだろうと一緒じゃないか。
448デフォルトの名無しさん:2005/03/25(金) 02:17:10
読んだ時の理解しやすさ=保守性が段違い
449デフォルトの名無しさん:2005/03/25(金) 02:17:42
>>448
あははは 面白いジョークだねー^^
450デフォルトの名無しさん:2005/03/25(金) 02:21:26
ま、分かる人はすぐ分かるし、分からない人には永遠に分からないってことで。
451王 ◆nuLlpOKIng :2005/03/25(金) 03:18:25
tp://enjoy.pial.jp/~maki/sky/sun.htm
を作ってみたのですが、
想定していた結果になりません。

http://katori-id.hp.infoseek.co.jp/Program/hinode.c.html

どこがいけないのか教えてください。
452デフォルトの名無しさん:2005/03/25(金) 03:47:37
>>451
質問するスレがいけない
453デフォルトの名無しさん:2005/03/25(金) 03:52:32
>>451
名前がいけない
454デフォルトの名無しさん:2005/03/25(金) 04:00:58
>>451
ハンドルがいけない
455デフォルトの名無しさん:2005/03/25(金) 05:27:40
>>423の最後にあるgetch();って何でつか。
手元の本には、getcとかgetcharしか載ってないんでつが。
456デフォルトの名無しさん:2005/03/25(金) 05:54:11
>>455
ぐぐれ
457423:2005/03/25(金) 06:54:17
>>455
消し忘れた。
ただのキー入力待ちだから、気にしなくていいよ。
詳細はググってくれ。
458デフォルトの名無しさん:2005/03/25(金) 10:27:54
>>456,>>457
ありがとござますた。getchって習わなかったので・・・
消し忘れだったのですか?
459王 ◆nuLlpOKIng :2005/03/25(金) 17:33:18
失礼しました。
すれ立てる(rで質問しなおしてきます。
お騒がせいたしました。
460デフォルトの名無しさん:2005/03/25(金) 18:17:22
fgets関数で、ファイルの終わりまで1行読み込み、というのはどうすればできるのでしょうか?
fscanfの要領で
while( fscanf(str, 100, fp) != EOF) { 〜 }
とやってみましたができませんでした
461デフォルトの名無しさん:2005/03/25(金) 18:19:21
>>460
君のソースに春を感じる...
462デフォルトの名無しさん:2005/03/25(金) 18:20:13
>>460
> fgets関数は、成功するとsを返す。
> ファイルの終わりを検出し、かつ配列に1文字も読み取っていなかった場合、配列の内容を変化させずに残し、空ポインタを返す。
> 読取りエラーが発生した場合も空ポインタを返すが、この場合の配列の内容は不定である。
463デフォルトの名無しさん:2005/03/25(金) 18:26:19
>>462
…どこからのコピーか教えてくれ。
464デフォルトの名無しさん:2005/03/25(金) 18:44:09
>>463
JIS X3010:2003 (ISO 9899/1999)
JIS Cではnull pointerを空ポインタと訳してる
465デフォルトの名無しさん:2005/03/25(金) 18:50:18
ようはぬるぽ
466デフォルトの名無しさん:2005/03/25(金) 18:52:01
ガッ!!!
467デフォルトの名無しさん:2005/03/25(金) 19:15:36
ぬるぬる
468デフォルトの名無しさん:2005/03/25(金) 19:24:07
167 :一見孤児 :05/01/23 09:05:40
局所変数の頭を大文字にするな。
マナーと互換性を気にするなら、stdlib.hはstdio.hより先に書き、sizeofの後は()で囲め。

とあったのですが、なぜ彼はなぜこのような事を書き込んだのだと思いますか?
stdio.h の中で stdlib.h の中身がインクルードされていると言う事??
未熟な僕には検討もつかないので、よかったら教えてください。
469デフォルトの名無しさん:2005/03/25(金) 19:27:50
>>468
そいつに聞けよ
470デフォルトの名無しさん:2005/03/25(金) 19:43:50
_get_osfhandle 。これ使って何が出来るんですか?
簡単なサンプルプログラム作れる凄腕のかたいらっしゃいます?
471デフォルトの名無しさん:2005/03/25(金) 19:52:23
>>470
テンプレ嫁

> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
472デフォルトの名無しさん:2005/03/25(金) 20:02:02
失礼しました!
473デフォルトの名無しさん:2005/03/25(金) 20:38:13
このスレっていったい何のためにあるのか、ほんと疑問。
Cの言語仕様についての質問のみ受け付けるってこと??
その他ライブラリについては受け付けないっていうことなのかな…
でも標準ライブラリの使い方の質問には答えているよね…疑問。。。。。
474デフォルトの名無しさん:2005/03/25(金) 20:40:26
>>473
標準C規格には標準ライブラリも含まれてますが?
475デフォルトの名無しさん:2005/03/25(金) 21:46:43
>>473
どーしても厳密な基準を示せと言われると ISO/IEC9899 が言及している範囲と言わざるを得ないが、
個人的には K&R 1st や、ボツネタの話なんかもありにしたいな
476デフォルトの名無しさん:2005/03/25(金) 21:50:58
環境依存・機種依存じゃなければいいんじゃね
477デフォルトの名無しさん:2005/03/25(金) 21:53:26
環境依存→処理系依存

内容がダブってた orz
478デフォルトの名無しさん:2005/03/25(金) 22:21:35
>>473
おまえ自身が疑問だよ
479デフォルトの名無しさん:2005/03/25(金) 22:24:43
VC++はC99をなかった事にしたがってる気がするんですが
480デフォルトの名無しさん:2005/03/25(金) 22:27:02
>>478
意味解かんないこと言わないで。
481デフォルトの名無しさん:2005/03/25(金) 22:30:07
>>479
理由は?
482デフォルトの名無しさん:2005/03/25(金) 22:35:35
VC++2005で対応すると明記されてないもので
483デフォルトの名無しさん:2005/03/25(金) 22:38:46
>>478
どちらかというとシャキっとしています
484デフォルトの名無しさん:2005/03/25(金) 22:45:48
複合リテラルあたりも対応してるのはgccぐらいじゃないか?
それでも明示的に指定しないと使えないし
485デフォルトの名無しさん:2005/03/25(金) 23:19:19
>>482
いらねーもんな
Cの用途は89で充分
486デフォルトの名無しさん:2005/03/25(金) 23:21:51
CCレモン
487デフォルトの名無しさん:2005/03/26(土) 01:04:51
通るコンパイラと通らないコンパイラがあるんだけど、どっちが正しい動作?

#define REM /##/
REM ここはコメント
int main(){ return 0; }
488デフォルトの名無しさん:2005/03/26(土) 01:11:37
コンパイラによる。
489デフォルトの名無しさん:2005/03/26(土) 01:26:35
>>487
そんな書き方をしないのが、
藻前が取るべき正しい動作だ。
490デフォルトの名無しさん:2005/03/26(土) 01:31:48
【 質問 】
 int a[] = { 1, 0, 1, 0 } ;
 この要素数4の2進数各桁が入った配列を、
 10進数の10として取り出すいい方法ないですか?
491デフォルトの名無しさん:2005/03/26(土) 01:38:20
int val = 0;
int ic;
for (ic = 0; ic < sizeof(a) / sizeof(*a); ++ic) {
val = val << 1 | a[ic];
}
492デフォルトの名無しさん:2005/03/26(土) 01:50:41
ほ、ほんとに出来た!
ありがとうございました!
493487:2005/03/26(土) 01:50:48
>>488
Thanks. 処理系定義ってことですね。

>>489
うるさい、無知はレスするな。
ありがとう、よく判りました。
・・・どちらのレスが正しい動作ですか?
494491:2005/03/26(土) 01:56:31
>>492
一応注意。
配列aはもっと長くても正しく動くけど、valをintにしているのでINT_MAXを越えない範囲でのみ有効ということで。
unsigned int val = 0;にしておけば32ビットまで正しく変換できるからそうするべきなんだろうな。
495デフォルトの名無しさん:2005/03/26(土) 02:03:55
sprintf()に二進表示(%bとか)相当は無いんですか?
496デフォルトの名無しさん:2005/03/26(土) 02:10:37
>>495
試せばわかんだろ、馬鹿じゃねぇか?
497デフォルトの名無しさん:2005/03/26(土) 02:15:11
>>495
ない。
498デフォルトの名無しさん:2005/03/26(土) 02:23:52
>>495
無い
499デフォルトの名無しさん:2005/03/26(土) 03:33:32
ひらがなのソートはおまいらにできますか?
500デフォルトの名無しさん:2005/03/26(土) 03:42:56
>>499
できない
501デフォルトの名無しさん:2005/03/26(土) 03:55:51
EUCだと下側のバイトだけひかくしていれかえるとたぶんできるから
おまえやれよ
502デフォルトの名無しさん:2005/03/26(土) 09:25:34
fopenとかでエクセルでつくったファイルを読み込んで
txtに落すプログラムって作れるでしょうか?
普通によみこんでみたら文字化けしてました。
503デフォルトの名無しさん:2005/03/26(土) 09:31:07
できるけど、面倒。
504デフォルトの名無しさん:2005/03/26(土) 10:17:26
>>502
ExcelにCSVを出力させればいい。
まずは試して味噌。
CSVの読み込みについてはあちこちにサンプルがあると思う。
これ以上は該当スレで。
505デフォルトの名無しさん:2005/03/26(土) 10:24:11
>>504
Excelフォーマットを読み書きしたいんだけど…。
OpenOfficeでも読むか…。
506デフォルトの名無しさん:2005/03/26(土) 10:33:04
>>505
普通にActiveX使えばできるんだが。
507デフォルトの名無しさん:2005/03/26(土) 10:41:46
>>506
スレ違い。
508デフォルトの名無しさん:2005/03/26(土) 10:47:47
COM は C でも使えるよ
509デフォルトの名無しさん:2005/03/26(土) 10:54:04
>>508
スレ違い。
510デフォルトの名無しさん:2005/03/26(土) 10:57:56
↓スレ違い。
511デフォルトの名無しさん:2005/03/26(土) 11:06:51
漏れには502≠505と思えてならない。
512デフォルトの名無しさん:2005/03/26(土) 11:11:46
↑味噌っかす
513505 ◆/8LpUMqVAk :2005/03/26(土) 12:09:34
>>511
いかにも私は502ではない。
514デフォルトの名無しさん:2005/03/26(土) 15:41:00
Cならqsortだとして、比較関数を作るよな?
比較関数ってのは単純なやつはstrcmpとかだけど
ようはひらがな文字コード同士でそーとの際の並び順の大小を決めるだけだろ?
ナニが難しいんだ?ひらがなの並び順が分からないのか?
50音順ってわかる? あ<い<う<え<お...
515デフォルトの名無しさん:2005/03/26(土) 15:49:19
ナニだから、あんたが先走る、分かるえらいよあんた、
516デフォルトの名無しさん:2005/03/26(土) 16:04:45
>>514
拗音促音濁音の取り扱いも含めて、適当な仕様と実装を提示してくれ。
517デフォルトの名無しさん:2005/03/26(土) 18:42:08
csvで取り込むプログラムは作成できましたが
その一部を取り出すプログラムがどうしても作成できません
たとえば、abc,deff,b,cccc
v,abid.c,ddddddと言う感じでcsvがあったとすると
txtにはdeff,b
abid,cと言った感じで中だけを保存したいです
こういう加工をする関数とかあるんでしょうか?
518デフォルトの名無しさん:2005/03/26(土) 18:43:19
strtok?
519コンパイラー:2005/03/26(土) 19:39:37
Cはむずいなぁ
じゅぎょうでもさっぱり
520デフォルトの名無しさん:2005/03/26(土) 20:30:22
>>517
scanf の作者は、あんたよりは安定したコード書くぜ
521名無しさん:2005/03/26(土) 20:31:27
C確かにむずい...
522デフォルトの名無しさん:2005/03/26(土) 20:33:22
Cはゴミ。
523デフォルトの名無しさん:2005/03/26(土) 20:34:18
なんでLispから始めないんだ、大学の授業。
524デフォルトの名無しさん:2005/03/26(土) 20:37:04
「C言語」はなんと発音すればよいのですか?
らーじしーげんご?
525デフォルトの名無しさん:2005/03/26(土) 20:40:03
>>524
しーげんご。
526デフォルトの名無しさん:2005/03/26(土) 20:44:42
>>525
ありがとうございます。
527デフォルトの名無しさん:2005/03/26(土) 20:50:25
ツェーげんご
528デフォルトの名無しさん:2005/03/26(土) 20:56:44
>>527
「しー」じゃなくて「ツェー」なのですか?
529デフォルトの名無しさん:2005/03/26(土) 21:04:38
リッチーがどこの人なのかを考えればシー(or スィー)だろ。
530デフォルトの名無しさん:2005/03/26(土) 21:20:01
>>529
アメリカ人は「言語」をどのように発音するのですか?
531デフォルトの名無しさん:2005/03/26(土) 21:21:28
csvをよみこんでdatに書きこんでそれをよみこみ画面に表示してみると
たとえば1 aaa cccとあったらその次に1 .cccとなんかついてきます。
行数をふやしてみても、その最後の行のあとに最後の行に.がついておばけ
みたいなのがつきます。
feofでファイルポインタを終了しているし、csvにもそんなのないのですが
考えられる原因はなんでしょうか
532デフォルトの名無しさん:2005/03/26(土) 21:21:36
しーらんぐえっじ
533デフォルトの名無しさん:2005/03/26(土) 21:25:09
オロナミンC
534デフォルトの名無しさん:2005/03/26(土) 21:43:32
どうもdatをみてみると、
1 aaa cccc
.[EOF]になってます
なぜこうなるのかわかりません
535デフォルトの名無しさん:2005/03/26(土) 21:49:35
だれだおまえ
536デフォルトの名無しさん:2005/03/26(土) 21:51:40
>>534
そういう時は od -hc xxx.dat
537デフォルトの名無しさん:2005/03/26(土) 22:00:39
それはどこにかくんですか?
538デフォルトの名無しさん:2005/03/26(土) 22:01:59
コマンドライン
539デフォルトの名無しさん:2005/03/26(土) 22:03:59
コマンドラインとはなんですか?
540デフォルトの名無しさん:2005/03/26(土) 22:07:13
ぬるぽ
541デフォルトの名無しさん:2005/03/26(土) 22:34:26
192.167.3.4みたいなIPアドレス
ってどういう型でとりこんだらいいの?
542デフォルトの名無しさん:2005/03/26(土) 22:36:09
>>541
空気嫁
543デフォルトの名無しさん:2005/03/26(土) 22:50:08
VC6++でC言語を触り始めたんですが、1コ下の階層を指定しようとすると
\でも\\でも 「不要な箇所にエケープシーケンスが付いてます。」
と言われます。

助けてくださいエロい人達     ('Д`)人
544デフォルトの名無しさん:2005/03/26(土) 22:52:14
すごい初歩的な質問なんですが、VCでunixで使うネットワーク関係
のライブラリって使えるんですか?
545デフォルトの名無しさん:2005/03/26(土) 22:56:18
>>540
ガッ
546デフォルトの名無しさん:2005/03/26(土) 23:02:25
>>544
VCはでUNIX-LINUXのプログラムは作れなかった気がする。
547デフォルトの名無しさん:2005/03/26(土) 23:03:00
ごめん、↑気にしないで。
548デフォルトの名無しさん:2005/03/26(土) 23:05:43
549デフォルトの名無しさん:2005/03/26(土) 23:32:29
>>543
\ の代わりに / でもいいことになってる
550デフォルトの名無しさん:2005/03/26(土) 23:49:54
>>549
解決になってないような。
551デフォルトの名無しさん:2005/03/26(土) 23:59:36
>>531
現象の再現する最小のソースを作ってupしる。

>>541
char[16]でも、int[4]でも、お好みで。たぶん何かのライブラリを
使う事になると思うので、そのライブラリのスタイルに合わせるのが吉。

>>543
質問の意味が判らんが、fp=fopen(".\\test\\hoge.txt","r"); で
カレントディレクトリの1コ下の階層のファイルがオープンできる。
IDEの使い方を間違ってるような気もするので、それならVC++スレで訊け。
そのときは何をしたかを具体的に書く事。

>>544
使えるものと使えないものがある。使えるとしてもソースを入手して、
(必要な修正をした後)再コンパイルが必要なので、使えないと思ったほうが
気が楽かも
552デフォルトの名無しさん:2005/03/27(日) 00:04:02
上の方のレスみて気になったんですが、
MicrosoftのVisualC++でLinuxの実行ファイルは作成できないんですか?
553デフォルトの名無しさん:2005/03/27(日) 00:12:14
>>552
VCではできないと思うが・・・。
Linuxのバイナリ作るなら、素直にLinux上でコンパイルすれ。
554デフォルトの名無しさん:2005/03/27(日) 00:14:20
>>552
出来ない。
いや、ライブラリを書き換えてスタートアップルーチンをゴニョゴニョすれば
出来るかもしれない。
でも、それだけ苦労してもメリットが在るだろうか?
だからやっぱり出来ない。
555デフォルトの名無しさん:2005/03/27(日) 00:40:27
>>552
できるよ。
556デフォルトの名無しさん:2005/03/27(日) 01:07:26
>>553-555
サンクス。スキルの無い僕には絶対出来ないですね・・・
お邪魔しました。
557デフォルトの名無しさん:2005/03/27(日) 02:49:57
>514
Windowsは様々な比較に対応した関数 CompareString を提供しています。
558デフォルトの名無しさん:2005/03/27(日) 06:36:02
VC はもともとそういうことを想定してないようだが
gcc をちゃんとソースからインストールするときは
翻訳環境と実行環境の違う組み合わせもありだよな
559デフォルトの名無しさん:2005/03/27(日) 13:34:10
ファイルをバイナリ扱いするにはどうしたらいいんですか?
560デフォルトの名無しさん:2005/03/27(日) 13:36:14
fopen とかなら "バイナリ"モードで(win系)
561デフォルトの名無しさん:2005/03/27(日) 13:42:23
UNIX系では?
562デフォルトの名無しさん:2005/03/27(日) 13:42:55
UNIX系では区別が無い
563デフォルトの名無しさん:2005/03/27(日) 13:47:23
>>560
ありがとう
564デフォルトの名無しさん:2005/03/27(日) 14:05:25
MicroSoft系の OS では、テキストファイルの改行は '\r'(0x0d:復帰)と
'\n'(0x0a:改行)の2つの コードで表されます。
そのため、テキストモードで改行コード '\n' をファイルに書き込もうとすると、
'\r' '\n' の2文字に変換して書き込みます。
逆に読み込みでファイルに '\r' '\n' の改行コードがあれば '\n' の 1文字に変換します。
また、テキストファイル終端の 0x1a を EOF(ファイルエンド)として扱います。
しかし、バイナリファイルには「0x1a」、「0x0d」、「0x0a」はデータとして存在する可能性があり、
それをテキストモードのように変換されては困ってしまいます。
そのため、MicroSoft系のC言語ではテキストモードとバイナリモードを区別します。
なお、UNIX系のC言語ではこれらの区別は不要です。
565デフォルトの名無しさん:2005/03/27(日) 14:12:53
c言語を始めてそろそろ5ヶ月になります
きわめたのでOSを作りたいんですが、手始めになにをしたらいいでしょうか
566デフォルトの名無しさん:2005/03/27(日) 14:13:54
>>565
散弾銃を買ってきて、マイクロソフト本社に乗り込んで
「OS作らせロー」
って叫びならが散弾銃をぶっ放す。
567デフォルトの名無しさん:2005/03/27(日) 14:17:08
MSDOSの昔ならいざ知らず、もういい加減テキストモードをなくして欲しいよなあ。
標準入力を読むフィルタプログラムにパイプでデータを流すときにいつも苦労する。
568デフォルトの名無しさん:2005/03/27(日) 14:46:24
>>565
ターゲットとなるプロセッサを勉強しなさい。
569デフォルトの名無しさん:2005/03/27(日) 14:47:59
大雑把な質問で申し訳ないが
基本的に配列を扱うとき
a[i] って記述するより *( a + i ) ってやった方が速いの?
570デフォルトの名無しさん:2005/03/27(日) 14:50:30
>>569
内部でそう変換されてる
571デフォルトの名無しさん:2005/03/27(日) 14:52:01
>>564
WinCE は更に UTF16←→SJIS 変換までしてる。
572デフォルトの名無しさん:2005/03/27(日) 15:30:57
>>570
なるほど,コンパイラに優しいって感じかな
ありがとう
573デフォルトの名無しさん:2005/03/27(日) 15:45:24
>572
速さは変わらんぞ
574デフォルトの名無しさん:2005/03/27(日) 15:47:01
コンパイラにやさしくしてもねぇ…^^;
コンパイラに厳しくして効率良くなるならそれにこした事はない。
575デフォルトの名無しさん:2005/03/27(日) 15:56:32
>>574
C言語じゃなくいが、そう思ってテンプレートを多用すると悲惨な目に…
576デフォルトの名無しさん:2005/03/27(日) 16:08:30
型推論の機構を組み込むべきだね。
Templateなんて歪なものは無いほうがいい。
577デフォルトの名無しさん:2005/03/27(日) 17:10:14
>>2
のコンパイラのDL場所を詳しく教えてくれんか
30分間もの間行ったり来たり・・・
578デフォルトの名無しさん:2005/03/27(日) 17:11:44
Cygwinダウンロードして、packageのgccにチェック入れて一緒にインス子
579デフォルトの名無しさん:2005/03/27(日) 17:17:27
>>577
【Microsoft Visual C++ Toolkit 2003の場合】
(1) http://www.microsoft.com/downloads/details.aspx?FamilyId=272BE09D-40BB-49FD-9CB0-4BFA122FA91B&displaylang=en
のDownloadボタンからダウンロード・インストール
『次の二つも事実上必須』
(2) http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
から各ファイルをダウンロード・解凍・インストール
(3) http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
から各ファイルをダウンロード・解凍・インストール
580デフォルトの名無しさん:2005/03/27(日) 17:18:53
>>579
dクス
助かった
581デフォルトの名無しさん:2005/03/27(日) 17:25:38
>>569
そういうのが気になるならアセンブルコードを吐き出して見てみれば?
自分で確認した方が勉強になるよ。
582デフォルトの名無しさん:2005/03/27(日) 18:01:14
>>581
見てみた!
まったく同じだったよ,面白いねこれ
ありがとう
583デフォルトの名無しさん:2005/03/27(日) 19:38:22
>>582
どうせ同じ物を吐くんだからa[i]の書き方をする方が一般的(だと俺は思っている)
584デフォルトの名無しさん:2005/03/27(日) 20:28:22
Cの入門書ってさ、分割コンパイルとかDLLの作り方とかレジストリに
書き込む方法とかのってないよななぜなんだ
たぶんこのへんがみんな知りたいはずなんだけどな
俺なんていまだくそ長いソースしかかけないぜ
585デフォルトの名無しさん:2005/03/27(日) 20:29:59
はぁ?
586デフォルトの名無しさん:2005/03/27(日) 20:30:44
> DLLの作り方とかレジストリに
windowsプログラミングの入門書を読め
587デフォルトの名無しさん:2005/03/27(日) 20:31:58
それはCだけどCじゃねーだろ
あんなのおぼえれねえよ
588デフォルトの名無しさん:2005/03/27(日) 20:35:48
>>584
>たぶんこのへんがみんな知りたいはずなんだけどな

お前だけだよ。
589デフォルトの名無しさん:2005/03/27(日) 20:36:27
>>584
貴方の言ってる内容で入門書を作ると
中途半端で死ぬほど使えない本が出来て終了ですから。
590デフォルトの名無しさん:2005/03/27(日) 20:42:45
世の中使えない入門書が多すぎるな
591デフォルトの名無しさん:2005/03/27(日) 20:59:49
動的に変化するポート番号を使うサーバーアプリケーションにアクセスするには
どうしたらいいんですか?
592デフォルトの名無しさん:2005/03/27(日) 21:00:54
>>591
ネットワーク版で聞くべきかな。
スマソ、聞く板間違えた。
593デフォルトの名無しさん:2005/03/27(日) 22:32:23
入門書を使えない奴が多すぎるな
594デフォルトの名無しさん:2005/03/27(日) 22:44:52
Cの入門書を買うレベルの人が
レジストリ弄るってのも危険な気がする。
595デフォルトの名無しさん:2005/03/27(日) 23:17:57
俺なんか初心者の癖にデバドラ書いちゃうもんねー
596デフォルトの名無しさん:2005/03/27(日) 23:25:30
やろうとしている事の複雑さが判らないからこそ入門レベルなんであって。
597デフォルトの名無しさん:2005/03/27(日) 23:40:10
>>584
C言語はWindowsパソコンのためだけにあるわけじゃないから。
パソコンで使う人もいるし、ロボットの制御に使う人もいる。
だからCの入門書は純粋に言語だけ解説して、それ以外の部分は
各自が環境にあわせてヘルプ読むなり、別の本を読むなりする。
598デフォルトの名無しさん:2005/03/27(日) 23:48:06
このゲームがけっこうおもしろいかも。
歴代最高かも。
http://www112.sakura.ne.jp/~kaientai-project/creategame2.htm


599デフォルトの名無しさん:2005/03/27(日) 23:49:10
まぁでもDLLはともかく分割コンパイルは載せるべきかと
じゃないとstaticとかexternの意味がわからんだろ
600デフォルトの名無しさん:2005/03/28(月) 00:32:21
普通の入門書には載ってると思う
601デフォルトの名無しさん:2005/03/28(月) 01:02:12
のってるね
602デフォルトの名無しさん:2005/03/28(月) 01:18:36
>>591
まず、サーバとは何か?から勉強汁!
サーバは固定ポートで待ち受けするから意味がある。
603デフォルトの名無しさん:2005/03/28(月) 01:21:51
>>602
空気読めドアホ
604デフォルトの名無しさん:2005/03/28(月) 01:23:31
tesuto
605デフォルトの名無しさん:2005/03/28(月) 01:24:38
>>584
> 分割コンパイル

普通に書いてある。

> DLLの作り方

環境依存

> レジストリ

OSの問題でCの話じゃない。


結論:C云々の前に、コンピュータに関する一般知識を身に付ける事が先決。
606デフォルトの名無しさん:2005/03/28(月) 01:27:27
スキルがなくて答えられないのを
スレタイのせいにして誤魔化そうとする
可愛げのないクソガキども
607デフォルトの名無しさん:2005/03/28(月) 01:34:24
と、スレタイも読めないクソガキが申しております。
608デフォルトの名無しさん:2005/03/28(月) 01:38:38
>>607
なんだと!もう一度いってみやがれ
609デフォルトの名無しさん:2005/03/28(月) 01:50:06
と、スレタイも読めないクソガキが申しております。
610デフォルトの名無しさん:2005/03/28(月) 02:44:16
goto 606;
611デフォルトの名無しさん:2005/03/28(月) 03:03:59
error ラベル '606' は定義されていません。
612デフォルトの名無しさん:2005/03/28(月) 05:35:58
>>602
そうじゃない場合はどうするのかを聞いてるんですが。
たとえばwinnyとかはポート番号は人によって違うでしょ?
あと、ネットゲームとか。
613デフォルトの名無しさん:2005/03/28(月) 05:59:32
>>612
市ねばいいのに。
614デフォルトの名無しさん:2005/03/28(月) 06:56:07
以上、
「ネットワークプログラミングについて何も知りません。調べる気もありません。」
という宣言でした。
615デフォルトの名無しさん:2005/03/28(月) 07:06:26
そんなあなたに「オンラインゲームプログラミング」。
http://www.amazon.co.jp/exec/obidos/ASIN/4797328479

書いたのはチョンだが、一応WisdomSoftの中の人がバグとか
修正した日本語版らしい。
616デフォルトの名無しさん:2005/03/28(月) 07:10:22
>>612
ftp のような実装もあるが、どっちにしろ初回は
特定のポートを決めないと何も出来ん。
いいから適切なスレに移動しろ。
617デフォルトの名無しさん:2005/03/28(月) 07:20:16
中途半端に答えるな
618デフォルトの名無しさん:2005/03/28(月) 07:37:12
2ちゃん歴10年の俺としては
こういう厨が沸いてくると、ようやく「春が来たんだなあ」と感じるね。
619 ◆/8LpUMqVAk :2005/03/28(月) 08:37:32
とりあえず、順番につないでみて規定の応答が返ってくるか調べてみたら?
620デフォルトの名無しさん:2005/03/28(月) 08:42:28
ポートスキャン奨励ですか。春ですね。
621春ですね:2005/03/28(月) 08:50:01
春ですね
622デフォルトの名無しさん:2005/03/28(月) 12:59:53
グローバル変数の初期化の順番というのは未定義ですか?

/* グローバル */
HMODULE handle = LoadLibrary("foo.dll");
int g_b = func(handle);

このように書いた場合上から順に実行されないと困るのですが。
623デフォルトの名無しさん:2005/03/28(月) 13:05:19
>>622
不定。
グローバル変数の初期化関数でも作ってmainの先頭で呼び出せば?
624デフォルトの名無しさん:2005/03/28(月) 13:06:08
>>622
         , - == ニニ、 ‐- 、
          //‐ 、‐'´\‐- 、`ヽ、\
       /ヽ∠-イ   \  \ \ ヽ ヽ
     / / /  |! ヽ  \  \  \ヽ ヽ
    // / / l l |l  ヽ  \  \ 、\  l
   li l/l l |-、,,,,,,,,,,、    \ 、\  l
   i ! !l    _, ,         \ 、\  l      ________
      l l /●) (●>       :| l lノ|、  !     /
      l l l イ  '-         | .! l  |   !  /  
      l l 、l ,`-=-'\       l l|、 |  !<   そんな初期化はできません
      l l ヽトェ-ェェ-:)     -r'.! l    |   ! \  
      l  l  ヾ=-'     / /  .! l  |   !   \
       l  l  ヽ::::...   / ::::|.! l    |    !     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       l l| \ヽ、 _{´ ̄ ̄ 〃 .l /! l     |   l    
        l l|  ヽ!、ソf{      / ,rノ ! il\  |    l   
       //|  ,. l l'´ ! ヽー==''´/ / j !.  \|     
       //ノ/ l l  |ヽ    /  / /ll   __`ヽ、  
      .// jヽ\//   ! ヽノ/   /./ ll  /r'ニ‐rヽ   
    //./\ヽ//ニニヽ ∠ニニ//ニjj‐'´彡/ ̄`l l 
    /// l  j7/ゝニニVニニニ//ニ〃ニ/|    |    
   .// .| j ///    ̄n }.  ̄ ̄// 〃    .|       |   
  //  !ノ / l l    Uノ   / V/   {   |       |
625デフォルトの名無しさん:2005/03/28(月) 13:30:35
>>623-624
レスどうもです。
>>623の方法でいこうと思います。
626デフォルトの名無しさん:2005/03/28(月) 13:38:21
同じ翻訳単位なら保証されるんじゃないの?
627デフォルトの名無しさん:2005/03/28(月) 14:06:43
>>626
そもそも >>622 は不可能。
628デフォルトの名無しさん:2005/03/28(月) 20:38:39
>>605
> 分割コンパイル

c系の入門者は大抵ふれてない

> DLLの作り方

環境依存だがプログラムを作るなら必須だろ

> レジストリ

おもいきりCの話だろ


結論:何もわかってないな
629デフォルトの名無しさん:2005/03/28(月) 20:47:42
>>628
レジストリ操作がCの話題だとは知らなかったなw
630デフォルトの名無しさん:2005/03/28(月) 20:48:41
>>629
性格にはC++ とC#ね
俺はこの三つをまとめてCと呼んでいる。
631デフォルトの名無しさん:2005/03/28(月) 20:53:57
段々お笑いに走ってきたな・・・
632デフォルトの名無しさん:2005/03/28(月) 21:10:08
C#とC++の話題はC言語スレでどうぞ。
CgもOKです。
633デフォルトの名無しさん:2005/03/28(月) 21:48:09
昨日から始めたものです。カッコのつけかたで

for{
printf
}
とか
for
{
printf
}
とか、色々ありますけど
一般的に見やすいプログラムの書き方ってどう書くんですかね?
634デフォルトの名無しさん:2005/03/28(月) 21:49:24
>>633
好み
635デフォルトの名無しさん:2005/03/28(月) 21:58:01
ども、たいしたことじゃないんですね
また疑問が出てきたらお邪魔します
636デフォルトの名無しさん:2005/03/28(月) 21:58:02
>>634 御名答
637デフォルトの名無しさん:2005/03/28(月) 22:12:30
638デフォルトの名無しさん:2005/03/28(月) 22:25:09
dup2の使い方が分かりません。
前略
char buf[10];
char *str = "abcd";
pipe(fpipe1);

pid = fork();
if(pid == 0){
sleep(1);
close(fpipe1[0]);
write(fpipe1[1],str,strlen(str));
exit(1);
}
if(pid > 0){
sleep(2);
close(fpipe1[1]);
if((c = read(1,buf,4)) > 0)
buf[c]='\0';
printf(buf);
}

とすると子プロセスでパイプに書き込んだものが親プロセスで読み出せました。
この親プロセスのreadの部分を
fd = open("aaaa",O_WRONLY|O_CREAT,0600);
dup2(fd,fpipe1[0]);
としてファイルに書き込んだり
dup2(1,fpipe1[0]);
fflush(stdout);
として標準出力に出したりしたいのですが、何も出力が無く終了します。
使い方が間違っていますでしょうか。
教えてほしい。
639デフォルトの名無しさん:2005/03/28(月) 22:27:07
>>638
dup2なんて知らねえよ
640デフォルトの名無しさん:2005/03/28(月) 22:36:59
ファイル分割の単位は、どうやって決めてますか?
大きすぎれば読みづらいし、細分化しすぎてもインターフェイスばかりだし、
今一つちょうどよい目安がはっきりしません
641デフォルトの名無しさん:2005/03/28(月) 22:41:04
>>640
それのどこがC言語の話題なんですか?
642デフォルトの名無しさん:2005/03/28(月) 22:42:16
>>641
それぐらい脳内で翻訳単位へ置き換えしろ。
643デフォルトの名無しさん:2005/03/28(月) 22:45:45
>>640
でかくてうざくなったら切れ
切るのがかったるかったら放置しれ
644デフォルトの名無しさん:2005/03/28(月) 22:45:46
>>640
独学の俺もすごく悩みます。
645デフォルトの名無しさん:2005/03/28(月) 23:06:44
>>640
C++ のクラスっぽくするためにモジュール単位で分ける
でっかいモジュールはヘッダ用意してさらに分割

あんまりでっかいと ファイルスコープの static の意味が無くなるぞ
646デフォルトの名無しさん:2005/03/28(月) 23:12:26
モジュール化がうまくいけば、インタフェースもすっきりするもんだ。
647645:2005/03/28(月) 23:17:56
>>646
御意
static じゃない関数なんて両手で数えられるくらいしかないもんな
648デフォルトの名無しさん:2005/03/28(月) 23:19:12
>>
unix版へgo
649デフォルトの名無しさん:2005/03/28(月) 23:35:24
>>633
この間、Linux内のソースコードを掘り返して調べてみたら
(といっても10個程ランダムに取り出しただけだが)、関数は
void func(void)
{
;
}
の形式、制御文は
for (;;){
;
}
の形式っていう組合せが多数派だったな。
650デフォルトの名無しさん:2005/03/28(月) 23:39:37
K&Rスタイルね
651デフォルトの名無しさん:2005/03/28(月) 23:44:42
>>649
ヘッダ作るとき一行コピーしてセミコロン打つだけだからそうしてる
652デフォルトの名無しさん:2005/03/28(月) 23:47:27
>>640
あまり細かくするとグローバルだらけになるから気をつけろ
653デフォルトの名無しさん:2005/03/28(月) 23:55:29
>>652
それは設計が悪い。
つーか、スレ違いだってばよ。
654デフォルトの名無しさん:2005/03/29(火) 00:13:19
中途半端に答えるな
655デフォルトの名無しさん:2005/03/29(火) 01:14:10
char *pHead,*p;
pHead = (char*)malloc(sizeof(t_data)+16);
if( ((UINT)pHead%16) ) {
p = 16 - ((UINT)pHead%16) + pHead;
}
free(pHead);
みたいにして、pHeadを解放したのにp使ってもいいんでしょうか?
とあるサイトにこのようなプログラムを見たんですけど。
656デフォルトの名無しさん:2005/03/29(火) 01:22:40
よくない。

アライメントのサンプルみたいだが、
本当に続きがあるのか?
657デフォルトの名無しさん:2005/03/29(火) 02:16:29
658デフォルトの名無しさん:2005/03/29(火) 02:17:57
659デフォルトの名無しさん:2005/03/29(火) 02:24:55
>>657
vector = (ps2Samp0FVECTOR *)align;
...
free(head);

これって...のところで使っていると言う意味であって、free()の後で
使っていると言う意味は含まれていないと思われます。
660デフォルトの名無しさん:2005/03/29(火) 03:45:46
ホントだ。よく読もう自分...。
ありがとうございました。>>656 >> 659
661デフォルトの名無しさん:2005/03/29(火) 07:50:29
>>640
>>652
どのみちローカルには持ってこられない変数は、
変数名の衝突を避けられればじゅうぶんなので、
モジュール名を頭につけておく
Cの文法でモジュールスコープがあればいいが、ない以上は自衛するしかない
662デフォルトの名無しさん:2005/03/29(火) 12:26:02
void hoge( char a )
{}
int main( void )
{
int e = 1000 ;
hoge( e ) ;
}
こういう場合、キャストのあるなしは、好みの問題なんでしょうか?
srand( (unsigned)time(NULL) ) としてる人がいるもので気になりました。
663デフォルトの名無しさん:2005/03/29(火) 14:33:46
>>662
intからcharに限っては、C++では好み
Cでは警告が出る

timeの返値のキャストは必要
664デフォルトの名無しさん:2005/03/29(火) 15:09:16
ありがとうございます。
665デフォルトの名無しさん:2005/03/29(火) 18:36:01
gccでハイパースレッディングをフルに使う計算を行いたいのですが
どのように書けばいいのか、URLか本を教えてください

並列プログラミングっていうやつなのでしょうか??
666デフォルトの名無しさん:2005/03/29(火) 18:39:28
666 乙
667デフォルトの名無しさん:2005/03/29(火) 18:43:27
intからcharへの型キャストって、どうして失敗しても何も起こらないの?
668デフォルトの名無しさん:2005/03/29(火) 18:50:53
失敗て…。
669デフォルトの名無しさん:2005/03/29(火) 19:35:54
>>668
int->charって上位ビットが消えちゃうじゃん!
それって失敗じゃないの?
もし上位ビットに情報が入っていて、それが消えちゃったら、ボク…どうしよう…
失敗しているのに放っておくのって良くないと思います!
670デフォルトの名無しさん:2005/03/29(火) 19:43:25
>>669
キャストを勉強し直せ。
671デフォルトの名無しさん:2005/03/29(火) 19:49:08 ID:
>>670
キャスターになれるかな…どきどき
672デフォルトの名無しさん:2005/03/29(火) 19:49:41 ID:
>>670
お前死ねよ死んでしまえよ!!!
673デフォルトの名無しさん:2005/03/29(火) 19:51:01 ID:
はい、自殺します
674デフォルトの名無しさん:2005/03/29(火) 19:52:09 ID:
>>667
何も起こらないとも、起きるとも、どちらとも保証されていない
キャストも変換も元の値が新しい型で表現できない値の場合、結果は未定義だからだ

extern int i;
hoge()
{
char c;
c = i; //may cause undefined-behavior
c = i & 0x7f; // ok always
}
675デフォルトの名無しさん:2005/03/29(火) 19:57:06 ID:
>>674
これだから定休言語は困っちゃうよね!
676デフォルトの名無しさん:2005/03/29(火) 20:28:08
質問者を装うった厨が紛れてる様だな。
677デフォルトの名無しさん:2005/03/29(火) 20:37:03
unsigned の場合未定義じゃなかったことね?
678デフォルトの名無しさん:2005/03/29(火) 20:40:28
>>676
なんでもちゅうちゅう言ってんなよ、このすっとこどっこい。
まじめにこの疑問を解決しろ。
679デフォルトの名無しさん:2005/03/29(火) 20:43:44
こまっちゃう
680デフォルトの名無しさん:2005/03/30(水) 01:21:55
getcharの戻り値はなんでintなの?
681デフォルトの名無しさん:2005/03/30(水) 01:27:40
intってなんなの?
682デフォルトの名無しさん:2005/03/30(水) 02:25:47
俺はintをインテジャー(integer)って言ってるけど違うの?
683デフォルトの名無しさん:2005/03/30(水) 02:52:18
>>680
ISO/IEC 9899:1999 6.4.4.4 Character constants -2, -10で、
'a'の型がintであると定められているからだよ。
684デフォルトの名無しさん:2005/03/30(水) 03:30:30
それは違うだろ。
実際、C++では'a'はcharだけど、何の影響もないし。

getcharが返すのは、unsigned char型の値をintに拡張したもの又はEOF
で、単純にEOFをunsigned charの取りうる範囲以外にするためだよ。

一般的な2の補数形式だと
charがsignedな環境で'\xFF'に相当する値を返す時でも
返ってくるのは'\xFF'(==-1)ではなく、0xFFであり
EOF(負の整数)と区別される。
685デフォルトの名無しさん:2005/03/30(水) 09:37:09
>>684
>C++では

いちいちCスレでC++持ち出すな。
686デフォルトの名無しさん:2005/03/30(水) 09:57:06
バカかこいつ。
反証のための例示だろ。
687デフォルトの名無しさん:2005/03/30(水) 09:58:22
あ、685はgetcharがC++にもあることを知らないのか。
688デフォルトの名無しさん:2005/03/30(水) 18:08:29
アラインメントについて、
#pragma pack(1) ってやると、バイト境界が1バイトになると本に書いて
あったのですが、#pragma は処理系依存で移植性に欠けるともありました。
#pragma を使わずに、同じようなことをしたいのですが、なにか方法はありますか?
689デフォルトの名無しさん:2005/03/30(水) 18:37:34
>>688
ない。
そもそもCPUによっては8バイト境界を跨いでdouble値にアクセスすること自体ができない。
環境依存が嫌ならテキストにするかバイト単位で管理するしかない。
690デフォルトの名無しさん:2005/03/30(水) 19:10:15
やはり出来ませぬか。
ご解答どうもありがとうございました。
691デフォルトの名無しさん:2005/03/30(水) 22:11:40
明示的にパディングを入れて境界調整すれば多少はマシになる
692デフォルトの名無しさん:2005/03/30(水) 22:58:56
>>686
C++ に限ったことじゃねえぞ、"一般的" とか何かボロボロだぜ、こいつ
693デフォルトの名無しさん:2005/03/30(水) 23:10:04
ボロボロはおまえ
694デフォルトの名無しさん:2005/03/30(水) 23:12:11
Cって時代遅れ言語のなのにさ学校とかでは未だにCの授業多いよな
C#とかを覚えるほうがいいだろ。なぜCにこだわるんだろうね
先生は、俺がC#の本読んでたら先にCをやりなさいっていってくるんだぜ
オブジェクト指向時代にCやる価値あるのか?
695デフォルトの名無しさん:2005/03/30(水) 23:15:18
C出来ないの?
696デフォルトの名無しさん:2005/03/30(水) 23:17:14
一つだけしか出来ないの?
697デフォルトの名無しさん:2005/03/30(水) 23:18:24
俺はいきなりC++やC#から初めてもいいと思うけどな。
ただし後からで言いからCもマスターするべき。
698デフォルトの名無しさん:2005/03/30(水) 23:35:41
何やっても構わんが、授業受ける気があるなら先生の言うことくらいやろうや。
あるいは授業時間外にきっちり先生と話してもいいだろうな。その価値とやらを。
理由分からずに勉強するよりいいだろうし、論破できりゃ次からC♯だよ。
699デフォルトの名無しさん:2005/03/30(水) 23:46:07
アプリケーションがUNICODE定義をしない状態で、ある特定のコントロール(エディットボックス等)だけにUNICODEを
入力・表示させたいと考えていますがなかなかうまくいきません。
(もちろんUNICODE定義すればうまくいきますが、諸事情によりこれを定義することができません)
もしなにかいい方法がございましたらご教授ください。

環境WindowsXP(SP2)
  VC++6.0
条件:@ダイアログベースでそのダイアログ上にいくつかのコントロールを
    設定。
   Aプリプロセッサには_UNICODEは設定しないようにする。
    →アプリケーションのUNICODE定義は行わない)
700デフォルトの名無しさん:2005/03/30(水) 23:52:24
>>699
氏ねばいいのに。
701デフォルトの名無しさん:2005/03/30(水) 23:55:16
>>699
UNICODE定義の大半はマクロの切り替えだから
明示的にUNICODE用APIを呼び出せばいいんでは?
というかスレ違いの悪寒
702デフォルトの名無しさん:2005/03/30(水) 23:58:01
中途半端に答えるな
703デフォルトの名無しさん:2005/03/31(木) 00:05:45
char str[]="0";
char str[]="";
↑どう違うんですか?
下でやると後から文字列を代入したときにエラーが出ます。
704デフォルトの名無しさん:2005/03/31(木) 00:07:32
>>703
文字列が違う
705デフォルトの名無しさん:2005/03/31(木) 00:12:37
そりゃそうですね。

なぜ上だとエラーが出ず下だとエラーが出るんですか?
706デフォルトの名無しさん:2005/03/31(木) 00:13:04
>>703
上は2バイト確保
下はメモリ確保されてないじゃん
どっちにしても2バイト以上確保しなけりゃ
文字列入れちゃだめだよ
707デフォルトの名無しさん:2005/03/31(木) 00:13:29
スクリプト言語でアルゴリズムを考えてCに書き写そうとしてたのですが、
スクリプト言語ではmod演算で、
-18%16 → 14
となってたんですが、VC7だと、-2になります。どっちも正しいのはわかるんですが
これが環境に依存する問題なのか気になってきました。。。C言語では
どの環境でも同じ結果になるのでしょうか
708デフォルトの名無しさん:2005/03/31(木) 00:14:07
>>703
ごめん訂正
上は1バイト
709デフォルトの名無しさん:2005/03/31(木) 00:14:30
環境に依存する問題
710デフォルトの名無しさん:2005/03/31(木) 00:14:40
>>705
型を考えろ
char str[]="0"; としたとき str は char[2]型
char str[]=""; としたとき str は char[1]型だ

確保していないメモリにアクセスするなよ
711デフォルトの名無しさん:2005/03/31(木) 00:15:29
>>706 は文字列を理解していない。信じないように。
712デフォルトの名無しさん:2005/03/31(木) 00:19:10
上は0と終端のnull文字を表す。よって二文字だ。
str[0]とstr[1]がある状態。
下は終端のnull文字だけが入っている。よって一文字だ。
str[0]=0
713デフォルトの名無しさん:2005/03/31(木) 00:20:41
>null文字

nul文字だね
714デフォルトの名無しさん:2005/03/31(木) 00:21:51
>>707
以前は処理系依存だったが C99 で明確になった
C99 に対応してなければどっちになるか分からない

今は 余りは常に割る数より小さくなければならない と規格で決まってる
715デフォルトの名無しさん:2005/03/31(木) 00:22:17
>>706
>>708
適当に回答するのはやめれ恥かくから
文字列は基本中の基本
厨房はせめて本なりネットなりで調べて回答せよ
716デフォルトの名無しさん:2005/03/31(木) 00:22:19
> char str[]="0";
これは
char str[2] = {'0','\0'};
と同じ

> char str[]="";
これは
char str[1] = {'\0'};
と同じ
717デフォルトの名無しさん:2005/03/31(木) 00:24:13
>>714
まじっ酢か・・・C99の規格も調べてみたいと思います
どうもです!
718デフォルトの名無しさん:2005/03/31(木) 00:28:12
ありがとうございます。

後から
char str[]="0";
の方に"abc"を入れてもエラーにならないのに
char str[]="";
に入れるとエラーになるのはどうしてですか?
上は"0"と"\0"の2バイトで
下は"\0"の1バイトだから
>>706さんの言うように2バイト無いといけないのですか?
719デフォルトの名無しさん:2005/03/31(木) 00:29:09
>>718
そもそも範囲を超える文字列を入れるな( ゚Д゚)ヴォケ!!
720デフォルトの名無しさん:2005/03/31(木) 00:31:09
>>718
その前に>>1のfaqを読んできてくれ
721デフォルトの名無しさん:2005/03/31(木) 00:31:11
じゃあユーザーからの入力で文字列を得る場合にはどうしたらいいんですか?
適当に範囲を取っていってもそれより多く入力されると範囲を超えてしまうんですが・・・
722デフォルトの名無しさん:2005/03/31(木) 00:31:45
>>719
それを知ってれば質問なんかせんわ( ゚Д゚)ヴォケ!!
723デフォルトの名無しさん:2005/03/31(木) 00:32:11
せっかくFAQがあるのにねぇ・・・
724デフォルトの名無しさん:2005/03/31(木) 00:33:07
>適当に範囲を取っていっても

動的確保
725デフォルトの名無しさん:2005/03/31(木) 00:33:34
>>721
多く入力できないようにすればよろし
726デフォルトの名無しさん:2005/03/31(木) 00:41:35
>>718
1文字なら塗る文字いれて2バイト
2文字なら塗る文字いれて3バイト
つまり入力文字数プラス塗る文字確保せよということ
727デフォルトの名無しさん:2005/03/31(木) 00:46:07
動的確保をしたらいいんですかね?
調べなおしてきます。

ありがとうございました。
728デフォルトの名無しさん:2005/03/31(木) 00:48:58
>>727
それだけじゃないんだが。
faq読めって。
729デフォルトの名無しさん:2005/03/31(木) 00:51:38
なんか漫才やってるみたい
ボケと突っ込みが絶妙
730デフォルトの名無しさん:2005/03/31(木) 00:59:46
ボケが質問者だけじゃないという事がミソだな
731デフォルトの名無しさん:2005/03/31(木) 09:29:31
>>717
ちなみにC99非対応コンパイラでもdiv/ldiv関数ならC99の除算と同じ結果になる。(処理系依存にならない)
div/ldivはC89に存在するから大抵のコンパイラで使えるはず。
732デフォルトの名無しさん:2005/03/31(木) 12:32:32
>>718
>char str[]="0";
>の方に"abc"を入れてもエラーにならないのに
>char str[]="";
>に入れるとエラーになるのはどうしてですか?

上が何かの偶然でエラーになっていないだけ。
恐らく、別のところで確保された別の領域が偶然すぐ後ろに確保されていただけ。

エラーになるのは、確保されていない領域に書き込んだから。
733デフォルトの名無しさん:2005/03/31(木) 12:55:59
>>718
どのように"abc"をstrに「入れ」てるのかワカラン
エラーになるもならないも偶然だ

未定義とはそういうことだ
734デフォルトの名無しさん:皇紀2665/04/01(金) 00:28:45
組み込みマクロに __LINE__ ってあるだろ
これ整数型なんだよ
マクロでなんとか文字列リテラル化したいんだが
なんか妙案無いか?

#define MY_LINE(l) #l
#define LINE MY_LINE(__LINE__)

これだと LINE を展開したときに "__LINE__" になってしまう
どうしたらいいんだ?
735734:皇紀2665/04/01(金) 00:29:18
age忘れ...
736デフォルトの名無しさん:皇紀2665/04/01(金) 00:50:51
>>734
無理だろ
737デフォルトの名無しさん:皇紀2665/04/01(金) 00:51:51
#define xMY_LINE(l) #l
#define MY_LINE(l) xMY_LINE(l)
#define LINE MY_LINE(__LINE__)
main()
{
puts(LINE);
}
~~~
こうすると
$ cat hoge.c | cpp
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "<stdin>"
main()
{
puts("6");
}
こうなるけど、
正解なのかどうか、しらん。
738デフォルトの名無しさん:皇紀2665/04/01(金) 12:48:19
数値計算をやっているものです。
FORTRANで今まで書いていたのですが
世の流れに乗ってC言語を勉強し始めました。
んで、びっくりしたのがC言語の関数の遅さ。
たとえば、
#include <stdio.h>
#include <math.h>

int main(void){
double x,y; int n,loop,max;

max=100000000; x=2.00;

for( loop=1;loop<=max;loop++ )
{y=sqrt(x);}

printf("%f\n",y);
}
FORTRANなら計測できないほど瞬時に計算するんですけど
これは、コンパイラのせい?それとも、こんなもんなんでしょうかね。
739デフォルトの名無しさん:皇紀2665/04/01(金) 13:02:40
同じ内容のソースをFORTRANでかいてそれぞれ実行時間を計測しましたが、
FORTRAN 2.0s
C 50.0s
でした。25倍の差があります。この差はどこに起因するのでしょうか?
ちなみに、FORTRANでのソースは
real*8x,y
integern,loop,max

max=100000000
x=2.00

do loop=1,max
y=dsqrt(x)
end do

write(*,*)y

end
740デフォルトの名無しさん:皇紀2665/04/01(金) 13:06:27
俺には分からんけど、計測できないほど瞬時って「2.0s」のこと?
741デフォルトの名無しさん:皇紀2665/04/01(金) 13:09:08
>>738
registerつけて、最適化オプションでコンパイルしてみると、一瞬で終る。
742デフォルトの名無しさん:皇紀2665/04/01(金) 13:13:20
>>738
最適化してる?
743デフォルトの名無しさん:皇紀2665/04/01(金) 13:32:59
>>740
そうです。瞬時にってのは言い過ぎました。
>>741
ゆくゆくは配列などで計算させます。register宣言は使えません・・・
>>742
してません。こんな程度のプログラムにも
最適化オプションつけないといけないんですか...orz
当方、Cygwinでgccでコンパイルしてるだけですので・・・
744デフォルトの名無しさん:皇紀2665/04/01(金) 13:35:14
勝手に最適化されちゃうよりは、
書いたままを実行してくれる方がデバッグしやすいけどなぁ。
745デフォルトの名無しさん:皇紀2665/04/01(金) 13:43:08
>>743
-O3 つけれ♪ -O3 つけれ♪
746デフォルトの名無しさん:皇紀2665/04/01(金) 13:47:45
cygwinが使ってるライブラリが遅いだけじゃないの?
747デフォルトの名無しさん:皇紀2665/04/01(金) 13:48:35
デバッグビルド 約3秒
リリースビルド 最適化はVC7.1デフォ 一瞬

スゲーこんなにも違うなんて!
748デフォルトの名無しさん:皇紀2665/04/01(金) 13:57:52
>>743
どこの Fortran だか知らないが、そっちは
デフォルトでは最適化されていないとでも?
749デフォルトの名無しさん:皇紀2665/04/01(金) 14:06:42
fortranは最適化の塊だからなぁ。

>>747
VC++はデバッグのときにできるだけ生のまま見えるように、デバッグビルドでは最適化は一切行なわない。
当たり前だ。インライン展開されて消えてしまった関数をデバッグすることは不可能なのだから。

>>743
自分の不勉強を棚に上げてよくぞまぁ、言語批判などできるものだね。
いっそ世の流れに乗って自殺でもしてくれ給え。
750デフォルトの名無しさん:皇紀2665/04/01(金) 14:37:55

えらそうに
何様?
751デフォルトの名無しさん:皇紀2665/04/01(金) 14:44:47
普段は大人しい
752デフォルトの名無しさん:皇紀2665/04/01(金) 14:58:56
そうか
それは、失礼しやした
753デフォルトの名無しさん:皇紀2665/04/01(金) 16:46:55
>> 745
O3を、つけたところ、コンパイル時にけいさんしてしまい、ました。
そりゃ、はやい、だろ。

80481b9: 75 fd jne 80481b8 <main+0x14>
80481bb: 50 push %eax
80481bc: 68 9e a0 f6 3f push $0x3ff6a09e
80481c1: 68 cd 3b 7f 66 push $0x667f3bcd
80481c6: 68 2d 85 05 08 push $0x805852d
80481cb: e8 d0 16 00 00 call 80498a0 <printf>
...

unsigned long long int value = 0x3ff6a09e667f3bcd;
printf("%f\n", *((double *)&value));
754デフォルトの名無しさん:皇紀2665/04/01(金) 17:02:02
エンディアン嘘付かないの「エンディアン」とはどういう意味なのでしょうか
755754:皇紀2665/04/01(金) 17:05:48
バイトオーダーだそう。自己解決しました。
756デフォルトの名無しさん:皇紀2665/04/01(金) 17:07:07
ま、数値計算ではFORTRAN>>>>越えられない壁>>>>C
配列の決め方に自由度がないのも頭にくる。
でもループ文は色々あって嬉しいかな。
757デフォルトの名無しさん:皇紀2665/04/01(金) 17:19:49
Linuxのプロセス間通信で、一対特定多数(マルチキャスト)は可能ですか?
758デフォルトの名無しさん:皇紀2665/04/01(金) 17:21:45
>>754
エイリアン!!ばかいや〜んの合成語です
759デフォルトの名無しさん:皇紀2665/04/01(金) 17:27:03
>>1を読めない奴が増えたな
760デフォルトの名無しさん:皇紀2665/04/01(金) 19:01:26
>>759
随分前からですよ。
761デフォルトの名無しさん:int 2ch =05/04/01(金) 22:19:53
JavaDoc や perldoc のような埋め込みドキュメントの定番みたいなのってありますか?
762デフォルトの名無しさん:int 2ch =05/04/01(金) 22:21:26
>>761
>>1 を読め。

というと芸が無いので。
Doxygenでぐぐれ。
763デフォルトの名無しさん:int 2ch =05/04/01(金) 22:26:13
文字列の中に特定の言葉があるかどうか調べたいんですけど
Cに正規表現みたいな関数ってありますか?
764デフォルトの名無しさん:int 2ch =05/04/01(金) 22:29:34
>>763
strstr
765デフォルトの名無しさん:int 2ch =05/04/01(金) 22:30:47
正規表現は無理だけどな
766デフォルトの名無しさん:int 2ch =05/04/01(金) 22:34:19
>>764-765
ありがとうございます。簡単な事になら十分使えそうですね。
簡単なことにはこれを使って、正規表現は自分で関数を作ってみます。
767デフォルトの名無しさん:int 2ch =05/04/01(金) 23:06:12
最近の処理系ってintとlongのサイズ一緒ですよね?たいてい4バイト。
これってlongの存在価値なしってこと?何か違うのか?
768デフォルトの名無しさん:int 2ch =05/04/01(金) 23:06:44
769デフォルトの名無しさん:int 2ch =05/04/01(金) 23:07:31
腕が悪いのを道具のせいにする奴ほど
たかがあんなもので音を上げるのさ
770デフォルトの名無しさん:int 2ch =05/04/01(金) 23:21:56
>>767
確かにそうだな。
でも逆に一昔前はintとshortのサイズが同じなのが当たり前だった。
771デフォルトの名無しさん:int 2ch =05/04/01(金) 23:33:00
>>767
いや、そもそもintの存在価値がない。
772デフォルトの名無しさん:int 2ch =05/04/01(金) 23:34:54
4/1だからといって、そんなまぬけな事言わないでくれ
773デフォルトの名無しさん:int 2ch =05/04/01(金) 23:38:18
>>767
>>これってlongの存在価値なしってこと?

かならずしもそうとは言い切れない。
例えば、変数 x のバイト長が4バイトであることを利用する
ようなプログラムを書くときに、int 型のバイト長が
2バイトの環境では同じコードをコンパイルしても動かないかもしれない。
でも、long型を使えば、その環境でも動く可能性が高くなる。

ただ、char型以外の型のバイト長は不定なので、longを使えば必ず互換性が保障されるわけ
じゃない。intの方が互換性が高くなる場合もあるし。コードを流用する環境によりけり。
774デフォルトの名無しさん:int 2ch =05/04/01(金) 23:39:26
>>773
五十歩 4 歩だな
775デフォルトの名無しさん:int 2ch =05/04/01(金) 23:43:51
>>773
そんなときは<stdint.h>のint32_tの類い。
776デフォルトの名無しさん:int 2ch =05/04/02(土) 00:24:44
ふ〜ん。じゃあintとlongのサイズが同じ処理系で実行する分には
冗長と言えるけど、サイズが違う環境での実行を想定して
プログラミングしとくみたいな感じ?桁数が欲しいところはlongとか。

それで思いだしたのだが、floatよりdoubleが速いってのは都市伝説?
777デフォルトの名無しさん:int 2ch =05/04/02(土) 00:28:09
>>776
参考までに。
cppllでも話題になりました。
http://www.tietew.jp/cppll/archive/11792
778773:int 2ch =05/04/02(土) 00:59:48
>>776
例えばそういう使い方もあるってことね。
773にも書いたけど、コードを流用する環境はさまざまだから、
それにあわせて最適な型を使うのが理想。
int、longの書き分けを必ずつかえといってるわけじゃないよ。
779デフォルトの名無しさん:int 2ch =05/04/02(土) 01:51:22
(r<<16 | g<<8 | b)の場合、r<<16の方が上位って思ってるけど、
合ってますか??
780デフォルトの名無しさん:int 2ch =05/04/02(土) 02:04:40
優先順位どうだったっけ
781デフォルトの名無しさん:int 2ch =05/04/02(土) 02:24:03
>>779
基本的には。
782デフォルトの名無しさん:int 2ch =05/04/02(土) 02:25:17
気になったら括弧。
783デフォルトの名無しさん:int 2ch =05/04/02(土) 02:27:24
まぁ、あっているわけだがね。
784デフォルトの名無しさん:int 2ch =05/04/02(土) 11:00:13
3次元配列のメモリを確保する関数を作ったのですが、
何か間違っている部分、危険な部分などは無いでしょうか。
まだfreeは書いていませんが、ちゃんと入れます。

#include <stdio.h>

void ***MallocThree(int size, int z, int y, int x)
{
int zz, yy;
void ***data;

if((data = malloc(sizeof(void **) * z)) == NULL)
return NULL;

for(zz=0; zz<z; zz++)
if((data[zz] = malloc(sizeof(void *) * y)) == NULL)
return NULL;

for(zz=0; zz<z; zz++)
for(yy=0; yy<y; yy++)
if((data[zz][yy] = malloc(size * x)) == NULL)
return NULL;

return data;
}

int main(void)
{
char ***hoge;
hoge = (char ***)MallocThree(sizeof(char), 2, 4, 8);
return 0;
}
785デフォルトの名無しさん:int 2ch =05/04/02(土) 11:54:11
良いんでねーの。後は、確保したのとは逆の手順でfreeしてったら完璧。
786デフォルトの名無しさん:int 2ch =05/04/02(土) 12:05:25
それでもいいがこうした方が解放が簡単。
#include <stdio.h>
#include <stdlib.h>
void ***MallocThree(size_t size, size_t z, size_t y, size_t x)
{
    size_t i;
    void ***data_z = malloc(sizeof(void **) * z);
    void **data_y = malloc(sizeof(void *) * z * y);
    void *data_x = malloc(size * z * y * x);
    if (data_z && data_y && data_x)
    {
        for (i = 0; i < z; i++)
        {
            size_t j;
            data_z[i] = data_y + i;
            for (j = 0; j < y; j++)
                data_z[i][j] = (void *)((char *)data_x + size * (i * x + j));
        }
    }
    return data_z;
}
int main(void)
{
    char ***hoge = (char ***)MallocThree(sizeof(char), 2, 4, 8);
    free(**hoge);
    free(*hoge);
    free(hoge);
    return 0;
}
787784:int 2ch =05/04/02(土) 13:21:00
ありがとうございます。

>>785
分かりました。

>>786
かっこいいです。それでやりたいと思います。
788786:int 2ch =05/04/02(土) 13:42:42
しまった。こうしたほうがいいな。
if (!data_z || !data_y || !data_x)
{
  free(data_z);
  free(data_y);
  free(data_x);
  return NULL;
}

あと俺だったら#define FreeThree(p) (free(**p), free(*p), free(p))も作っておく。
789784:int 2ch =05/04/02(土) 13:59:13
>>788
いくつかは成功している場合もあるから、その分を開放するわけですね。
790!786:int 2ch =05/04/02(土) 14:12:15
malloc()に失敗してもNULLが入ってるから
free()しても大丈夫だけどね。
791デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:16:20
free(NULL)って未定義じゃないの?
792デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:19:01
>>791
何も起こらないことになっている。C++のdelete NULL;も同じ。
793デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:36:36
>>791
freeの中で
if(p == NULL)
return;
となってる。

俺は自分でもチェックしてるけど。
794784:int 2ch =5年,2005/04/02(土) 16:47:05
以下のプログラムの、malloc対するfreeの仕方は正しいでしょうか。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/285.txt
(MallocFree.h)http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/286.txt

自分はまだ初心者なので、まだ>>786さんのバージョンではなく、
>>784の最初のバージョンのです。

>>790-793
なるほど。勉強になります。
まだ自分のでは、回りくどくfreeしていますが、慣れてきたら簡単にしたいです。
795デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:55:48 BE:75288645-
>>794
FreeFour1, 2, 3, 4 と関数を分けなくても、こうすると良いよ(動作未検証)。

void FreeFour(void ****data, int T, int Z, int Y)
{
  int t, z, y;

  for (t = 0; t < T; t++) {
    for (z = 0; z < Z; z++) {
      for (y = 0; y < Y; y++) {
        free(data[t][z][y]);
      }
      free(data[t][z]);
    }
    free(data[t]);
  }
}
796784:int 2ch =5年,2005/04/02(土) 17:05:05
>>795
ありがとうございます。
メモリを確保していなくても対処してくれる部分ですね。分かりました。
797デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 17:13:09 BE:203277896-
>メモリを確保していなくても対処してくれる部分
意味がよく分からないけど、
FreeFourOne(), ..., FreeFourFour() を結合したのが >>795 ね。

char ****p = MallocFour(sizeof(char), 1, 2, 3);
FreeFour(p, 1, 2, 3);
で済むよ、って話。
798795, 797:2005/04/02(土) 17:17:14 BE:67760036-
ごめ、MallocThree(), FreeThree() だわ。ごめん。
799デフォルトの名無しさん:2005/04/02(土) 17:44:21
関数のポインタってあんまり使わないものなんですか?
分かりにくくなるから使わないほうがいいって教わったんですが
800デフォルトの名無しさん:2005/04/02(土) 17:53:28
>>799
Cでオブジェクト指向プログラミングをしようと思ったら、わりと良く使う。
でも、そうでなければほとんど使わない。
また、ある種の関数ではアルゴリズムを分割したいときに使うこともある。
801デフォルトの名無しさん:2005/04/02(土) 17:54:01
>>799
おれ組み込み屋だけど、超のつく有力アイテム
見た目がアレだけど、それで拒否反応起こすような奴ぁお呼びじゃない
もっと物凄くアレなものがごろごろいるんで
802795, 797:2005/04/02(土) 17:55:18 BE:101638793-
>>796
これで許して。C99専用かもしんないけど。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/288.c
803デフォルトの名無しさん:2005/04/02(土) 18:04:38
個人的には関数のポインタ使うなら
C++覚えてオーバーライド使った方がいい気がする。
804デフォルトの名無しさん:2005/04/02(土) 18:25:39
>>799
WindowsのWndProcならよく使う。というより無いと話にならない。
805デフォルトの名無しさん:2005/04/02(土) 18:28:11
コールバックに必須だし。
もちろん、標準ライブラリのqsortやbsearchにも。
806デフォルトの名無しさん:2005/04/02(土) 18:29:19
だってここCスレでしょ
C++は論外
807デフォルトの名無しさん:2005/04/02(土) 19:23:36
C言語で「関数の先頭にローカル変数を書くルール」が意味するのは
関数の引数の分とローカル変数の分をまとめて(順番は追求しない)
スタックに入れるのを明示的(分かりやすく)に表す為?
C++ではどこで書いてもOKですが、処理的には同じ?
気になったので質問しました。
808デフォルトの名無しさん:2005/04/02(土) 19:25:11
fgetsとは逆に、上の方へ向かってファイルを読み込むいい方法ってないですかね?
fseekで順に戻っていこうかとも思ったんですが、無駄に重そうなので……。
809デフォルトの名無しさん:2005/04/02(土) 19:33:15
>>807
コンパイラを複雑にしたくなかったんでしょ。
C++は動作がぜんぜん違う。
810デフォルトの名無しさん:2005/04/02(土) 19:51:55
>>808
ない。
tail -r のソースでも見てみたらどうか。
811デフォルトの名無しさん:2005/04/02(土) 19:54:45
寝言は寝てから言え
812デフォルトの名無しさん:2005/04/02(土) 20:03:28
>>807
>スタックに入れるのを明示的(分かりやすく)に表す為?
コンパイラが楽、って理由じゃないかと。

C++ は宣言したときにコンストラクタが呼ばれるっつー事情もあって
(途中で関数抜ける場合にまで余計な処理をしないように)
使う直前で宣言すればいい事に。
C は宣言だけなら何もしないんだけど、でも使う直前で宣言できる方が
いいってんで C99 では出来るようになった。
813デフォルトの名無しさん:2005/04/02(土) 20:04:49
>>807
最新のC99ではC++同様どこでも宣言が書けるようになった。

>>808
あまり巨大なファイルには無理だが一旦メモリに最初から最後へと読み込んでからメモリ上で並べ替えるようにしたらどう?
814デフォルトの名無しさん:2005/04/02(土) 21:24:03
すみません、すごく基本的なことなのですが、
typedef char MOJI
とかするとMOJIという型を宣言できますが、

typedef void sigfunc(int)
という宣言はどういう意味なのでしょうか?
とあるソースを見ていたらこんなのがあったので…
815デフォルトの名無しさん:2005/04/02(土) 21:25:18
>>814
int型の引数を1つ取り戻り値の無い関数型sigfuncの宣言。
816814:2005/04/02(土) 21:41:27
>>815
ありがとうございます!!
恐縮ですが確認させてください。

ということは、
void (*sigfunc)(int);
と同じことでしょうか?
817デフォルトの名無しさん:2005/04/02(土) 21:47:44
>>816
それは「int型の引数を1つ取り戻り値の無い関数へのポインタ型」
ただ、関数型を引数・戻り値に指定すると配列と同じように関数へのポインタ型へ変換されるから
引数・戻り値では両者が同じように扱われるのは事実。
818816:2005/04/02(土) 22:00:55
>>817
ありがとうございます。
まだピンとこないのですが、なんとなくわかりました。

実は、UNIX系ではsignal()という関数がありまよね。
これの宣言の意味が全然わからずこまっているところなのです。

void (*signal(int sig, void(*func)(int)))(int)

となっていますが

void (*signal)(int)
なら意味がわからないのでもないのですが、signalの後にある
引数達の意味が全然わからないのです…
819デフォルトの名無しさん:2005/04/02(土) 22:09:48
DOSの実行ファイルをつくったのですが、explorerから実行すると
一瞬だけ表示されすぐに終了してしまい困っています。
どうすれば、この問題を解決できるのでしょうか??

820デフォルトの名無しさん:2005/04/02(土) 22:12:01
.exeをクリックするだけで、動作するようにさせたいんですけども、、。
821デフォルトの名無しさん:2005/04/02(土) 22:13:14
>>820
キー入力待ちで止めるとか。
後はスレ違いなので該当スレへ。
822デフォルトの名無しさん:2005/04/02(土) 22:16:12
>>818
そこまで判っているなら、後は順番に解釈すればいい。
signal()の第一パラメータはint sig、第二パラメータはvoid(*func)(int)ということ。
そして戻り値はvoid (*)(int)、つまり第二パラメータと同じ型。
823デフォルトの名無しさん:2005/04/02(土) 22:17:16
>>818
typedef void (*signal_handler_t)(int);
signal_handler_t signal(int sig, signal_handler_t func);

と同じ意味。
824デフォルトの名無しさん:2005/04/02(土) 22:20:34
>>818
これなら解るかい?

/* 引数にintを取り、voidの戻り値を返す関数へのポインタ型に、Fという別名を付ける */
typedef void(*F)(int);

void f(int){}

/* 引数にint,Fを取り、F型の戻り値を返す関数signalの宣言 */
F signal(int, F);
825デフォルトの名無しさん:2005/04/02(土) 22:24:40
>>818
>signalの後にある引数達の意味が全然わからないのです…
一番右側にある(int)は戻り値の型の一部なんだよお
826デフォルトの名無しさん:2005/04/02(土) 22:26:05
http://kmaebashi.com/programmer/pointer.html

>>818
signalは標準ライブラリに含まれているからUNIXだけのものじゃない。
827816:2005/04/02(土) 22:29:18
>>822 >>823 >>824
ありがとうございます!わかりました!

ただちょっと不思議なのは、

void (*signal)(int)

void (*signal(int))
と書くこともできるんでしょうか?

なんとなく
void (*signal(int sig, void(*func)(int)))(int)

void (*signal)(int sig, void(*func)(int))(int)
と書いてもよさそうな気がしてしまったので混乱してました。
828デフォルトの名無しさん:2005/04/02(土) 22:34:09
void (*)()() って何だよ。
829デフォルトの名無しさん:2005/04/02(土) 22:38:13
>>827
関数ポインタが *() ではなく (*)() という形をしている理由から考えればいい
理由とは、後置の () と単項の * の優先度を変更する括弧であることだ
830816:2005/04/02(土) 22:43:58
あ!
みなさんありがとうございます。何となく気づきました。

void (*signal(int sig, void(*func)(int)))(int)

を関数型の変数の宣言と勘違いしていたのかも知れません。
これはsignalという関数のプロトタイプですよね。

皆様すごく親切に教えて頂きほんとうにかんしゃです。
831デフォルトの名無しさん:2005/04/02(土) 23:08:45
>>810
なるほど、見てみます。

>>813
んー……それも考えたんですけどね……やっぱり巨大なファイル厳しいとなると敬遠……

ども、参考になりますた
832デフォルトの名無しさん:2005/04/02(土) 23:22:30
>>831
折衷案としてファイルの中身を丸ごと読み込まず、
数百KBなどずつ読み込んで引っくり返すようにするってのはどう?
833デフォルトの名無しさん:2005/04/02(土) 23:26:14
hcreate()ってプログラムの中でひとつのハッシュ表しか使えないんですか?
だとしてこれは役に立つことがあるんでしょうか?
834807:2005/04/02(土) 23:30:58
レスThanks
どこでも宣言が有効になるのは何か複雑な気持ち...。
バージョンアップとか進むの速過ぎ...。
機能拡張とか不要なモノ(主観)まで増やさないで欲しい。
本当に必要なのか疑問に持つこともたまに。
なんか愚痴っぽくなってしまって、ゴメン
835デフォルトの名無しさん:2005/04/02(土) 23:31:28
>>833
規格の範囲外。よってスレ違い。
836デフォルトの名無しさん:2005/04/02(土) 23:34:45
>>832
実際の所、すぐ前の行に目的が有るだろうから多分それが良さそうですね……。
「ありえないだろ」の部分までやっぱり作んないと駄目かなぁ……
837デフォルトの名無しさん:2005/04/02(土) 23:49:54
>>834
宣言の場所が自由になったのは便利なことだと思うけど。
ま、可変長配列とかはたしかに要らないと思う。
838デフォルトの名無しさん:2005/04/02(土) 23:51:17
>>808
読み込むメモリアドレスを逆にしてくとか。
839838:2005/04/02(土) 23:53:02
やっぱ忘れてくれ。
840デフォルトの名無しさん:2005/04/02(土) 23:58:04
最初に各行のオフセットだけ全部記憶してfseekで手繰ってけば?
841デフォルトの名無しさん:2005/04/03(日) 00:08:24
可変長配列は要るだろ
これでもうalloca()を使わないで済む
842784:2005/04/03(日) 02:38:28
>>802
なるほど。それだと1回のmalloc、freeで済みますね。
ありがとうございます。
843デフォルトの名無しさん:2005/04/03(日) 04:43:17
いやー、>>802はなんかおかしい気が・・
844デフォルトの名無しさん:2005/04/03(日) 06:22:07
>>843
ホントだ。それも忘れてくれ...。一番深いの要素しか考えてなかった。
845844:2005/04/03(日) 06:26:10
>>843
と、思ったら確認ミスだった。
どこがやばそう?
846デフォルトの名無しさん:2005/04/03(日) 08:12:31
C99が使えないのであればこう直せばいい。
char *p3, p4;
printf("%p\n", &p3[k + j * x + i * x * y]);

MallocTwoにはこういうときWin32APIだけどHeapCreateが便利。
途中で失敗してもメモリリークの心配が要らなくなる。
847844:2005/04/03(日) 08:53:14
ちょびちょび確保するよりかは、
やっぱり>>786みたいに一度にしていく方が良いね。
>>802のは、ポインタで繋いでないから用途が限られてくるし。
848デフォルトの名無しさん:2005/04/03(日) 10:02:42
malloc(size*x*y*z)じゃだめなん?
849デフォルトの名無しさん:2005/04/03(日) 10:09:29
使い方による。
850デフォルトの名無しさん:2005/04/03(日) 10:36:00
>>848
802もMallocTree/Fourはそうなっている。
851デフォルトの名無しさん:2005/04/03(日) 12:11:28
char *cp;
int hoge;

sprintf (cp, "%d", hoge);

「値が割り当てられていないローカルな変数 'cp' に対して参照が行われました。」

と警告がでるのですが、このままじゃ何がまずいんでしょうか?
char *cp = "\0";
とかするべきなんでしょうか。
852デフォルトの名無しさん:2005/04/03(日) 12:14:47
>sprintf (cp, "%d", hoge);
cp が指す場所に書き込むんだからさ、まず cp が指す場所を指定しないと。
こんな感じかなあ。

char buf[100] = "\0";
char *cp = buf; /* cp に buf を指させる */
int hoge;

sprintf(cp, "%d", hoge);
853851:2005/04/03(日) 12:44:47
>>852
あ、なるほどポインタの指す先がまだ確定してないからなんですね。

もう少し突っ込んで聞きたいんですが、
char buf[100] = "\0";
char *cp = buf;
は、 cp はメモリのどこかに実態を持った buf のアドレスを指していて、
sprintf(cp, "%d", hoge); でその buf のアドレスに hoge を書き込んでるんですよね。
>>851の sprintf (cp, "%d", hoge); は警告を無視すれば期待通り動いてくれているんですが、
このときメモリの中のイメージはどうなっているんでしょう?
854デフォルトの名無しさん:2005/04/03(日) 12:52:56
>>853
適当なアドレスに書き込んでる。
動く場合もあれば、クラッシュする場合もある。
たのむからそんなアプリを外に出すなよ。
855851:2005/04/03(日) 13:03:10
>>854
はい、やはりそうなんですね。分かりました、すぐ直します!
相談してよかった。
856デフォルトの名無しさん:2005/04/04(月) 06:06:21
857デフォルトの名無しさん:2005/04/04(月) 14:00:52
>>856
そのページ、微妙に間違いが多いからリンクするの止めようよ。
それに、>851はポインタと配列を混同する以前の状態じゃないかと。
858デフォルトの名無しさん:2005/04/04(月) 18:30:12
要素数9の配列ポインタへのポインタを宣言したつもりなのですが、
どうしてこれはエラーになるのでしょうか?
#include<stdio.h>
void hoge( char *(*)[9] ) ;
main(){
char*(*test)[9];
hoge(test);
}

void hoge( char *(*a)[9] ){
char *p = (char*)0x11111111 ;
*a[0] = p ;
return ;
}
859デフォルトの名無しさん:2005/04/04(月) 18:47:37
1. test は
  char へのポインタを指すポインタの、要素数 9 の配列
 だが、意図した通り?
2. test を初期化していないようだが。
860デフォルトの名無しさん:2005/04/04(月) 18:57:23
VCでもgccでもエラーにならなかったけど?
861デフォルトの名無しさん:2005/04/04(月) 19:03:56
要素数9の配列ポインタへのポインタは
char (**)[9]
862デフォルトの名無しさん:2005/04/04(月) 19:18:00
レス下さった皆さま、有難う御座いました。
じっくり読んでて、なんとか違いが見えてきました。
あと、>>860さんがおっしゃるとおり、エラーは出ませんでした。なにかでミスしてたみたいです。
863デフォルトの名無しさん:2005/04/04(月) 21:01:31
口で説明しようとすると、だるい。
感じとしては↓のような...

#include <stdio.h>
void hoge(char *(*p)[9]);
main()
{
char *test2[9];

hoge(&test2);
printf("%p\n", test2[0]);
printf("%s\n", test2[1]);
}

void hoge(char *(*a)[9])
{
(*a)[0] = (char *)0x11111111;
(*a)[1] = "あーてすてす";
}
864デフォルトの名無しさん:2005/04/05(火) 13:02:04
初歩的なことで申し訳ありませんが、
VC++でC言語のコンパイルをしました。
内容はコマンドプロンプトからファイル名を入力して出力するプログラムです。
わからないのは、コマンドプロンプトでどのようにして実行すればよいのでしょうか?
ソースは以下のとおりです。
#include <stdio.h>
#include <stdlib.h>


intmain(int argc, char *argv[])
{
FILE*fp;
charch;

if(argc!=2){
printf("入力ミスです。\n");
exit(1);
}

if((fp = fopen(argv[1],"w"))==NULL){
printf("ファイルを開くことができません。\n");
exit(1);
}
printf("fdaf");

while((ch = fgetc(fp))!=EOF) putchar(ch);
fclose(fp);

return 0;
}

865デフォルトの名無しさん:2005/04/05(火) 13:13:42
>>864
>わからないのは、コマンドプロンプトでどのようにして実行すればよいのでしょうか?
C関係ないやん…
つか、自分で初歩的だと判ってるなら VC++ 初心者スレ逝け。
★初心者にVisual C++を教えるスレ★ Part17
http://pc8.2ch.net/test/read.cgi/tech/1107926989/l50
866デフォルトの名無しさん:2005/04/05(火) 13:28:12
>>864
char ch → int ch
fopen(argv[1], "w") →fopen(argv[1], "r")
とりあえず気が付いた間違いの指摘だけ。VC知らんし。
867デフォルトの名無しさん:2005/04/05(火) 13:33:40
>>866
ポケモンスレ行ってらっしゃい
868864:2005/04/05(火) 14:58:13
>>865-867
質問の仕方がまずかったです。
VC上でC言語のプログラムを実行したのですが、
argcとargvへの入力の過程が無いまま実行が始まってしまいます。
どのようにすれば入力できるのでしょうか?
869デフォルトの名無しさん:2005/04/05(火) 15:02:08
>>868
コマンドプロンプトから「プログラム名 コマンドライン引数」という具合に打つ。
870デフォルトの名無しさん:2005/04/05(火) 15:03:11
>>868
出来上がったEXEファイルのあるフォルダを開いてそのEXEファイルへ何か他のファイルをドラッグアンドドロップするのでも出来る。
871864:2005/04/05(火) 15:43:44
>>869
そのように入力しても読み込んでくれませんでした。
VCの作業フォルダの、どのファイルを実行させて、
入力させたいファイルはどのフォルダに入れておけばよいのでしょうか?

>>870
思いつかなかったです・・・。
ちなみに複数個でこのようにする方法はありますか?
(argvの指定をする)
872デフォルトの名無しさん:2005/04/05(火) 15:48:45
>>871
半角スペースを空けて指定する。
a.exe argv1 argv2 argv3 ... argvN
半角スペースが含まれる引数は、"" で囲んで指定する。

a.exe hello world "hello world"
argv1 = hello
argv2 = world
argv3 = hello world
873デフォルトの名無しさん:2005/04/05(火) 15:50:26
いい加減うざいからVCスレに行くなりPC板に行くなりしてくれ。
874864:2005/04/05(火) 15:58:57
>>872
そこまでは分かるのですが、ファイルを入力させたい場合が分からないです。
exeファイルがあるフォルダにおいてもだめでした。

>>873
コンパイラはVCを使っていますが、
書いているコードはCの方なので・・・。
875デフォルトの名無しさん:2005/04/05(火) 16:03:11
プログラムの起動引数の指定方法なんてCの範疇じゃないよね。
876U ◆CZtFsGiu0c :2005/04/05(火) 16:04:14
>>874
「だめでした」では何がだめなのかわからんよ。何をしたらどうなったのか書かないと。
877デフォルトの名無しさん:2005/04/05(火) 16:07:52
>>864
他人の指摘に対して、反論する前に我が身を省みる習慣つけなさいよ。
あんたは何の質問をしているの。
Cのコードの質問している?
そうではないでしょ。
仮にそうだとしても、C言語ピュアな質問用のこのスレよりも初心者向けのスレの方が適切。
878864:2005/04/05(火) 16:10:18
>>876
プログラムは正常に終了したのですが、
ファイルを開くことができませんでした。
879デフォルトの名無しさん:2005/04/05(火) 16:12:23
>>871
どっちも絶対パスで指定すればいい。
コマンドプロンプトの画面にドラッグアンドドロップすれば入力する手間は省ける。
880デフォルトの名無しさん:2005/04/05(火) 16:13:36
>>878
開けなかったことはどのように確認した?
881デフォルトの名無しさん:2005/04/05(火) 16:18:57
「コマンドプロンプト」の意味が分かってないヨカン
882872:2005/04/05(火) 16:23:40
>そこまでは分かるのですが、
分かってるのに訊いてたのかよ('A`)
883デフォルトの名無しさん:2005/04/05(火) 16:23:56
まあまあ
884U ◆CZtFsGiu0c :2005/04/05(火) 16:38:12
>>878
「何をしたら」はなぜ書かない?
それから正常終了したって書いてるけど、ファイル開けないのなら正常終了じゃない
ように思うけど、具体的にどうなったの?

とにかく、答える人の負担を減らすことを考えて、できるだけ具体的に書くこと。
885デフォルトの名無しさん:2005/04/05(火) 16:39:05
いい加減 >>864 の相手するなっつの。
886デフォルトの名無しさん:2005/04/05(火) 16:41:41
質問のしかたから勉強するべきだな。
887デフォルトの名無しさん:2005/04/05(火) 16:45:37
親切なのが多いな今日は
888888げったー:2005/04/05(火) 16:48:06
やたーヽ(´ー`)ノ
889デフォルトの名無しさん:2005/04/05(火) 16:49:49
しまった!!今気付いたよ
889ゲットー!!うれしくねー
890889 :2005/04/05(火) 16:49:53
( ´_ゝ`)
891デフォルトの名無しさん:2005/04/05(火) 19:49:10
「ハンガリアン記法」について、
よくナンセンスといわれていますが、グローバル変数に g_ とか
つけるのは良いと感じました。だから、自分で作るプログラムにも、
それだけは使用していますが、やはりこれもナンセンスなんでしょうか?
892デフォルトの名無しさん:2005/04/05(火) 19:52:04
あ、というか自分が一番聞きたいのはポインタ変数の頭に
p とつけているのが無駄かどうかでした。どうかご指南、ご指摘ください。
893デフォルトの名無しさん:2005/04/05(火) 19:57:19
Cならまだ分かる>ハンガリアン
C++ならウザイし醜いだけだと思う。
大体pつけて意味あるの?スマートポインタにもつけるの?

スコープを表す語をつけるのはいい心がけだと思う
894デフォルトの名無しさん:2005/04/05(火) 19:58:34
いまどきCでばりばり書いてる香具師かこわるい
895デフォルトの名無しさん:2005/04/05(火) 20:13:39
ありがとうございます。
p をつけるのはちょっと、どれがポインタかわからなくなった経験からでした。
無意味に感じてきたし、この機会にやめておこうと思います。
896もうすぐ就職試験 ◆pTadMR86pE :2005/04/05(火) 23:00:29
近々C言語を使っての就職試験があります。
簡単な質問ばかりなのかもしれませんが、
助けてください。

現在独習C学習中・・・。
897デフォルトの名無しさん:2005/04/05(火) 23:01:29
わかったフリする奴つかえねー
898デフォルトの名無しさん:2005/04/05(火) 23:02:21
わからんことに問題意識ねえやつもダメ
899デフォルトの名無しさん:2005/04/05(火) 23:12:04
ポインタ変数をpでプリフィクスするのは合理性があると思うけどな。
900デフォルトの名無しさん:2005/04/05(火) 23:29:09
>>896
で、何が聞きたい?
901デフォルトの名無しさん:2005/04/06(水) 04:29:40
int *start, *end ;
int a[] = { 1, 2, 3, 4, 5 }
start = &a[0], end = &a[4] ;
while( start < end ) //←●
{ ...略 }

ここの条件式ってまずいですか?
素人なんで良くわからないですが、リトルエンディアンとかどーとか
が関わってきたりして(?) 配列の &a[0] のアドレスが、&a[4] の
アドレスより小さくなっているという、保障がないんじゃないかと、
心配になってきました。
902デフォルトの名無しさん:2005/04/06(水) 05:57:41
start < end が真になる事は保証される。
エンディアンは関係ない。
903デフォルトの名無しさん:2005/04/06(水) 06:21:04
1リトル、2リトル、3リトルエンディアン〜♪
904デフォルトの名無しさん:2005/04/06(水) 06:46:04
while(true)

これじゃいかんのか?
905デフォルトの名無しさん:2005/04/06(水) 06:46:55
バカはすっ込んでてね
906デフォルトの名無しさん:2005/04/06(水) 08:56:29
>>901
なんでわざわざそんなまどろっこしい事をする?
添え字でループすればいいだろ。
907デフォルトの名無しさん:2005/04/06(水) 09:00:25
C++ならイタレータとして使うためと言えるが。
908デフォルトの名無しさん:2005/04/06(水) 10:12:35
901 は例です。
エンディアンは関係ありませんでしたか。
それを聞けてやっと安心できました、どうもありがとうございました!
909デフォルトの名無しさん:2005/04/06(水) 10:20:07
ぐぁ、早とちりしちゃったorz
真になる事が保証されるのは、わかってるつもりなのですが、
配列の先頭と後方のアドレスの値の大小関係が、必ず 『 先頭 < 後方 』
になっているか、他プラットフォームとかでもそれが保障されているのか
が、不安なのです。連レスすみません。
910デフォルトの名無しさん:2005/04/06(水) 10:34:12
そんな心配をするなんて、
もしかして右から左に日本語を書く人ですか?
911デフォルトの名無しさん:2005/04/06(水) 10:46:39
そのぐらい馬鹿な質問でしたか・・・
よかった。
912デフォルトの名無しさん:2005/04/06(水) 11:57:43
>>909
「配列とは何か?」を考えれば自ずと答えが見えてくるだろ。
913デフォルトの名無しさん:2005/04/06(水) 13:20:35
( ´,_ゝ`)プッ  C厨はこれだから困る
914デフォルトの名無しさん:2005/04/06(水) 13:23:38
>>913は氏んだらいいとおもうよ
915もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 14:59:23
gets関数のことなのですが、
説明ではエンキーが押されるまで文字列を読み続けるとありますが、
プログラムを実行するとエンターキーを押していないのに次の命令を実行してしまいます。
どうしてでしょうか?
916もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 15:07:01
for(;count<100; count++){
  if(count<100){
    gets(code[count]);
    gets(data[count]);
  }
}
917もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 15:07:46
上のようなコードです。
918デフォルトの名無しさん:2005/04/06(水) 15:07:59
>>915
OS、コンパイラー依存だ、がんばってね
919もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 15:14:21
>>918
OSはXPで、コンパイラはVC++6.0です。
別のプログラムで実行すると普通に動作するのですが、
現在作成しているプログラムではすり抜けてしまいます。
何かおかしな命令を書いてる可能性があるのでしょうか?
920デフォルトの名無しさん:2005/04/06(水) 15:48:47
入力バッファに改行コードが残っているとか
921もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 16:07:05
>>920
有難うございます、そのとおりでした。
main関数でscanfを使い、呼び出す関数を番号で選択して入力して、
問題の関数を呼び出していたからでした。
922デフォルトの名無しさん:2005/04/06(水) 16:08:14
fgets使え
923デフォルトの名無しさん:2005/04/06(水) 16:08:31
>>916
countは何時どこで初期化しているのか?
for文の処理をしていないという可能性は考えたのか?

デバッグには想像力と推理力が必要だぞ
924デフォルトの名無しさん:2005/04/06(水) 16:20:35
>>921
scanf()もgets()も使うな。私の勤める会社なら、確実に減点されるぞ。
925デフォルトの名無しさん:2005/04/06(水) 16:21:38
なに使こうたらええの?うち、わからへん…
926デフォルトの名無しさん:2005/04/06(水) 16:28:29
大方、ページテーブル、セグメントとかワカランチンだからな。
927もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 16:29:19
>>924
そうなんですか?
では何を利用したら良いのでしょうか?
928デフォルトの名無しさん:2005/04/06(水) 16:30:11
929もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 16:31:07
>>928
なるほど。
930デフォルトの名無しさん:2005/04/06(水) 16:39:42
どうして使っちゃいけないんですか?
931もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 16:40:47
fgetsを試してみたのですが、どのようにしてキーボードから入力したらよいのですか?
932デフォルトの名無しさん:2005/04/06(水) 16:50:11
>>930
大きさを指定できない。(scanfでは出来なくもないが書式文字列に直接埋め込むことになるので面倒)
char buf[16];
gets(buf);
もしこれで16文字以上入力されたら配列に入りきらない。
Cとしては配列の宣言時の要素数を超えてしまうとその結果は未定義になる。
場合によっては悪用されるとセキュリティーホールにもなりかねない。
いわゆるバッファオーバーランになる。

>>931
char buf[16];
fgets(buf, sizeof buf, stdin);
933もうすぐ就職試験 ◆pTadMR86pE :2005/04/06(水) 17:00:27
>>932
有難うございます。
934930:2005/04/06(水) 17:11:08
>>932
分かり易い説明ありがとう。
935デフォルトの名無しさん:2005/04/06(水) 17:45:37
小規模板でMMO作ってるみたいだよ。
期待だね。俺に参加するよっ!!
936デフォルトの名無しさん:2005/04/06(水) 17:53:21
>>924
痛い奴が採点側にいるなw
937デフォルトの名無しさん:2005/04/06(水) 21:02:13
ローマ法王は異教徒です。異教徒は悪魔と同じです。異教徒を拝むなんてありえません。
938デフォルトの名無しさん:2005/04/06(水) 21:11:20
>>937
そもそも法王を拝んでどうするよ。
939もうすぐ就職試験 ◆pTadMR86pE :2005/04/07(木) 05:50:19
質問です。
コマンドプロンプトからargcと*argv[]を入力して、
ファイルを読み込もうとしているのですが、
コマンドプロンプトのメッセージが「数値を入力してください」となり、そこから先に進みません。
C言語とは関係ないのかもしれない上に、ものすごく初歩的なのかもしれませんが教えてください。
940デフォルトの名無しさん:2005/04/07(木) 06:20:17
pl386.nas911.yamaguchi.nttpc.ne.jp(210.139.48.130)
941デフォルトの名無しさん:2005/04/07(木) 07:33:08
>>939
質問の意味が判らない。何をやったのかを具体的に書いてくれないと、
「たぶんプログラムのバグでしょう」としか答えようが無い。
どんなコードを書いたの?
コマンドプロンプトからdir すると読み込みたいファイルは表示される?

>C言語とは関係ないのかもしれない上に、ものすごく初歩的なのかもしれません
ということなら
★初心者にVisual C++を教えるスレ★ Part17
http://pc8.2ch.net/test/read.cgi/tech/1107926989/
で訊いたほうがいいかもよ。
942デフォルトの名無しさん:2005/04/07(木) 08:56:17
>>939
環境によるが、コマンドプロンプトから

 prog.exe param

などの様に打つと、
argcに「2」、argv[]に「prog.exe」「param」が格納される。
と言う環境がほとんどだ。

それ以前に、君は「コマンドプロンプトとはどのようなものか?」
から勉強すべきだろう。
943もうすぐ就職試験 ◆pTadMR86pE :2005/04/07(木) 09:18:34
>>941-942
以下のようなプログラムです。

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


int main(int argc, char *argv[])
{
 FILE *fp;
 char ch;
 long l;
 
 if(argc!=2) exit (1);

実際にdirで見ても表示されますし、プログラム的にも間違いは無いは無いと思うのですが、
何か原因があるのでしょうか?
944デフォルトの名無しさん:2005/04/07(木) 09:30:11
プログラムが間違ってる。そのプログラムにはファイルを読み込む部分が無い。
945もうすぐ就職試験 ◆pTadMR86pE :2005/04/07(木) 09:46:40
>>944
実際にはこの下にもプログラムが続いています。
しかし、printfでチェックしてみたのですが、上記のifにすらプログラムが進んでいませんでした。
946デフォルトの名無しさん:2005/04/07(木) 09:48:53
>>945
プログラムのつづきキボンぬ
947デフォルトの名無しさん:2005/04/07(木) 10:04:11
なんだかよく分からないけど、
「数値を入力してください」
って表示する別のコマンド実行してるんじゃないの?
自分で作ったコマンドの名前は何なんじゃ?
948デフォルトの名無しさん:2005/04/07(木) 10:06:56
情報を小出しする馬鹿につきあってると疲れるぜ?
949デフォルトの名無しさん:2005/04/07(木) 10:09:24
これ以上環境やらIDEやらの質問が続くなら続くんなら他スレ行けよ。
950デフォルトの名無しさん:2005/04/07(木) 10:34:22
プログラム名とコマンドが同じとか?
951デフォルトの名無しさん:2005/04/07(木) 11:05:39
int main(int argc, char *argv[])
{ <-これ
に対応する
} <-これ
まで出てこないと、わかりません。
952デフォルトの名無しさん:2005/04/07(木) 11:06:42
落ちたな
953デフォルトの名無しさん:2005/04/07(木) 11:54:22
コマンドライン引数の事を聞く奴はこんなんばっかだな…。
954デフォルトの名無しさん:2005/04/07(木) 12:00:53
結局解決したが、アホらしい原因だったので、説明するのが面倒で逃げたんだろうな。
955デフォルトの名無しさん:2005/04/07(木) 12:02:15
>>953
ギク
956もうすぐ就職試験 ◆pTadMR86pE :2005/04/07(木) 12:16:59
結局原因が分かりませんでした。
付録のサンプルコードをコンパイルしてみても駄目だったので、
コマンドラインの指定の仕方が不味かったみたいです。
ただ、他のソースは無事に実行できるので、
できなかったことはねじ伏せます。
いろいろ教えていただいたのにすみませんでした。

いよいよ構造体だ・・・。
957デフォルトの名無しさん:2005/04/07(木) 12:39:00
>>956
他人の意見・質問をスルーするなら書き込むな。
958950:2005/04/07(木) 12:43:31
次スレ立てますたヽ(´ー`)ノ
C言語なら俺に訊け! Part 106
http://pc8.2ch.net/test/read.cgi/tech/1112845322/
959デフォルトの名無しさん:2005/04/07(木) 14:04:33
文字列を数値として大小比較できる関数はありませんか?
文字列"0000000000000000001234567890"と
文字列"1234567890"は等しいと判断させたいのです
桁数が大きいので数値に変換するのは無理っぽいです
960デフォルトの名無しさん:2005/04/07(木) 14:06:34
先頭から続く0を無視すれば良いだけだろ
961デフォルトの名無しさん:2005/04/07(木) 14:19:27
"0000000000000000001234567890"なら32bitのintに
変換できる筈だがな。

32bitに収まらない数も扱うなら、long long int型でも使えば?
962デフォルトの名無しさん:2005/04/07(木) 14:24:27
まぁ、文字のままで比較するなら、

1.先頭の0を除く
2.文字数を比べる
3.文字数が同じなら、strcmpで比べる

で出来る。
963デフォルトの名無しさん:2005/04/07(木) 14:24:42
"9999999999999999999999999999"
964デフォルトの名無しさん:2005/04/07(木) 14:26:33
>2.文字数を比べる
この必要性が分からない。
965デフォルトの名無しさん:2005/04/07(木) 14:44:36
>>964
大小比較だからじゃない?
ん?strcmp?しらね。
966デフォルトの名無しさん:2005/04/07(木) 15:14:41
new BigDecimal("0000000000000000001234567890").equals(new BigDecimal("1234567890"))
967デフォルトの名無しさん:2005/04/07(木) 15:17:15
こっちかな?
new BigInteger("0000000000000000001234567890").compareTo(new BigInteger("1234567890"))
968デフォルトの名無しさん:2005/04/07(木) 15:26:52
スレ違いになってきたぞ。
969デフォルトの名無しさん:2005/04/07(木) 15:31:30
>>964
strcmp は辞書順だから、桁数が違うと
"1000"< "200" になる。
970デフォルトの名無しさん:2005/04/07(木) 15:48:47
面倒くさいので動作テストはしてない。
数値以外の文字の混入は考慮無し。

int CmpNumStr (char *a, char *b)
{
int n;

while (*a == '0')
a++;
while (*b == '0')
b++;

n = strlen(a) - strlen (b);
if (n < 0)
return -1;
if (n > 0)
return 1;

return strcmp(a,b);
}
971デフォルトの名無しさん:2005/04/07(木) 16:01:34
よく考えたら、strcmpの帰り値は、
-1や1だという規定は無いから、
n<0 n>0 のままで返していいか・・・

int CmpNumStr (char *a, char *b)
{
int n;

while (*a == '0')
a++;
while (*b == '0')
b++;

n = strlen(a) - strlen (b);

return n ? n : strcmp(a,b);
}
972デフォルトの名無しさん:2005/04/08(金) 17:29:40
さぁ、いよいよ構造体だ・・・。
973デフォルトの名無しさん:2005/04/08(金) 19:19:04
>>959
符号はないのか?
974デフォルトの名無しさん:2005/04/08(金) 22:23:19
スペースは? カンマは?
975デフォルトの名無しさん:2005/04/08(金) 23:19:09
読み飛ばせよ
976デフォルトの名無しさん:2005/04/09(土) 07:44:28
小数点以下は?
記数法は?
977デフォルトの名無しさん:2005/04/09(土) 08:00:36
(*(*hello)[5][5])[5]
一体、hello には何が入るのですか?
978デフォルトの名無しさん:2005/04/09(土) 09:56:56
>>977
hello is pointer to array of array of pointer to array
helloは配列へのポインタの配列の配列へのポインタ
http://kmaebashi.com/programmer/pointer.html
979デフォルトの名無しさん:2005/04/09(土) 11:07:31
>977
そんな変数を宣言していること事態が間違いの始まり。
データ構造を見直した方が良いと思われ・・・
980デフォルトの名無しさん:2005/04/09(土) 11:17:40
>>979
アフォか
見たこと/使ったことのない宣言が出てきただけで設計ミスであってたまるか
経験値低いぺーぺーがわかったつもりになってるとそんなことを言い出して無駄に流れを乱す
981デフォルトの名無しさん:2005/04/09(土) 12:08:20
現在○%、みたいに処理の進行状況をprintfで表示したいんですけど
%の部分はそのままで○の部分だけを上書きして表示していくにはどうすればいいんですか?
982デフォルトの名無しさん:2005/04/09(土) 12:09:41
標準ライブラリではたぶんできない。
983デフォルトの名無しさん:2005/04/09(土) 12:12:17
通常の端末なら、
for (ic = 0; ic <= 100; ++ic) {
printf("%3d%%\r", ic);
}
で巧いこと表示できるかもしれない。
984デフォルトの名無しさん:2005/04/09(土) 12:12:31
できる。
985デフォルトの名無しさん:2005/04/09(土) 12:12:57
>>981
linux?windows?
986デフォルトの名無しさん:2005/04/09(土) 12:14:14
ncurses使うと楽だよ。
987デフォルトの名無しさん:2005/04/09(土) 12:19:23
>>983
スゲー
今試してみたらできました!!
ありがとうございます

>>985
ウインドウズです


その他のレスくれた人もありがとう

988デフォルトの名無しさん:2005/04/09(土) 12:29:32
>>977
世界地図を二次元座標表現し各地域での挨拶を表現する文字列の先頭4文字を座標上に配置したデータ全体へのポインタがhello。
これを惑星ごとに用意して切り替えることができる。
989983:2005/04/09(土) 12:33:54
あーちくしょう。
fprintf(stderr, ...)にしないとリダイレクトで喰われるし、フラッシュされないからダメって書きにきたら…
ウィンドウズだったか(ヶ
990デフォルトの名無しさん:2005/04/09(土) 14:56:04
みんな>>988みたいに理解できてるのかと思うと鬱だわ
頭のメモリが足りねえ・・・
991デフォルトの名無しさん
ワロスww