C言語なら俺に聞け(入門篇) Part 29
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/06/01(日) 23:04:59教えて欲しいのではなく宿題を丸投げしたいならこちらへ。
C/C++の宿題を片付けます 108代目
http://pc11.2ch.net/test/read.cgi/tech/1211980711/
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 28
http://pc11.2ch.net/test/read.cgi/tech/1211198816/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
0002デフォルトの名無しさん
2008/06/01(日) 23:16:33Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
0003デフォルトの名無しさん
2008/06/01(日) 23:17:18Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/
Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/
Part 22 ttp://pc11.2ch.net/test/read.cgi/tech/1196489491/
Part 23 ttp://pc11.2ch.net/test/read.cgi/tech/1198295362/
Part 24 ttp://pc11.2ch.net/test/read.cgi/tech/1201083176/
Part 25 ttp://pc11.2ch.net/test/read.cgi/tech/1203343907/
Part 26 ttp://pc11.2ch.net/test/read.cgi/tech/1206196600/
Part 27 ttp://pc11.2ch.net/test/read.cgi/tech/1209429897/
Part 28 ttp://pc11.2ch.net/test/read.cgi/tech/1211198816/
0004デフォルトの名無しさん
2008/06/01(日) 23:47:270005デフォルトの名無しさん
2008/06/01(日) 23:57:470006デフォルトの名無しさん
2008/06/02(月) 00:15:310007デフォルトの名無しさん
2008/06/02(月) 00:23:550008デフォルトの名無しさん
2008/06/02(月) 01:50:35int a,b,c,e
--------------
例えば、a=2 b=4
2^1=2
2^2=4
2^3=8
2^4=16
-----------
これをfor文で回したい。
for(e; e<=b; e++)
c=a*e
…普通の乗算になってしまう。
階乗にするにはどうすれば良い?
0009デフォルトの名無しさん
2008/06/02(月) 02:01:40c=1;
for(e; e<=b; e++) c=c*a;
かな?
0010デフォルトの名無しさん
2008/06/02(月) 02:03:20c=1;
for(e=0; e<b; e++) c=c*a;
0011デフォルトの名無しさん
2008/06/02(月) 02:04:390012デフォルトの名無しさん
2008/06/02(月) 02:04:45void func(struct person* p[])
と
void func(struct person *p[])
と
void func((struct person *)p[])
と
void func((struct person *p)[])
と
void func(struct person *(p[]))
ってどうどれぞれどう違うんでしょう?
0013デフォルトの名無しさん
2008/06/02(月) 02:11:15void func(struct person *p[])
void func(struct person *(p[]))
全て等価
void func((struct person *)p[])
void func((struct person *p)[])
コンパイルエラー
0014デフォルトの名無しさん
2008/06/02(月) 02:12:41void func(struct person *p[]) /* ポインタのポインタ */
void func((struct person *)p[]) /* 間違い */
void func((struct person *p)[]) /* 間違い */
void func(struct person *(p[])) /* ポインタのポインタ */
0015デフォルトの名無しさん
2008/06/02(月) 02:15:39void func(struct person *p[])
この二つは同じものである。* の前後のスペースから何を想像しても勝手だが、
いずれもまず p[] が *p と解釈され、よって *p[] は **p でありこれはポインタへのポインタを意味する。
void func((struct person *)p[])
void func((struct person *p)[])
この二つは文法的に誤りである。
void func(struct person *(p[]))
上で述べたとおり、括弧をつけるまでもなくまず p[] が解釈される。つまり最初の二つと同じである。
0016デフォルトの名無しさん
2008/06/02(月) 02:20:57Cでは配列全体をやりとりすることができないからである。
配列はほとんどの場合ポインタに成り下がって関数に渡される。
だから関数の引数リストで[]と書いたらそれは本当はポインタであることを意味する。
ただし、この解釈の変換は最初の一回だけであることに注意すること。
p[][5] は「要素が5の配列へのポインタ」であってポインタへのポインタではない。
0017デフォルトの名無しさん
2008/06/02(月) 02:32:25Glibを使おうとhttp://www.gnome.gr.jp/docs/glib-2.8.x-refs/glib/glib-compiling.html
を見ながらコンパイラの引数にpkg-configを加えたのですがうまくいかず、
glib.h及びstdlib.hなどの標準ヘッダファイルから、
/usr/include/stdlib.h error: storage class specified for parameter ‘atof’
などのエラーが200個近く発生して途方にくれています。
コンソールで試しても同じで、引数のpkg-configを外しても元に戻ることはありませんでした。
何が原因かさっぱり分かりません。どうかよろしくお願いします。
0018デフォルトの名無しさん
2008/06/02(月) 02:44:30だから、成り下がってって表現すんなって。
配列を渡す事ができないからアドレス渡すだけだろ?
ポインタを渡したいならポインタのアドレス渡さなきゃダメだろ?
0019デフォルトの名無しさん
2008/06/02(月) 02:45:59200個出たからといって200個直す必要は必ずしも無いよ。
最初の1個をとりあえず解決してみるといい。
0020デフォルトの名無しさん
2008/06/02(月) 02:58:55関数に渡すことが出来ないから成り下がるんじゃないよ
関数云々以前にまず成り下がるの
構成概念をよくしらない人は黙ってなさい
0021デフォルトの名無しさん
2008/06/02(月) 03:02:12理解してれば文脈で区別はつくけど
0022デフォルトの名無しさん
2008/06/02(月) 03:04:15関数の引数に指定したい場合はどうしたらいいのですか?
void func(struct person* p[])
void func(struct person *p[])
void func(struct person *(p[]))
はポインタのポインタ?
0023デフォルトの名無しさん
2008/06/02(月) 03:05:27・成り下がる、をどういう意図で使っているのか
・「ほとんどの場合」に当てはまらないのはどういう状況か
この二つについて説明を求めます。
0024デフォルトの名無しさん
2008/06/02(月) 03:08:44*p[5] 要素数が5のポインタの配列
**p ポインタへのポインタ
関数の引数には配列そのものは使えない
代わりに配列の先頭要素へのポインタ(例: p[] )か、
配列そのものへのポインタ(例: (*p)[5] )を使う
0025デフォルトの名無しさん
2008/06/02(月) 03:10:40(*p)[5] と *p[5] は違うんですか?
0026デフォルトの名無しさん
2008/06/02(月) 03:13:090027デフォルトの名無しさん
2008/06/02(月) 03:13:54上については前スレに書いてあるだろ
下については&配列名で配列へのポインタ(成り下がった先頭要素へのポインタではなく)を渡す場合があるな
0028デフォルトの名無しさん
2008/06/02(月) 03:15:59まるで「int型の変数」が渡されるかのように見えます。
「int型の変数」を渡したい場合、その変数が格納されているアドレスを
渡さなければその「int型の変数」を扱えないでしょう?
なのにポインタ(に成り下がって?)関数に渡される、と表現しているのが
非常にまずいと言っているのです。
0029デフォルトの名無しさん
2008/06/02(月) 03:18:27それはひょっとして参照渡しですか?
Cは常に値渡しですが何か?
規格読み直せ
0030デフォルトの名無しさん
2008/06/02(月) 03:19:39値渡しであるからこそ、変数のアドレスを渡さなければ
その変数自体を扱う事ができないといっているのです。
意味を理解していますか?
0031デフォルトの名無しさん
2008/06/02(月) 03:23:29・配列の先頭要素が格納されているアドレスが渡される
という表記は数あれど
・配列のポインタが渡される
などという表記がされているものを見た事がありません。
0032デフォルトの名無しさん
2008/06/02(月) 03:24:530033デフォルトの名無しさん
2008/06/02(月) 03:25:090034デフォルトの名無しさん
2008/06/02(月) 03:25:53ですから、ポインタを関数に渡すという表現がおかしいといっているのですが
0035デフォルトの名無しさん
2008/06/02(月) 03:42:58http://pc11.2ch.net/test/read.cgi/tech/1193166476/
ポインタ死ねよ。
http://pc11.2ch.net/test/read.cgi/tech/1171172537/
0036デフォルトの名無しさん
2008/06/02(月) 03:48:17Javaには便利な文字列型があるけどCには無いってのも関係していますか?
VSのように便利・安全なものほど遅いという感じで覚えておけばよかですか?
0037デフォルトの名無しさん
2008/06/02(月) 03:53:040038デフォルトの名無しさん
2008/06/02(月) 09:55:45C言語なら俺に聞け(入門篇) Part 28
http://pc11.2ch.net/test/read.cgi/tech/1211198816/977-
0039デフォルトの名無しさん
2008/06/02(月) 09:59:25JavaはJITで最適化してない状態ではある意味インタプリタ言語として動いてます。
ある意味といったのは、HTMLなんかのようなその都度スクリプトを解析するのでは
なくJavaVMが扱える中間コードになっているから。
C言語は実行する環境向けに最適化されています。
コンパイルでできあがるのはマシン語です。
0040デフォルトの名無しさん
2008/06/02(月) 13:02:09効率のよい実装を目標として作られたから
それ以上でもそれ以下でもない
0041デフォルトの名無しさん
2008/06/02(月) 13:23:36長文になりますがつまずいてしまったので、質問させてください
#include <stdio.h>
int funcJIJOU(int x){
return x * x;
}
#define macroJIJOU(x) (x) * (x)
void main(void){
int i = 1, j = 1, k = 1, l = 1;
int x, y;
while(i <= 5){
x = i++;
y = i++;
printf("x * y結果:%d\n", x * y);
}
while(j <= 5){
printf("j++ * j++結果:%d\n", (j++) * (j++));
}
while(k <= 5){
printf("関数結果:%d\n", funcJIJOU(k++));
}
while(l <= 5){
printf("マクロ結果:%d\n", macroJIJOU(l++));
}
return;
}
上のようなものを書いてみました
0042デフォルトの名無しさん
2008/06/02(月) 13:24:28上記の実行結果:
x * y結果:2
x * y結果:12
x * y結果:30
j++ * j++結果:1
j++ * j++結果:9
j++ * j++結果:25
関数結果:1
関数結果:4
関数結果:9
関数結果:16
関数結果:25
マクロ結果:1
マクロ結果:9
マクロ結果:25
ここで実行結果を見てx * y結果と関数結果は思った通りになりました
j++ * j++結果とマクロ結果が同じであることも思った通りではありました
ですがなぜ1 9 25と一つとばしなのかがわかりません
j++の度にjが1足されるのだとすれば2 12 30となると思うのですが・・・
ご教示ください
0043デフォルトの名無しさん
2008/06/02(月) 13:29:09インクリメントが行われる。
printf("j++ * j++結果:%d\n", (j++) * (j++));
は、 jが1としてステートメントを処理した後に、インクリメントが2回行われる。
次のループでは3としてステートメントを処理した後に、というかんじです。
0044デフォルトの名無しさん
2008/06/02(月) 13:29:41http://www.kouno.jp/home/c_faq/c3.html#2
0045デフォルトの名無しさん
2008/06/02(月) 13:34:32は
printf("j++ * j++結果:%d\n", (j) * (j));
j++;
j++;
と同じ
0046デフォルトの名無しさん
2008/06/02(月) 13:36:08未定義動作だろうが。
うそを教えるなよ
0047デフォルトの名無しさん
2008/06/02(月) 13:44:30おー、すまん。
コンパイラによって結果が違うこともあるのか。
0048デフォルトの名無しさん
2008/06/02(月) 13:46:48早速の回答ありがとうございます
問題が解決しました
0049デフォルトの名無しさん
2008/06/02(月) 13:48:38あなたがお使いのコンパイラはあくまで>>45のいうような動作をするだけで
別のコンパイラだと違った結果を出すこともあると覚えて置いてください。
0050デフォルトの名無しさん
2008/06/02(月) 13:51:34そういう言い方すると単に評価の順序が不定みたいな感じがするが、
>>41のコードはコンパイルすら通らない可能性もあるし、実行時にエラーが発生する可能性もある。
0051デフォルトの名無しさん
2008/06/02(月) 13:52:18ありがとうございます
>>46様の言われている未定義動作と、言うのはコンパイラ別に判断される動作、ということなのですね
0052デフォルトの名無しさん
2008/06/02(月) 13:53:04副作用完了点の間で同じ値を二度変更するのは常に未定義である。
未定義であるとは、その結果 ど ん な こ と が 起きても、
例えばパソコンが壊れるようなことがあったとしても、
規格もコンパイラもいっさい責任を持たないということである。
一般に言ってそのようなコードを書くことはまったく推奨されない。
少なくとも、全てを自己責任で行わなくてはいけない。
0053デフォルトの名無しさん
2008/06/02(月) 13:54:32・処理系定義(implementation defined)の動作
どう動作するかを実装が選択する。そのプログラムがコンパイルできないというのは許されない。
(この構成概念を使ったプログラムは誤りというわけではない。)
(実装が)何を選んだかは(コンパイラの作者が)文書にしておかなければならない。
規格が合法な動作をいくつか用意していてそこから選ぶことができるかもしれないし、
必要条件をとくに課していないかもしれない。
・未規定(unspecified)の動作
処理系定義の動作に似ている。ただし、どういう動作を選んだかは文書にする必要がない。
・未定義(undefined)の動作
本当に何が起きても不思議はないことを意味する。規格は何の必要条件も課さない。
コンパイルできないかもしれないし、誤った動きをするかもしれないし
(クラッシュしたり黙って誤った結果を出したり)、
あるいはたまたまプログラマの意図したとおりの動きをするかもしれない。
以上、CFAQより抜粋
0054デフォルトの名無しさん
2008/06/02(月) 13:56:00違う
「やってはいけないこと」の類
0055デフォルトの名無しさん
2008/06/02(月) 13:57:28普通にプログラミングしてて
printf("j++ * j++結果:%d\n", (j++) * (j++));
は気持ち悪いと思ってまず組まないけどなw
0056デフォルトの名無しさん
2008/06/02(月) 18:03:09http://pc11.2ch.net/test/read.cgi/tech/1211198816/992-
http://www.kk.iij4u.or.jp/~kondo/bmp/
ここを参考にしたのですが先頭の2バイトに設置されている"BM"が曲者で
ヘッダも14バイトなのでせめて2バイト予備で入れてくれればいいのに・・・
という状況で・・・・
自分のプログラムで使う構造体なら考慮して作りますけどすでにある
共通のフォーマットだとそうもいかなくて無理やりやってるんですよねorz
0057デフォルトの名無しさん
2008/06/02(月) 18:03:25gcc なら
#pragma pack(1)
でおk
0059デフォルトの名無しさん
2008/06/02(月) 18:08:01#pragma pack(2)
struct ほにゃらら;
#pragma pack(0) // 元に戻す
0060デフォルトの名無しさん
2008/06/02(月) 18:10:09struct Foo {unsigned char c[14];}でも用意して、適宜変換する関数群でも用意しておけばよかろ。
static inline unsigned long getBfSize(const Foo f)
{
union {
unsigned long u;
unsigned char c[4];
} v;
v.c[0] = c[2]; v.c[1] = c[3]; v.c[2] = c[4]; v.c[3] = c[5];
return v.u;
}
位の関数なら、最適化で消えてなくなるだろ。
0061デフォルトの名無しさん
2008/06/02(月) 18:12:26struct ほにゃらら;
#pragma pack(pop) // 元に戻す
つーのもあったような
0062デフォルトの名無しさん
2008/06/02(月) 18:15:53そっちのほうが行儀がいいな
0063デフォルトの名無しさん
2008/06/02(月) 22:01:24あなた、感覚がかなり可笑しいよ。アセンブラ勉強したら?
成り下がるって事ではなく内部からすれば Call by Value の方が処理多くなるでしょよ。
一般の言語から C 系に来ると逆転するんだよね。
0064デフォルトの名無しさん
2008/06/02(月) 22:20:11の作成をして頂けませんか‥‥??
手元にemacsがなく、しかし、答え合わせをしたく思います‥!!
0065デフォルトの名無しさん
2008/06/02(月) 22:20:440066デフォルトの名無しさん
2008/06/02(月) 22:21:26教えて欲しいのではなく宿題を丸投げしたいならこちらへ。
C/C++の宿題を片付けます 108代目
http://pc11.2ch.net/test/read.cgi/tech/1211980711/
0067デフォルトの名無しさん
2008/06/02(月) 22:25:07脳内にCインタプリタを構築して、神と鉛筆を持って脳内ステップ実行してみろ。
机上デバッグといって昔はみんなそうしてた。
0068デフォルトの名無しさん
2008/06/02(月) 22:26:37懐かしいなw
学校にコンパイラすらなくてマシン語手打ちしてたときは
そんな感じだったよw
0069デフォルトの名無しさん
2008/06/02(月) 22:32:21サンプル・・・だけどあえて罠が入ってる。
int a,b,c,d;
float e;
a = 90;
b = 45;
c = 82;
c = a + b + c;
e = c/3;
(ここに標準出力)
0070デフォルトの名無しさん
2008/06/02(月) 22:33:280071デフォルトの名無しさん
2008/06/02(月) 22:33:37emacsでないと書けないというのは奇妙な話だ。
君のコンピュータにはメモ帳がないのか?
0072デフォルトの名無しさん
2008/06/02(月) 22:35:340073デフォルトの名無しさん
2008/06/02(月) 22:35:35君のソースをここに書いてみて
もし間違いがあれば指摘してもらえるよ
0074デフォルトの名無しさん
2008/06/02(月) 22:36:09あなたは実引数に配列識別子を指定した場合、
関数に対してポインタに成り下がったものが渡ると思いますか?
それとも、配列の先頭アドレスを指すポインタに変換された後、
そのポインタが指すアドレスが渡ると思いますか?
0075デフォルトの名無しさん
2008/06/02(月) 22:48:54お引取りください
0076デフォルトの名無しさん
2008/06/02(月) 22:49:52放置しろ
0077デフォルトの名無しさん
2008/06/02(月) 22:49:550078デフォルトの名無しさん
2008/06/02(月) 22:57:41その2つは、同じことを言い換えただけだと思います。
0079デフォルトの名無しさん
2008/06/02(月) 23:09:33むやみに触ると火を吹くよ><
たぶん、たぶんなんだけど、後者だと思う。
C言語は値渡しだから、ポインタ変数を引数に指定した場合に、
それ自体を関数側で操作する事はできず、ポインタ変数の値である
番地しか渡せない。つまり、ポインタ変数を渡したい場合は、
そのポインタ変数が格納されているアドレスを渡さないといけないって
いいたいんだと思う。
こんがらがってきたorz
…噴火したらゴメンヨ。
0080デフォルトの名無しさん
2008/06/02(月) 23:10:55>>69
ありがちな罠ワロスw
0081デフォルトの名無しさん
2008/06/02(月) 23:12:410082デフォルトの名無しさん
2008/06/02(月) 23:29:11忘れろ
忘れるんだ
2.0なんか出てないんだ
0083デフォルトの名無しさん
2008/06/02(月) 23:32:45時に読み込ませ,1pixごとにそのRGB値を調べさせてCSV形式で書き出すプログラム 」
というプログラムを「C/C++の宿題を片付けます」で作っていただいたのですが、RGB値を読み込むことが出来ません。どうすれば読み込めるようになるか教えてください。
以下のプログラムが作っていただいたプログラムになります。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6759.c
0084デフォルトの名無しさん
2008/06/02(月) 23:38:32ここで
聞く
0085デフォルトの名無しさん
2008/06/02(月) 23:55:110086デフォルトの名無しさん
2008/06/03(火) 00:05:00GetPixelはこのプログラミングにそのまま使っても問題ないのでしょうか?
あと流れとしては
GetPixelでpixel指定をする。
↓
指定したPixelでRGB値を読み込む。
↓
これをfor文で繰り返す。
0087デフォルトの名無しさん
2008/06/03(火) 00:11:19int i,j;
COLORREF savecolor[XSIZE][YSIZE];
for(i = 0; i < XSIZE; i++){
for(j = 0; j < YSIZE; j++){
savecolor[i][j] = GetPixel(i, j);
}
}
あとはCSV形式にするだけ
0088デフォルトの名無しさん
2008/06/03(火) 00:20:43私自身の実験解析手段なので、使わせていただきます。
あと、これを用いた時にRGB値を調べるのによいプログラミングはどういったものなのでしょうか?
RGB値を読み込むものを探したらいろいろと出てきてどれを使えばよいのか分からないのですが。
お手数おかけします。
0089デフォルトの名無しさん
2008/06/03(火) 00:27:21>>87のGetPixel引数1個足りないわ
HDCにビットマップをロードしとかないとダメだった
RGB値を調べるというのは意味がちょっと分からないけど
GetRValue, GetGValue, GetBValue でCOLORREF型からRGBが取得できる
0090デフォルトの名無しさん
2008/06/03(火) 00:27:45縦のライン数が正か負で情報の保存されてる方向がちがうんだよなw
0091デフォルトの名無しさん
2008/06/03(火) 00:38:02HDCは普通に画像を読み込んで、それをFILEのポインタで用意したものを使ったらいいのでしょうか?
あとざっと調べてみたのですが、GetRValue, GetGValue, GetBValueは例えば
color=getpixel()
で読み込んだものを
r[i][j]=GetRValue(color)
見たいな感じで組んでいけばいいでしょうか?
0092デフォルトの名無しさん
2008/06/03(火) 00:38:47http://www.kk.iij4u.or.jp/~kondo/bmp/dumpbmp.c
ここの下のほうにあった
http://www.kk.iij4u.or.jp/~kondo/bmp/
0093デフォルトの名無しさん
2008/06/03(火) 00:50:38ありがとうございます。このデータを参考にもう一度プログラムを練ってみようと思います。
本当にありがとうございました。
0094デフォルトの名無しさん
2008/06/03(火) 00:57:380095デフォルトの名無しさん
2008/06/03(火) 01:00:11#include <stdio.h>
int main(){puts("");return 0;}
0096デフォルトの名無しさん
2008/06/03(火) 01:03:070097デフォルトの名無しさん
2008/06/03(火) 01:07:46C/C++の宿題を片付けます 108代目
http://pc11.2ch.net/test/read.cgi/tech/1211980711/
0098デフォルトの名無しさん
2008/06/03(火) 01:15:54宿題ではないんですけどね
0099デフォルトの名無しさん
2008/06/03(火) 01:21:32{
int sum = 0;
for(; min < max; min++)
sum += min;
printf("\n");
return sum;
}
0100デフォルトの名無しさん
2008/06/03(火) 01:23:59ありがとうございます
これからもちょくちょくお邪魔することにしました
0101デフォルトの名無しさん
2008/06/03(火) 06:12:04#include <ctype.h>
void Oomoji( char *st );
void main()
{
char *moji = "abc";
char moji2[] = "abc";
Oomoji(moji2);
}
//大文字に変換する関数
void Oomoji( char *st )
{
int i = 0;
while( *(st+i) != '\0' ) {
*(st+i) = toupper( *(st+i) );
i++;
}
printf( "%s\n", st );
}
すいません、質問したいのですが変数moji2だと、ちゃんと大文字に変換できる
のですが、ポインタ変数mojiだと変換できないのですが、なぜなのか教えて
もらえないでしょうか、お願いします。開発環境はVisual C++です。
0102デフォルトの名無しさん
2008/06/03(火) 06:23:57C++じゃなくてC言語だと書き換えも可能だけど絶対やらない事
0103デフォルトの名無しさん
2008/06/03(火) 06:38:17ありがとうございます。
0104デフォルトの名無しさん
2008/06/03(火) 07:49:47つまりchar *型で宣言した文字列は絶対にconst charになるので、
101のような書き換えは、するなと言うことなんですかね?
0105デフォルトの名無しさん
2008/06/03(火) 07:57:49それと配列を関数を通してポインタにキャストするのも、あまり好ましくはないかな・・・
void Oomoji2( char sz[], size_t sz )
微妙に意味合いが変わるしね
ついでに、strncpyみたいに配列サイズの指定も推奨
0106デフォルトの名無しさん
2008/06/03(火) 09:05:56コンパイラによっては、文字列リテラルは読み取り専用領域に用意される
(オプションで動作を切り替えられるコンパイラもある)
>char *moji = "abc";
この場合、読み取り専用領域に確保された文字列"abc"を指すように、ポインタmojiを初期化している
mojiは"abc"を指しているだけで、その指す先は読み取り専用領域だから、書き換えられない
>char moji2[] = "abc";
この場合、"abc"という内容で配列moji2を初期化している
どこか別の領域を指しているわけではなく、moji2自身に文字列の内容が含まれているので、書き換えられる
0107デフォルトの名無しさん
2008/06/03(火) 09:31:12どうも、ありがとうございました。理解できたと思います。
0108デフォルトの名無しさん
2008/06/03(火) 10:01:100109デフォルトの名無しさん
2008/06/03(火) 10:05:070110デフォルトの名無しさん
2008/06/03(火) 10:33:56fflush(stdin);
0111デフォルトの名無しさん
2008/06/03(火) 10:35:110112デフォルトの名無しさん
2008/06/03(火) 13:55:50今日変な課題出された。
0113デフォルトの名無しさん
2008/06/03(火) 13:58:490114デフォルトの名無しさん
2008/06/03(火) 13:59:05奇数15というのは文字列の配列30個のうちの奇数番号の配列15個でOK?
0115デフォルトの名無しさん
2008/06/03(火) 14:03:25処理系依存っつか未定義な
0116デフォルトの名無しさん
2008/06/03(火) 14:05:400117デフォルトの名無しさん
2008/06/03(火) 15:11:050118デフォルトの名無しさん
2008/06/03(火) 15:26:06#include <stdlib.h>
#define LIMIT 50 /* スタックに入る数の最大値 */
typedef int a ; /* 真偽値の型 */
int StackArray [LIMIT] ;
int top ; /* スタックの先頭を指す */
void push (int x) ; /* 関数のプロトタイプ宣言 */
int pop (void) ; /* 関数のプロトタイプ宣言 */
a push_1 (void) ; /* 関数のプロトタイプ宣言 */
a pop_1 (int n) ; /* 関数のプロトタイプ宣言 */
void error (void)
{
}
int main(int argc, char **argv)
{
int order, x, y ;
top = 0 ;
0119デフォルトの名無しさん
2008/06/03(火) 15:26:45{
printf ("\n現在のデータ数:%d\n", top) ;
printf ("現在のスタックの状態:") ;
{int i ; for (i=0; i<top; ++i) printf ("%d ", StackArray[i]) ;} printf ("\n") ;
if (push_1 ()) printf ("(1) push ") ;
if (pop_1 (1)) printf ("(2) pop ") ;
printf ("(3) finish ") ;
if (pop_1 (2)) printf ("(4) + (5) − (6) × ") ;
printf (">") ;
scanf ("%d", &order) ;
switch (order)
{
case 1: if (push_1 ()) { printf ("input data: ") ; scanf ("%d", &x) ; push (x) ;} else error () ; break ;
case 2: if (pop_1 (1)) { printf ("%d\n", pop ()) ;} else error () ; break ;
case 3: return EXIT_SUCCESS ;
case 4: if (pop_1 (2)) {y=pop() ; x=pop() ; push (x+y) ;} else error () ; break ;
case 5: if (pop_1 (2)) {y=pop() ; x=pop() ; push (x-y) ;} else error () ; break ;
case 6: if (pop_1 (2)) {y=pop() ; x=pop() ; push (x*y) ;} else error () ; break ;
default: error () ;
}
}
}
0120デフォルトの名無しさん
2008/06/03(火) 15:27:07{
return top < LIMIT ;
}
void push (int x)
{
StackArray [top] = x ;
top = top++ ;
}
a pop_1 (int n)
{
return 0 <= top-n ;
}
int pop (void)
{
top = top-- ;
return StackArray [top] ;
}
0121デフォルトの名無しさん
2008/06/03(火) 15:33:36また、1〜9の範囲の整数を入力するプログラムって
#include<stdio.h>
int main(void)
{
int x;
if(x>0 || x<10)
{
printf("1〜9の整数です\n");
}
else
{
return 0;
}
}
こんな感じでいいですか?
0122デフォルトの名無しさん
2008/06/03(火) 15:45:100123デフォルトの名無しさん
2008/06/03(火) 15:53:18アホなことやるな
0124デフォルトの名無しさん
2008/06/03(火) 15:53:55void main()
{
int year, month, day, weekday;
for (year = 2001; year <= 2100; year++){
for (month = 1; month <= 12; month++){
weekday = ((year + year/4 - year/100 + year/400 + (13*month+8)/5 + 13) % 7)+8;
if (weekday == 13)
printf("%4d年 %2d月 %2d日\n",year, month, weekday);
}
}
}
この実行結果の13日の金曜日の個数はどうやって求めればいいですか?
0125デフォルトの名無しさん
2008/06/03(火) 15:55:42なんか全体的に気色悪い書きかただなぁ
0126デフォルトの名無しさん
2008/06/03(火) 15:57:21どこがダメですか?教えてください
0127デフォルトの名無しさん
2008/06/03(火) 16:04:02top=top++;
top=top--;
これ未定義
0128デフォルトの名無しさん
2008/06/03(火) 16:09:27>>118-120までで出来てるんじゃないのか?(>>127の間違いあるけど)
それとも自分で書いたソースじゃないのか?
とりあえず1〜9を判定したいなら scanfでxに値を入れてから if(x>0 && x<10) だ
0129デフォルトの名無しさん
2008/06/03(火) 16:14:38・真偽型なんか宣言するな
・スタックの状態を判定する関数の名前をもう少し工夫しろ
・while(1)よりも、orderを初期化した上でdo{ ... }while(order!=3); のほうが構成的に綺麗
気になるのはそんなとこか
0130デフォルトの名無しさん
2008/06/03(火) 16:19:08x に値が入っていない
条件は || じゃなく &&
return は else の外に出せ(elseは必要ない)
0131デフォルトの名無しさん
2008/06/03(火) 16:26:11変数に記録でもすれば?
0132デフォルトの名無しさん
2008/06/03(火) 18:04:59int main(void)
{
int x;
scanf("%d", &x);
if(x>0 && x<10)
{
printf("1〜9の整数です\n");
}
return 0;
}
これでいいですか?
0133デフォルトの名無しさん
2008/06/03(火) 18:14:470134デフォルトの名無しさん
2008/06/03(火) 19:21:21みなさんのお薦めで教えて
簡単なヤツがいいです
0135デフォルトの名無しさん
2008/06/03(火) 19:23:44DOSならSleep
Linuxならusleep
0136デフォルトの名無しさん
2008/06/03(火) 19:47:24ミリ秒待たせるにはどうしたらいいでしょうか(T_T)
sleepとか色々な綴りもやりました(;_;)
0137デフォルトの名無しさん
2008/06/03(火) 19:54:080138デフォルトの名無しさん
2008/06/03(火) 19:54:15Cの標準関数じゃなくAPIになるから、環境をかけ。OSとコンパイラの種類とバージョンだ。
0139デフォルトの名無しさん
2008/06/03(火) 20:02:02int min_of(const int vc[],int no)の作成の仕方を、どなたか教えてもらえませんか?
0140デフォルトの名無しさん
2008/06/03(火) 20:08:53{
/* 必要な変数を宣言 */
/* 最小値を記憶する変数にvcの最初の値を入れる */
/* カウンタを1から初めてno未満であるあいだ1ずつ増やしながらループし */
{
/* vcのカウンタに対応する位置の値と、
最小値を記憶している変数の値のどちらが小さいか調べ、
その小さいほうを最小値を記憶する変数に格納する */
}
/* 最小値を記憶した変数をreturnする */
}
0141デフォルトの名無しさん
2008/06/03(火) 20:13:22#include <Windows.h>
0142デフォルトの名無しさん
2008/06/03(火) 20:15:370143デフォルトの名無しさん
2008/06/03(火) 20:16:290144デフォルトの名無しさん
2008/06/03(火) 20:16:30ヘッダーのh
拡張子だよ
cソースの場合はxxx.c
0145デフォルトの名無しさん
2008/06/03(火) 20:17:160146デフォルトの名無しさん
2008/06/03(火) 20:19:09>>144
>>145
あ、ヘッダーだったのか
ありがとう
0147デフォルトの名無しさん
2008/06/03(火) 20:27:35#include<stdio.h>
とか教えられたんじゃない?
スタジオドットエッチ、とか発音してそうな雰囲気だよー
0148デフォルトの名無しさん
2008/06/03(火) 20:30:21まあ、最初からヘッダファイルがどうとかこうとか言ってたら中々始まらないしなぁ
0149デフォルトの名無しさん
2008/06/03(火) 20:32:14ちょっとなれたころに
#include<stdio.h>
なんかをはずしてみると、今まで使えてた関数が
コンパイルエラー起すでしょ、とか言って教えれるんだけどな。
0150デフォルトの名無しさん
2008/06/03(火) 20:33:09ファイル分割とかしてみてえと思って何回挫折したことか。懐かしいわぁ
0151デフォルトの名無しさん
2008/06/03(火) 20:33:250152デフォルトの名無しさん
2008/06/03(火) 20:33:28FILE外したら関数以前にエラーが出るからなぁ。
0153デフォルトの名無しさん
2008/06/03(火) 20:34:08それはすれ違い。
0154デフォルトの名無しさん
2008/06/03(火) 20:35:30ん?極端に言うと、stdio.h無しだと何もコンパイルできない、と言っている?
0155デフォルトの名無しさん
2008/06/03(火) 20:38:24逆。大抵の関数はエラーにならない。
0156デフォルトの名無しさん
2008/06/03(火) 20:40:39stdlib.h
まあ、この二つをググッて調べてみるといいよ。
どういう関数が使えるようになるかわかる
0157デフォルトの名無しさん
2008/06/03(火) 20:45:52やってみたら警告で済ませてくれた。
コンパイラやさしいな!
0158デフォルトの名無しさん
2008/06/03(火) 20:46:410159デフォルトの名無しさん
2008/06/03(火) 20:46:42html->nextはHTMLの内容
#define BODY_SIZE 214
/* <>の切り出し */
html->body = (char *)malloc((size + 1) * sizeof(char));
if(html->body == NULL) goto END;
char *tmp;
while(*html->next++ != '<' && *html->next != '\0');
for(int len=0; html->next[len] != '\0'; len++){
if(html->next[len] == '>'){
html->body[len] = '\0';
break;}
if(len >= size - 1){
size += BODY_SIZE;
tmp = (char *)realloc(html->body,size);
if(tmp != NULL)
html->body = tmp;
else
goto END;}
html->body[len] = html->next[len];
}
HTMLの<>内を取得していくにあたり、動的なヒープ領域が足りなくなれば、
reallocを使って拡張し、また取得していく、という処理なのですが、
コードが複雑になり、非常に読み難いものになってしまい、
これをもっと簡潔には出来ないものでしょうか?
0160デフォルトの名無しさん
2008/06/03(火) 20:48:10printfは組み込み関数じゃないよって警告。
0161デフォルトの名無しさん
2008/06/03(火) 20:50:11それこそ線形リストがいいんじゃね?
0162デフォルトの名無しさん
2008/06/03(火) 20:55:18今は>>159のコードを簡潔にしたいです。
0163デフォルトの名無しさん
2008/06/03(火) 20:55:530164デフォルトの名無しさん
2008/06/03(火) 21:02:09てか、各種ライブラリを使わずに使える関数って何があるの?
read と write は知ってるんだけど
0165デフォルトの名無しさん
2008/06/03(火) 21:09:33そのソースの全体的な思想が分からないからなんともいえないんだけど
'<'から、次に見つかる'>'までがとにかく取れればいい、というのであれば
strposとかでキュッキュすればいいんじゃないかな。
<<>とか<hoge foo=">">とか無視していいならね。
0166デフォルトの名無しさん
2008/06/03(火) 21:11:260167デフォルトの名無しさん
2008/06/03(火) 21:14:40strposをMSDNで調べましたが、見つかりません。
0168デフォルトの名無しさん
2008/06/03(火) 21:18:11アイヤー。ごめん。strposはphpですた。
Cだとstrstr?
0169デフォルトの名無しさん
2008/06/03(火) 21:21:46はい
0170デフォルトの名無しさん
2008/06/03(火) 21:23:00なるほど、
ではreallocの部分は簡潔になりますでしょうか?
0171デフォルトの名無しさん
2008/06/03(火) 21:23:59realloc()必要ないでしょ。
0172デフォルトの名無しさん
2008/06/03(火) 21:31:27strstrで二点間(<>)の出現場所を計算して
mallocする、ということでしょうか?
ではstrstrを使わない場合で
>>159のreallocの部分を簡潔にするためにはどうすればいいでしょうか?
0173デフォルトの名無しさん
2008/06/03(火) 21:33:07双方の出現場所が分かれば必要なサイズが分かるでしょ?
んでmalloc。
出現場所を調べる部分を簡潔にしたかったのでstrstr案を
出したわけでして、なぜ却下されたのだろう。ふしぎ!
0174デフォルトの名無しさん
2008/06/03(火) 21:34:54なぜstrstr()やらstrchr()を使わない?
サイズが事前にわからないのならrealloc()するのは仕方ない。それが嫌
ならコピー元のhtml->nextの残りサイズと同じサイズをmalloc()してお
くしかない。
Cではこのへんが限界だよ。C++ならもっとすっきり。
0175デフォルトの名無しさん
2008/06/03(火) 21:37:47strchr!思い出させてくれてありがとう。
indexofとかじゃなかったっけ?とかせっせと探してたんだw
0176デフォルトの名無しさん
2008/06/03(火) 21:38:460177デフォルトの名無しさん
2008/06/03(火) 21:40:20bool html_ensure_capacity(html_t *html, size_t new_size) {
void *tmp;
if (new_size < html->body_size-1) return true;
html->body_size += BODY_SIZE;
tmp = realloc(html->body, html->body_size);
if (tmp == NULL) return false;
html->body = tmp;
return true;
}
で、html_ensure_capacity(html, len);を呼ぶ。
0178デフォルトの名無しさん
2008/06/03(火) 21:41:42私が先程聞いたのは、strstrを使わない場合に
>>159のコードのreallocを簡潔にする方法は無いか、という事です。
却下ではなく、場合の話です。
新しく聞いている訳で、あなたが教えてくれたstrstrを使う案を退けたつもりはありません。
0179デフォルトの名無しさん
2008/06/03(火) 21:42:520180デフォルトの名無しさん
2008/06/03(火) 21:44:250181デフォルトの名無しさん
2008/06/03(火) 21:46:220182デフォルトの名無しさん
2008/06/03(火) 21:47:23見たところファイルを全部メモリにロードしてるようだし、
範囲確定してから戻ってmalloc & strncpyすればいいじゃない
0184デフォルトの名無しさん
2008/06/03(火) 21:48:40あ、タグを見つける部分を簡潔にするのと
realloc周りを簡潔にすることのどちらかしか行わないのね。
両方すればいいのにな、と思っただけですスミマセンスミマセン。
0185デフォルトの名無しさん
2008/06/03(火) 21:51:16と思っているフシがあるのかな?
goto使ってたり、}の場所が、とか。
なんか、いろいろ違和感を感じるコードだなって思うわ。
とりあえず試行錯誤しながらがんばって成長してくだされ。
0186デフォルトの名無しさん
2008/06/03(火) 21:53:51個別のタグ内容を割り当てる構造体にファイル全体へのポインタを含めて
そこからデータをコピーしてくるってのは正直気色悪い
0187デフォルトの名無しさん
2008/06/03(火) 21:56:02あなたが気持ち悪くならない方法を教えて下さい。
0188デフォルトの名無しさん
2008/06/03(火) 21:57:02ファイル全体のバッファを捨てることになるんだろうけど
ふつーテキストと合わせてなんかやるよね
0189デフォルトの名無しさん
2008/06/03(火) 21:58:33ファイル全体のバッファ(のどこか)を指しているポインタは独立で用意して関数の引数で渡す
だけ
0190デフォルトの名無しさん
2008/06/03(火) 21:58:47まだ成長途中なんだなあって思えてほのぼのするよね。
自分が昔書いたコード見たら気持ち悪い、というか、
なんでこう書いちゃったのwwって思う場所がよく見つかる
0191デフォルトの名無しさん
2008/06/03(火) 22:04:14その様にした理由を教えて下さい。
0192デフォルトの名無しさん
2008/06/03(火) 22:06:49気色悪いから
0193デフォルトの名無しさん
2008/06/03(火) 22:10:36論理的理由を聞いている訳ですが、
0194デフォルトの名無しさん
2008/06/03(火) 22:11:23ない
0195デフォルトの名無しさん
2008/06/03(火) 22:24:34経験で分かるようになるよ。
「気持ち悪い」っていう感覚ってかなり重要だよ。
0196デフォルトの名無しさん
2008/06/03(火) 22:45:12終了しますか?(Y/N)とか、終了(1)
継続(0)とか、入力をさせる。
んで入力値をscanfで取って判断してるんだけど、
scanfって直前のEnterとか認識不能なコードをストリームに
残しておくとのこと
おかげでバグだらけで困っているのだ…
他にキーボードからの入力を受け取れて不具合の無い関数は無いかな?
初歩くさくてすまんが…
0197デフォルトの名無しさん
2008/06/03(火) 22:46:040198デフォルトの名無しさん
2008/06/03(火) 22:49:32fflush(stdin)
でいいかな。
0199デフォルトの名無しさん
2008/06/03(火) 22:50:51標準入力は全てfgets()で済む。
0200デフォルトの名無しさん
2008/06/03(火) 22:51:43今ケータイだから使用例なんかを挙げて
もらえるとすごく助かるかも@新入社員、今帰り
明日午前中にコードレビューだから帰ったら今日中に
仕上げなきゃ…
0201デフォルトの名無しさん
2008/06/03(火) 22:54:30do {
c = getchar();
} while(c == 'y');
こんなんとかか?CUI系の関数使うの久々だから自信ない
0202デフォルトの名無しさん
2008/06/03(火) 23:04:51ケータイだから使用例をってどういう流れだ?
conio.hのgetchとかもいいんでないの?
0203デフォルトの名無しさん
2008/06/03(火) 23:33:03プロンプトを表示する前にずべての文字を読み捨てておく
それが唯一の汎用な解
0204デフォルトの名無しさん
2008/06/03(火) 23:44:120205デフォルトの名無しさん
2008/06/03(火) 23:50:46まあ、きちんとした使い方を理解させないで安易にscanf()で入力させる入門書や教師が一番悪いんだが。
0206デフォルトの名無しさん
2008/06/03(火) 23:59:220207デフォルトの名無しさん
2008/06/04(水) 00:05:14とりあえずgetcharを用いて行ってみるよ
文字として受けるから書式指定せずにいけるからね
これから実装だ…
0208デフォルトの名無しさん
2008/06/04(水) 00:12:370209デフォルトの名無しさん
2008/06/04(水) 00:13:20納期は明日の午前だからしょうがない
別に業務じゃないけど、納期に遅れる訳にはいかないことを
教えるためだと思う
0210デフォルトの名無しさん
2008/06/04(水) 00:13:53そんなことしてたら、エラーのときと正常動作のときと動きがちがってくるとか面倒なことがありそう。
stdinをfflush()したりファイルポインタを先頭にもどすとかってフラッシュのやりかたがあるけど、移植性ないし
リダイレクトとかされたら、どう動くかわからんし。
fgets()とかで行単位で読み込んで、sscanf()を使うなり自力で解釈するのがシンプルで紛れのないやりかた。
0211デフォルトの名無しさん
2008/06/04(水) 00:23:35業務では無いみたいだし、つか勝手に持って帰ってるだけだと思うけど
「納期に遅れる訳にはいかない」なら会社に泊まらせた方がまだいいなぁ
0212デフォルトの名無しさん
2008/06/04(水) 00:25:340213デフォルトの名無しさん
2008/06/04(水) 00:27:340214デフォルトの名無しさん
2008/06/04(水) 01:13:26泊まり込みなんてほんとにあんのかなあ?
寝ないと逆に集中出来ないんじゃね?
0215デフォルトの名無しさん
2008/06/04(水) 01:16:470216デフォルトの名無しさん
2008/06/04(水) 01:18:40泊り込みなんてほんとにある も真
0217デフォルトの名無しさん
2008/06/04(水) 01:25:080218デフォルトの名無しさん
2008/06/04(水) 01:57:58移動時間が節約できるんだよね。
あとは思い立った瞬間に仕事ができるんだよね。
夜2時とかにひらめくこともある。
0219デフォルトの名無しさん
2008/06/04(水) 08:19:080220デフォルトの名無しさん
2008/06/04(水) 08:35:541〜9の範囲の整数を入力してくれなかったら困るなあってところにいれる
0221デフォルトの名無しさん
2008/06/04(水) 19:35:54無理をすると、あとでしっぺ返しがくる。
無理をしなければ納期に間に合わないようであれば、納期を延ばしてもらう。
これがいい。
そういう調整能力を身につけることも、プログラマーにとっては重要。
0222デフォルトの名無しさん
2008/06/04(水) 21:51:52それがヒューマンスキルってやつ?違う?
0223デフォルトの名無しさん
2008/06/04(水) 21:54:28無理をさせ 無理をするなと 無理を言い
だったけな?
0224デフォルトの名無しさん
2008/06/04(水) 22:17:300225デフォルトの名無しさん
2008/06/04(水) 22:18:080226デフォルトの名無しさん
2008/06/04(水) 22:20:36int n = *p;
n++;
*p = n;
*(p++)は、
int* p2 = p + 1;
くらいだと思っとけ
0227デフォルトの名無しさん
2008/06/04(水) 22:24:39は中身をインクリメント
*(p++) 及び *p++ は
はポインタをインクリメント
0228デフォルトの名無しさん
2008/06/04(水) 22:46:52char str[5]
str[1] ="文字列1"
str[2] ="文字列2"
str[3] ="文字列3"
printf(%s\n,str[1]);
とやってもエラーになるんですが。
0229デフォルトの名無しさん
2008/06/04(水) 22:48:06文字の配列だからね
どうしてもしたいなら二次元配列使う
0230デフォルトの名無しさん
2008/06/04(水) 22:49:410231デフォルトの名無しさん
2008/06/04(水) 22:50:15char* str[5]
まー、何がやりたい分からないから、これがベストとはとても言えないが
0232デフォルトの名無しさん
2008/06/04(水) 23:10:12厳密な意味での文字列の配列とは、文字の二次元配列の各行要素に文字列が入っているものを言う。
char strlist[3][8];
このように宣言したとき、strlist[0] 〜 strlist[2] は、それぞれが char str[8]; と宣言した str と等価となる。
しかし、上記の配列では、全ての行要素の配列の大きさが同じである必要がある。
つまり、それぞれの行に入る文字列の長さが違っても、最も長いものに合わせなければならず、メモリを浪費しがちである。
それが嫌な場合には、主に文字列へのポインタの配列が使われる。
char *strlist[3];
char str0[5], str1[8], str2[4];
strlist[0]=str0;
strlist[1]=str1;
strlist[2]=str2;
見ての通り、strlist[0] 〜 strlist[2] は charへのポインタであり、それぞれが対応する配列の先頭を指している。
ということはそれぞれを文字列として扱うことができ、しかもそれぞれに対応する配列の大きさを個別に設定できる。
ただし、実際にはこのように静的な配列を行要素に使うことはほとんどない。通常、malloc() で割り付けた動的な領域を使う。
malloc() の扱いには熟練を要するので、安易に手を出すのは控えること。
それと念のために言っておくが、Cの配列の添字は 0 から始まる。char str[5]; と宣言したら各要素は str[0] 〜 str[4] である。
0233デフォルトの名無しさん
2008/06/04(水) 23:13:280234デフォルトの名無しさん
2008/06/04(水) 23:17:15それを言ってもまったく早くはならないと思うが
0235デフォルトの名無しさん
2008/06/04(水) 23:40:55こうですか
0236デフォルトの名無しさん
2008/06/04(水) 23:58:14だろ
0237デフォルトの名無しさん
2008/06/05(木) 00:00:210238デフォルトの名無しさん
2008/06/05(木) 00:26:26Cの前にPASCALを勉強することはお利口さん
ただし、ハマるとオ××に転落さん
そこにさえ気をつければ、本当はPASCALから入って欲しいのだが
Cの勉強は、PACALを初歩をマスターしてからという奴
Free-PASCAL/Turbo-Delphi/ラザルス(だったけ)
みたいなフリーな処理系がネットで入手可能だし、条件は
恵まれているのだが...
なにせ、良いPASCALの入門書は絶版に近いのがイタい。
やっぱり××ムの影響だろな。
0239デフォルトの名無しさん
2008/06/05(木) 00:38:16はいはいスレチスレチ
0240デフォルトの名無しさん
2008/06/05(木) 00:58:130241デフォルトの名無しさん
2008/06/05(木) 01:03:310242デフォルトの名無しさん
2008/06/05(木) 01:11:20書き方次第だよ
判定式の中に計算とかそういうのをやらなければどうってことはない。
0243デフォルトの名無しさん
2008/06/05(木) 01:27:05「約束を守る」という社会人の鉄則にすぎないのですが、なにか?
0244デフォルトの名無しさん
2008/06/05(木) 01:27:45スキルあげるため、どういう本がいい?
0245デフォルトの名無しさん
2008/06/05(木) 01:32:140246デフォルトの名無しさん
2008/06/05(木) 01:35:420247デフォルトの名無しさん
2008/06/05(木) 01:37:180248デフォルトの名無しさん
2008/06/05(木) 01:38:47以前こんなコードみた
int split_tsv(char ****split,char *filename);
【仕様】
タブ区切り文字列のみで構成されるテキストファイルを読み込み
を文字列配列の配列に変換。 char ***(ポインタ変数)をsplitに参照渡しする。
(sはNULL不可) 戻り値は、行数.
こういったコード、ちょっとやればすぐに出てくるけど、これって初心者向けか?
初心者には絶対に弄らせたくないコードだよな。
構造型プログラミング言語の黎明期の時代に、多くのプログラミング言語(特に
PASCAL)が型の概念を導入したんだが、実プロジェクトに投入したら中間型が乱造
されてしまい名前空間管理が極度に困難になって開発が大停滞してしまった。
このことの反省を十分に取り入れたのがCなんだが、
型の概念を徹底的に学んでない初心者がCで上のようなコーディングをしなければな
らないんだとあせるのは、危険きわまりない。とは家、中間型(作業型)の問題も実
にやっかい。
この世界は、やはり余り普通の人が入ってくる世界じゃないよ。
0249デフォルトの名無しさん
2008/06/05(木) 01:51:40きめぇ
0250デフォルトの名無しさん
2008/06/05(木) 02:12:04自分ならそこまでやるなら多段の構造体に仕込んじゃうかも…つーかC++(略
0251デフォルトの名無しさん
2008/06/05(木) 02:19:31ソースAのような表記ではそもそも「error C2446: '==' : 'const char *' 型から 'int' 型への変換ができません。」が発生しコンパイルが通らず、
ソースBのような表記では、1文字ではなく、文字列全てを読んでしまって、if分岐に入ってくれません。
使用しているOSはWindowsXPHome, 使用しているコンパイラはVisual Studio 2005 Academic Editionです
どなたかご教授いただけないでしょうか
ソースA)
char tmp[8];
strcpy(&tmp[0], "11111000");
if (tmp[0] == "1")
{
...
}
if (tmp[1] == "1")
...
if (tmp[7] == "1")
{
...
}
0252デフォルトの名無しさん
2008/06/05(木) 02:20:02char tmp[8];
strcpy(&tmp[0], "11111000");
if (strcmp(&tmp[0], "1") == 0)
{
...
}
if (strcmp(&tmp[1], "1") == 0)
...
if (strcmp(&tmp[7], "1") == 0)
{
...
}
0253デフォルトの名無しさん
2008/06/05(木) 02:23:150254デフォルトの名無しさん
2008/06/05(木) 02:27:21if (strcmp(&tmp[0], '1') == 0)
{
...
}
とした場合は、下記のエラーが出てしまいます・・・
error C2664: 'strcmp' : 2 番目の引数を 'char' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
0255デフォルトの名無しさん
2008/06/05(木) 02:27:59tmp[n] == '1' って事を言っているんだろう
0256デフォルトの名無しさん
2008/06/05(木) 02:31:010257デフォルトの名無しさん
2008/06/05(木) 02:33:55おお、コンパイルも通り、動いてほしい動作もしてくれました!
ありがとうございました!
…よろしければなぜ通ったのか、っていうか"1"、'1'の違いは何なのか、お時間があればお教えくださいませんか
0258デフォルトの名無しさん
2008/06/05(木) 02:36:15入門サイトの、それについての解説が載っているページへのリンクや、
ググルキーワードでもお教えいただければ…
0259デフォルトの名無しさん
2008/06/05(木) 02:38:150260デフォルトの名無しさん
2008/06/05(木) 02:40:05'1' は 1バイトの文字コード(要するに数値)になる
まあ>>236
0261デフォルトの名無しさん
2008/06/05(木) 02:40:321\0 (\0:ヌル文字)
となって先頭の1の部分のアドレスが入る
'1'だとそのままの文字が入る
あと8文字入れたいなら\0まで考えて
tmp[9]取っときなさい
0262デフォルトの名無しさん
2008/06/05(木) 02:43:59恐縮です
独学の偏った順番で勉強しているからだと思います…
>>260
ありがとうございます!
文字列処理も場数ということで…
気を引き締めて使用していきたいと思います
0263デフォルトの名無しさん
2008/06/05(木) 02:47:02あー、自分の手元のソースの方ではヌル文字を意識した配列していたのですが…
問題点を抽出化したサンプルを作成する際に、手落ちしてしまったみたいです…
ようするに、まだヌル文字分まで意識して文字列配列を宣言することを、意識しなれていない、ということですね
繰り返さないように精進します
ありがとうございました!
0264デフォルトの名無しさん
2008/06/05(木) 02:51:37'1' は文字定数である。
Cでは文字はすべてそのマシン上での文字セットに対応する整数値と等価である。
そしてこれが通常 char 型の変数に格納される。
連続したchar 型からなるデータ領域に任意の文字の値を並べて格納し、
最後にヌル文字( '\0' )を加えたものが文字列と呼ばれるデータ構造である。
文字列は通常、その先頭の文字へのポインタを使って操作される。
配列の場合はその配列名が先頭の文字へのポインタに変換されるので、
つまり大抵の場合は文字列を格納した配列の名前を使って文字列を操作する。
この場合、配列 tmp に文字列を格納し、tmp という名前を通じて操作しようとしている。
"1" は「文字列リテラル」と呼ばれる、固定の文字列である。
コード上では配列名同様に '1' へのポインタに変換される。
コンパイラによる自動的な変換がある限られた場合を除き、
どんなときも == 演算子で互いに比較する対象は
「同種の」データオブジェクトでなければならない。
この場合 tmp[0] は char 型つまり整数型であるのに対し、
"1" はその文字列リテラルの先頭を指すポインタ型であるから
正しく比較できるわけがない。文字定数 '1' を使え。
0265デフォルトの名無しさん
2008/06/05(木) 02:52:32経験は絶対的に必要だが、努力や熟練とは異質の世界だなと最近痛感。
足を洗うヨテイ
0266デフォルトの名無しさん
2008/06/05(木) 02:56:02if (tmp[0] == "1"[0])
とか
if (tmp[0] == *"1")
でもコンパイルが通らない事は無いがオススメはしない
文字列が指すのがポインタってのはこれが一番わかりやすいかも?
0267デフォルトの名無しさん
2008/06/05(木) 02:58:040268デフォルトの名無しさん
2008/06/05(木) 03:06:25趣味で好きな方を選べばいいと思う
0269デフォルトの名無しさん
2008/06/05(木) 03:12:41Cでは変更不能なポインタ変数というのが無い(C++ではある)から。
仮に実際にそうであっても、変更不能なポインタ変数であるとtmpをコード上で見なすこと
はしないほうがいい。
*(tmp++)とか書けないだろ?だからポインタ変数とまぎわらしい書き方はしないほうがいい。
char配列をchar*型引き数に渡す場合は、(char*)&(tmp[0])とか(char*)&tmpというキャスト
をして値渡し(アドレス値は、ポインタ変数にアサイン可能)する。
0270デフォルトの名無しさん
2008/06/05(木) 03:30:10食っていくだけなら経験があればいい
腕を上げるには努力や熟練よりも好奇心が必要
と、八半世紀(ってなんだ)くらい思い続けてるんですがどうですか
0271デフォルトの名無しさん
2008/06/05(木) 08:09:27なに、すべてはお金のため。あなたもその年になれば嫌でも理解するでしょう。
0272デフォルトの名無しさん
2008/06/05(木) 09:42:19高校時代の数学の成績を聞いて一言返すだけのプログラムなんですが
seisekiがどんな値でも返事が「苦手なんすね」になります
どうしたら成績に合った返答ができるようになりますか?
どうやらこのスレで自分の質問だけかなり低レベルなようですがよろしくお願いします
#include <stdio.h>
int func ( int );
int seiseki ;
int main ( void )
{
printf("高校時代の数学の成績は5段階評価で言うと大体どのくらいでした? :");
scanf("%d",&seiseki);
switch(func(seiseki)) {
case 1 : printf("苦手なんすね\n"); break;
case 2 : printf("普通っすね\n"); break;
case 3 : printf("得意なんすね\n"); break;
default: printf("え?\n");
}
return 0;
}
int func ( int seiseki )
{
if(seiseki == 1 || 2) return 1 ;
if(seiseki == 3) return 2 ;
if(seiseki == 4 || 5) return 3 ;
else return 4 ;
}
0273デフォルトの名無しさん
2008/06/05(木) 09:45:46{
if(seiseki == 1 || seiseki == 2) return 1 ;
if(seiseki == 3) return 2 ;
if(seiseki == 4 || seiseki == 5) return 3 ;
else return 4 ;
}
if ( seiseki == 1 || 2 )
だと、seiseki == 1 もしくは 真(0以外) になるから
必ず真になってしまって条件の意味が無い
0274デフォルトの名無しさん
2008/06/05(木) 09:46:15>if(seiseki == 1 || 2
if(seiseki == 1 || seiseki == 2
0275デフォルトの名無しさん
2008/06/05(木) 09:48:14即レスありがとうございます!
引数とかの問題じゃない初歩的な間違いだったんですね・・・
0276デフォルトの名無しさん
2008/06/05(木) 11:22:54正しく理解していれば混同することなどナイヨ
そんな冗長なキャスト使うほうが読んでて知識を疑うわ
0277デフォルトの名無しさん
2008/06/05(木) 12:00:54もし君が配列名をポインタ値として扱うべきでないと真剣に考えるなら、
tmp の要素にアクセスするあらゆる場所で ((char *)&tmp)[0] のように書くべきである。
しかし前スレで書いたように、C規格はそのような冗長な書き方を避けるために、
配列はその先頭要素へのポインタ値に成り下がるという動作を規定した。
規格を正しく理解するかぎり、tmp[0] という書き方はまったく正当で安全である。
理解しないならどのような書き方をしたとて遅かれ早かれ間違いを起こすだろう。
1から10までアセンブラを叩くようなものの考え方を押し通すまえに、
高級言語というものがそもそも何のためにあるかを考え直すこと。
0278デフォルトの名無しさん
2008/06/05(木) 12:35:410279デフォルトの名無しさん
2008/06/05(木) 12:41:45俺も、アセンブラから始めて、pascal C++と4半世紀歩んできたが、今C++&boostで面白さが更に拡大してきた。これで10年は戦えそうだ。
0280ロベ
2008/06/05(木) 13:34:30・BMPファイルの画像を上下・左右反転させる
・BMPファイルの画像を回転させる
・BMPファイルのカラー画像をグレースケール化する
式 Y=0.298912*R+0.586611*G+0.114478*B
・Windows形式とOS/2形式どちらにも対応できるようにする
このようなプログラムを作りたいのですが
ネットで調べてもほとんど参考になるものを見つけれませんでした
どこか参考にできるHPなどありますかね?
0281デフォルトの名無しさん
2008/06/05(木) 13:47:27BMPファイルのフォーマット解説
http://www.kk.iij4u.or.jp/~kondo/bmp/
0282デフォルトの名無しさん
2008/06/05(木) 13:49:230284デフォルトの名無しさん
2008/06/05(木) 14:52:45struct hoge __attribute__((aligned(16))) hogehoge[] =
{
{-0.53878,5.12228,-0.46578},
{-0.53878,5.62244,-0.05845},
{-0.53878,5.12228,-1.13112},
{-0.53878,6.47772,-0.82431},
{-0.53878,6.55215,-0.05845},
・
・
}
とソースに組み込んできた情報が肥大してきたので
ファイルから読み込む予定なんですが
16バイト区切りで読み込みに必要なメモリをmalloc
させる方法ありますでしょうか?
0285デフォルトの名無しさん
2008/06/05(木) 15:21:060286デフォルトの名無しさん
2008/06/05(木) 15:23:30UNIX系だとmemalign()とかposix_memalign()があるかもしれない。
VC++だと_aligned_malloc()というのがあるかもしれない。
malloc()を使っても簡単にできますけどね。
0287デフォルトの名無しさん
2008/06/05(木) 15:25:42大きめに取って自分で境界調整するしかなかった気がする
なんにせよ処理系に依存する話
0288284
2008/06/05(木) 15:27:59マジっすかorz
>>286
>UNIX系だとmemalign()とかposix_memalign()があるかもしれない。
>VC++だと_aligned_malloc()というのがあるかもしれない。
ちょっと調べてみます。
ちなみにCygwin + gcc 環境での開発になります。
>malloc()を使っても簡単にできますけどね。
これで思いついたのが、実際に必要なサイズ+16バイトでmallocで
確保した上でアドレスを16バイト区切りになるようにずらすというのもいけそうですかね?
0289デフォルトの名無しさん
2008/06/05(木) 15:34:37>確保した上でアドレスを16バイト区切りになるようにずらすというのもいけそうですかね?
freeするときに元のアドレスに戻すのを忘れないように
0290デフォルトの名無しさん
2008/06/05(木) 15:41:13確保した領域の先頭を指すポインタと実際に使う領域の先頭を指すポインタを別に用意したほうがいいかも
0291デフォルトの名無しさん
2008/06/05(木) 15:42:59そうですね。
>>290
ポインター2個の予定です。
こういうケースのアドレスのずらし方がわからないorz
0292デフォルトの名無しさん
2008/06/05(木) 15:49:58基本的には整数値として見たときに
16の倍数になるように後ろにずらせばいいんじゃないの?
0293デフォルトの名無しさん
2008/06/05(木) 16:07:58だからtmpは定数を表すマクロシンボルじゃないんだって。Cでは予約語や関数以外、識別子を定数と
みなすことはされない。(もしかして関数も変数なのかも知れないし)
Cでは、配列識別子は、実質ポインタ変数だよ。ただしポインタ変数として書き換え不能という属性がある。
書き換え可能なポインタ変数を、型は同じでも属性が異なるポインタ変数に値を複製する場合も、
明示的キャストが必要.本来的にはCではポインタの型(格)だけでなく変数属性にも煩いぞ。
異なる格や属性のポインタ変換が多用され、多用できるが故のメリットを享受するのに必要な当然の
危機管理文化だ。
Cは簡潔記述が目的で設計されたわけじゃない。この点、絶対誤解するな。
コードを簡潔かつ流麗にし記憶しやすくする為に、型/格/属性の相違をすべて型に吸収させいちいちそれ
にもっともらしい名前を付けることによる弊害(乱用され、乱造されるので、ちょっとしたコード書くの
にも、膨大な資料を参照しなければならなくなるハメになり、そのうち正しいコード(他人のバグに依存し
ない)を書く事すら不能になる)だけは避けたいというのが設計理念。
Cはキャストまみれの冗長記述になるのが自然だし、冗長に書いて真価を発揮する。
0294デフォルトの名無しさん
2008/06/05(木) 16:14:04ありえない
そんな思想で作られたとしたら
そもそも配列がポインタに変換される仕様が入るはずがない
0295デフォルトの名無しさん
2008/06/05(木) 16:15:46void *p = malloc(required_size + 16);
uintptr_t addr = (uintptr_t)p;
addr = (addr & ~0xf) + 16;
struct hoge *phoge = (struct hoge *)addr;
...
free(p);
0296デフォルトの名無しさん
2008/06/05(木) 16:27:30ぜんっぜん逆。
Cはそういうわずらわしさを、ある一定の原則さえ守っていれば(そこがちょっと難しいが)
環境ごとの差異にさえ捕らわれずに排除できることを目指した。
だからそれぞれの型の複雑な格上げや符号拡張や変換や比較の法則があって、
そしてそれらが 自 動 的 に 行われる。
お前さんは単にそういう原則を正確に把握していないために、
コードの実際の動きを予想することができなくて、ガチガチに規定した冗長コードを書いてしまうだけ。
0297デフォルトの名無しさん
2008/06/05(木) 16:30:30ポインタ(変数/値)に対する演算子[]が定義されてるだけ
pointer[integer_value]は無名変数(ポインタの型/属性/格に対応する型/属性/格を持つ)を
表す。
0298デフォルトの名無しさん
2008/06/05(木) 16:32:350299デフォルトの名無しさん
2008/06/05(木) 16:33:36「概念」はあるよ。
オブジェクトがないだけ。
0301デフォルトの名無しさん
2008/06/05(木) 16:43:27すくなくともこれは大間違い
配列に代入しようとしたときと
char*constに代入しようとしたときの
エラーメッセージを読めばわかるはず
配列識別子は配列全体そのものを表す
ただし一部の例外を除いてその先頭要素への
ポインタ値(変数ではなく)に変換される
だよ
0302デフォルトの名無しさん
2008/06/05(木) 16:47:00言語仕様を勝手にガチガチに規定して、それに依存したコードを書いてると後で泣きを見るかも知れません
(俺モナー)
0303284
2008/06/05(木) 16:57:47感激!!ありがとうございます。
0304デフォルトの名無しさん
2008/06/05(木) 17:10:29「うわあ、この人はすごい厳密なコードを書くんだなぁ」じゃなくて
「うわあ、この人はC言語の仕様をよく知らないんだなぁ」だ
一方で、明示的なキャストが大量に必要なコードがあったとしたら、
たぶんそれは設計に問題がある
0305デフォルトの名無しさん
2008/06/05(木) 17:14:22普通に考えてどっちであろうが
常人がコードを見たら「うわぁ…」としか思わないだろ
とか思ってしまったよ
0306デフォルトの名無しさん
2008/06/05(木) 17:16:150307デフォルトの名無しさん
2008/06/05(木) 17:29:01見たときの賢人の反応は
「うわあ、この人はC言語の仕様の良く知らない人なんだなぁ」じゃなくて
「うわあ、この人はC言語の仕様の流動的な部分に依存しない信用のおける人」だ
一方で、明示的なキャストが皆無に出来るほど、型やクラスが大量に作ってあるような
(その反面、根本改革は至難の技になる)コードは、CじゃなくてPASCAL系とかで書いた
ほうがいいんじゃないかという気がする。
というのは独り言
0308デフォルトの名無しさん
2008/06/05(木) 17:32:400309デフォルトの名無しさん
2008/06/05(木) 17:36:420310デフォルトの名無しさん
2008/06/05(木) 17:49:44>特定のコンパイラは文句を言わないだけで本当は必要なキャスト
具体例plz
0311デフォルトの名無しさん
2008/06/05(木) 17:59:54そうじゃないところは面倒なのでスルー
そんな俺
0312デフォルトの名無しさん
2008/06/05(木) 18:29:04int b = a << 8;
こんな感じのプログラム書いてはまったことならあるな
格上げって処理系依存なんだっけ?
0313デフォルトの名無しさん
2008/06/05(木) 18:36:33それでどんな風にはまったの?
その例じゃ出ないけど符号拡張?
0314デフォルトの名無しさん
2008/06/05(木) 18:37:120315デフォルトの名無しさん
2008/06/05(木) 18:43:32VCだと512が求まるんだがとある環境だとキャストしないと0になった
0316デフォルトの名無しさん
2008/06/05(木) 19:04:06typedefされてたのintじゃなくてlongだったような
勘違いスマソ >>312は忘れて下さい
そりゃキャスト必要だよな
0317デフォルトの名無しさん
2008/06/05(木) 19:17:05いいと思うような...
int m;
double d;
d=(double)m;
とかね。このコードをint変数をdouble変数にキャストするコードとは言わず、int値をdouble値に
型変換してアサインすると言って欲しい。本当は別の書式にしたいんだろうな。設計者は。
0318デフォルトの名無しさん
2008/06/05(木) 19:19:02キャストと型変換はまったく違うものなのか?
0319デフォルトの名無しさん
2008/06/05(木) 19:25:43dynamic_cast
static_cast
reinterpret_cast
const_cast
0320デフォルトの名無しさん
2008/06/05(木) 19:53:14を使う場合は、使う場所すべてに、わかるようにコメントを入れておくのが後々のことを考えると
ベターかと。(書式は一般的なキャスト演算子にするしかないが)
コンパイラが変るだけでも影響してくる可能性があるし...
0321デフォルトの名無しさん
2008/06/05(木) 20:11:45int fibo_stack( int n )
{
int f =0;
push(n);
while(!empty())
{ n = pop();
if( n==0 ) f+=0;
if( n==1 ) f+=1;
if( n>=2 ) {push( n-1); push( n-2);};
show()
};
return f;
}
の振る舞いにつて説明する問題なのですが、f+=0やf+=1で何が行われているのか解りません。
スタック内部に影響するのでしょうか。ご教示ください。
0322デフォルトの名無しさん
2008/06/05(木) 20:13:40f = f + 1;
0323デフォルトの名無しさん
2008/06/05(木) 20:13:51f = f + 1
の略
0324デフォルトの名無しさん
2008/06/05(木) 20:16:47説明不足ですいません
0325デフォルトの名無しさん
2008/06/05(木) 20:19:010326デフォルトの名無しさん
2008/06/05(木) 20:23:39本質的な動作は同じである。
キャストは型変換演算子であって、元の型の値をもとにして
指定したデータ型の右辺値を生み出す。ポインタかそうでないかは関係ない。
単に型変換という場合は、コンパイラによって自動的に行われるものを言う場合が多い。
たとえば>317のコードで言えば d=m; と書いた場合である。
(double) のキャストをつけようとつけまいと、コードのやることは変わらない。
0327デフォルトの名無しさん
2008/06/05(木) 20:27:00n=4の場合
4
_
3 2
3
3 1 0
3 1 f=0
3 f=1
_
2 1
2 f=2
_
1 0
1 f=2
_ f=3
となるのですがこのfが何なのか解りません
0328デフォルトの名無しさん
2008/06/05(木) 20:31:54全部貼れ
0329デフォルトの名無しさん
2008/06/05(木) 20:32:560330デフォルトの名無しさん
2008/06/05(木) 20:32:57これで全部です
0331デフォルトの名無しさん
2008/06/05(木) 20:36:22フィボナッチ数列ならf(0) f(1)は固定でいれなきゃじゃない?
0332デフォルトの名無しさん
2008/06/05(木) 20:36:25なら答えはひとつしかない
「わからない」
fの値がなんになるかはnの値のほかpush()、pop()、empty()、show()の仕様に依存する
fの値がどう使われるかはこの関数を呼んだ場所のコードに依存する
つまりこの関数だけ見せられてfがなにものであるか答えられるわけがない
0333デフォルトの名無しさん
2008/06/05(木) 20:38:12少なくともこのままコンパイルにかけたら構文エラーだな
0334デフォルトの名無しさん
2008/06/05(木) 20:38:51それであってるし0から始まるフィボナッチ数列の四番目は3だからおk
0335デフォルトの名無しさん
2008/06/05(木) 20:45:03pop()はポップしてその値を返す、
empty()はタックが空かどうか判定する、
show()は現在のスタック内表示です
0336デフォルトの名無しさん
2008/06/05(木) 20:46:54fはスタックとは別のところで計算されてると考えてよろしいんでしょうか?
0337デフォルトの名無しさん
2008/06/05(木) 20:47:18{
vector<int> x;
int f =0;
x.push_back(n);
while(!x.empty()) {
n = x.back();
x.pop_back();
if( n==0 ) f+=0;
if( n==1 ) f+=1;
if( n>=2 ) {x.push_back( n-1); x.push_back( n-2);};
}
return f;
}
極普通のスタックだと思うのですが因縁つけてくる人が多いので
C++になっちゃいますが動くようにしました。
引き続きお答え願います
0338デフォルトの名無しさん
2008/06/05(木) 20:49:070339デフォルトの名無しさん
2008/06/05(木) 20:49:440340デフォルトの名無しさん
2008/06/05(木) 20:55:23スタックを計算する上で必要な事なんでしょうか
0341デフォルトの名無しさん
2008/06/05(木) 21:03:35http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0
0342デフォルトの名無しさん
2008/06/05(木) 21:09:37ずっとスタック内に影響するものだと思ってました。
ありがとうございました。
0343デフォルトの名無しさん
2008/06/05(木) 21:10:51そこが意図のはずだが
0344デフォルトの名無しさん
2008/06/05(木) 21:11:56どっちかっつーと数学板の仕事だし…
実用でこんなタコなアルゴリズム書いたら殴られるわ
0345デフォルトの名無しさん
2008/06/05(木) 21:12:140346デフォルトの名無しさん
2008/06/05(木) 21:14:470347デフォルトの名無しさん
2008/06/05(木) 21:17:10こんなことやる意味がそもそもあるのかと思うけど
0348参考
2008/06/05(木) 21:28:29呼ばれるかを計測するプログラム。奇しくもこれはフィボナッチ数列そのものを与えるという
トリック
unsigned int fib(unsgined int n){
static unsigned int m=0;
static unsigned int result=0;
if(m==0)
m=n;
if(n<=1)
result++;
else{
fib(n-1);
fib(n-2);
}
if(m==n)
return result;
}
(この関数は1回しか呼び出せないのがイタいが)
0349参考
2008/06/05(木) 21:33:06unsigned int fib(unsgined int n){
static unsigned int result=0;
if(n<=1)
result++;
else{
fib(n-1);fib(n-2);
}
return result;
}
0350デフォルトの名無しさん
2008/06/05(木) 21:33:080351デフォルトの名無しさん
2008/06/05(木) 21:35:29大学院とか行って研究するやつなんてすくないんだからもうちょっと実用的
な問題だせよ。
昨日もBMPの読み込みとかなかったっけ?
0352デフォルトの名無しさん
2008/06/05(木) 21:40:150353デフォルトの名無しさん
2008/06/05(木) 21:46:10キャストは左辺値にも出来ますが何か?
char *p;
void *q;
(char*)q=p;
0354デフォルトの名無しさん
2008/06/05(木) 21:48:420355デフォルトの名無しさん
2008/06/05(木) 21:49:57それはだめじゃないのか?
0356デフォルトの名無しさん
2008/06/05(木) 21:51:39間違いである。少なくともANSI/ISO規格の保証する動作ではない。
0357デフォルトの名無しさん
2008/06/05(木) 22:00:43fgetsした後にsscanfでバラバラにして
フィールド毎にprintfで表示したいんだが
うまくsscanfでバラせてないみたい・・・
AAAAA
BBB
CCCC
こうなって欲しい。
入力ファイル(固定長5、3、4の3フィールドからなる)
AAAAABBBCCCC
0358デフォルトの名無しさん
2008/06/05(木) 22:01:140359デフォルトの名無しさん
2008/06/05(木) 22:04:01それって区切りになる文字が無いから失敗するんじゃないの?
0360デフォルトの名無しさん
2008/06/05(木) 22:04:15sscanf(s, "%5s%3s%4s", a, b, c);
これで済まないのか?
0361デフォルトの名無しさん
2008/06/05(木) 22:06:17だから>>331でフィボナッチだっつってんじゃん
関数名見ても分からないとか大丈夫か?
0362デフォルトの名無しさん
2008/06/05(木) 22:07:53ばらせてるけどNULL終端じゃないから残りが出てるだけに5ペリカ
0363デフォルトの名無しさん
2008/06/05(木) 22:07:54まーそういうなって。
初めてのころは「自分が何にはまってるかそれがわからない」
ということもあるよ。
あることをきっかけにどんどん進むのさ・・・
0364デフォルトの名無しさん
2008/06/05(木) 22:10:260365デフォルトの名無しさん
2008/06/05(木) 22:10:344.5
質問:charのポインタがあって、そのポインタがたまたまintを指していた。
intの次へポインタを進めたい。なぜ以下の式ではうまくいかないのか。
((int *)p)++;
回答:C言語でキャスト演算子は「ビット列が別の型を持っているふりをして、
そういう風に扱ってやろう」ということを意味しているわけではない。
キャストは変換演算子であって、それは右辺値を生みだすと定義されている。
右辺値であるとするなら、代入することも++で足し算することもできないことになる
(古いコンパイラやgccの拡張機能が上のような式を受け付けることは例外である)。
References: K&R2 §A7.5 p.205 / ANSI §3.3.4(とくに注14) / ISO §6.3.4 / Rationale §3.3.2.4 / H&S §7.1 pp.179-80
0366デフォルトの名無しさん
2008/06/05(木) 22:28:22再解釈可能なものについては再解釈し、そうでないものは絶対に通さないというのが
基本だったのだが...
いつのまにやら処理系に依存する話になってしまった。
0367デフォルトの名無しさん
2008/06/05(木) 22:55:01*(char**)&q=p;
そもそもvoid *へ/からの変換はキャストが不要なのでこの例なら
q=p;
でよい。
0368デフォルトの名無しさん
2008/06/05(木) 22:55:55+ 明示的なキャストが不要なので
0369デフォルトの名無しさん
2008/06/05(木) 22:56:400370デフォルトの名無しさん
2008/06/05(木) 22:58:000371デフォルトの名無しさん
2008/06/05(木) 22:58:400372デフォルトの名無しさん
2008/06/05(木) 23:00:54というか、不完全型の配列型は存在しない。
0373デフォルトの名無しさん
2008/06/05(木) 23:01:330374デフォルトの名無しさん
2008/06/05(木) 23:02:230375デフォルトの名無しさん
2008/06/05(木) 23:06:05仮引数に限ってT**とT*[]は同じ。T[][]はT[]が不完全型だから許されない。
0376デフォルトの名無しさん
2008/06/05(木) 23:07:390377デフォルトの名無しさん
2008/06/05(木) 23:20:18-> の結果は左辺値になりうる。
0378デフォルトの名無しさん
2008/06/06(金) 00:04:07(普通の1次元配列を工夫して使って)
0379デフォルトの名無しさん
2008/06/06(金) 00:07:57int main(int argc, char argv[][])
0380デフォルトの名無しさん
2008/06/06(金) 00:08:46悪い例ですね、わかります
0381デフォルトの名無しさん
2008/06/06(金) 02:21:47分からないところがあったので質問します
・mallocで確保したメモリは、プログラムの終了と同時に解放されることは保証されているのか
・関数内でmallocで確保したメモリは関数が終了しても解放されず、
別の関数から参照できることは保証されているか
両方、正常に動くことは確認できたのですが、あらゆる環境・状態で成り立ちますか?
0382デフォルトの名無しさん
2008/06/06(金) 02:25:13・別の関数にアドレスを渡せばそりゃ参照できる
0383デフォルトの名無しさん
2008/06/06(金) 02:25:20Cの規格では保証されてない、プログラム終了後の処理はOS頼み
ただし、間違いなく解放されると思って問題ない。(されないOSが昔あるにはあったが)
二番目は保証されてる、こっちはそう決まってる
0384デフォルトの名無しさん
2008/06/06(金) 02:27:490385デフォルトの名無しさん
2008/06/06(金) 04:34:47#include <stdio.h>
#include <stdlib.h>
void main(){
int a[25];
int i,j;
for(i=0;i<25;i++){
a[i] = rand()%25+1;
for(j=0;j<i;j++){
if(a[j]==a[i]){
a[i] = rand()%25+1;
j=0;
}
}
printf("a[%d]は%dです。\n",i,a[i]);
}
}
↑のは
a[0]〜a[24に]1〜25の乱数を生成し、且つどれも一致しないというモノなんだけど
乱数が何度やっても決まった値しかでないんだけどどうすればいいのかな?
あと、j=0;とかやってたりソースかなり読みにくいので、訂正などあったらガンガンお願いしますmm
その際解説もつけてくれるとありがたいです
0386デフォルトの名無しさん
2008/06/06(金) 04:37:29srand(unsigned)time(NULL));
を足す
0387デフォルトの名無しさん
2008/06/06(金) 04:37:53srand((unsigned)time(NULL));
ね
0388デフォルトの名無しさん
2008/06/06(金) 04:46:41乱数発生させるには最初に種みたいなのが要るんだけど
srand((unsigned)time(NULL));
はプログラムを実行させた時の現在時刻を拾ってきて
それを種にするように設定する関数なわけ
>>385のプログラムだと何もして無いのでsrand(1);
と設定した事とみなされて
常に同じ乱数が生成されてるのよ
0389デフォルトの名無しさん
2008/06/06(金) 06:06:42system("hoge")で起きたコマンドの結果を文字配列に格納したい場合、何かいい方法は無いですかね?
コマンドライン上ならls > fileで一発なのに・・・orz
0390側近中の側近 ◆0351148456
2008/06/06(金) 06:21:52(っ´▽`)っ
popen, pclose
標準ライブラリ関数ではないが、unix系OSだと使える。
0391デフォルトの名無しさん
2008/06/06(金) 06:29:17感謝。さっそく調べて試してみるっすー。
0392デフォルトの名無しさん
2008/06/06(金) 08:34:52まあmallocも関数でvoid*ではあるけどポインタ返ってくるよね?
0393デフォルトの名無しさん
2008/06/06(金) 10:48:52#include <float.h>
int main(void)
{ float f;
double x;
long double ld;
printf("\nTesting the precision of float, double, and long double : \n");
f = 1.0f + 1.0e-7;
printf(" 1.0 + 1.0e-7 = %.10f\n", f);
f = 1.0f + 1.0e-8;
printf(" 1.0 + 1.0e-8 = %.10f\n", f);
x = 1.0l + 1.0e-15;
printf(" 1.0 + 1.0e-15 = %.20lf\n", x);
x = 1.0l + 1.0e-16;
printf(" 1.0 + 1.0e-16 = %.20lf\n", x);
ld = 1.0L + 1.0e-19;
printf(" 1.0 + 1.0e-19 = %.30Lf\n", ld);
ld = 1.0L + 1.0e-20;
printf(" 1.0 + 1.0e-20 = %.30Lf\n", ld);
printf("\nThe experiment above is explained by constants from float.h :\n");
printf(" precision of float : %e\n", FLT_EPSILON);
printf(" precision of double : %.15le\n", DBL_EPSILON);
printf(" precision of long double : %.30Le\n", LDBL_EPSILON);
return 0; }
表示された結果のうち、
1.0 + 1.0e-7 が 1.0000001 にならず、同様に
1.0 + 1.0e-15 が 1.000000000000001 にならず、
1.0 + 1.0e-19 が 1.0000000000000000001 という、きれいな数にならない理由を、FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON との関係から説明してもらえないでしょうか。
よろしくお願いします。
0394デフォルトの名無しさん
2008/06/06(金) 11:07:42自分で考えるヒントが欲しいなら、まずそこに出てくる制限定数の意味やIEEE浮動小数点数フォーマットについて調べること
0395デフォルトの名無しさん
2008/06/06(金) 11:33:43ありがとうございます。
0396デフォルトの名無しさん
2008/06/06(金) 12:42:40学科の出席簿作成。
15人分の学生を表示し、入力により内容を変動させる。
表示順番:
出席表
<入力>学生番号0〜14
<入力>曜日番号0〜6
<入力>時限番号0〜3
<入力>出欠番号0〜1
<入力>学生番号0〜14の時に99を入力するとプログラム終了。
誰かこの問題教えてください。
0397デフォルトの名無しさん
2008/06/06(金) 12:44:01氏ね
0398デフォルトの名無しさん
2008/06/06(金) 12:59:39/* stdio.h をインクルード */
int main(void)
{
/* 必要な変数を宣言し、出席簿の初期値を設定 */
/* 学生番号を入力から一時変数に取り込み、それが妥当な値である間、以下の処理を繰り返す */
{
/* 曜日を入力から一時変数に取り込み、もし妥当な値でなければエラーメッセージを表示して continue する */
/* 時限を入力から一時変数に取り込み、もし以下略 */
/* 出欠を入力から以下略 */
/* 入力された一時変数の値を出席簿に反映する */
/* 出席簿の現在の内容を表示する */
}
return 0;
}
0399デフォルトの名無しさん
2008/06/06(金) 13:02:11親切そうに見せて性格悪いなお前
0400デフォルトの名無しさん
2008/06/06(金) 13:23:10int book[15][7][4]={0};
まあcharにするほどのサイズではあるまい
0401デフォルトの名無しさん
2008/06/06(金) 13:23:580402デフォルトの名無しさん
2008/06/06(金) 13:25:400403デフォルトの名無しさん
2008/06/06(金) 13:28:03必要な変数ってこれでいい?
データ形式:
(一人分のデータ)
学生番号<int>
名前<char*>
性別<char*>
曜日番号<int[]>
時限番号<int[]>
出欠番号<bool>
変更番号<bool>
0404デフォルトの名無しさん
2008/06/06(金) 13:30:250405デフォルトの名無しさん
2008/06/06(金) 13:31:020406デフォルトの名無しさん
2008/06/06(金) 13:32:380407デフォルトの名無しさん
2008/06/06(金) 13:34:00struct{
char name[NAMELEN_MAX];
int sex;
int attend[7][4];
}student[15];
ってとこか
0408デフォルトの名無しさん
2008/06/06(金) 13:38:20学生番号は不要。要素15の配列の添字で扱えば済む。
名前は動的割付するほど大きなデータじゃない。適当な大きさの配列で十分。
性別は整数でいい。男か女かそれ以外しかないのだから。
曜日、時限、出欠を別々に宣言しても意味がない。多次元配列を使え。
Cにbool型は無い。メモリを節約したいならchar型を使え。
変更番号ってなんだ説明しろ。
0409デフォルトの名無しさん
2008/06/06(金) 13:41:19そこは NAMELEN_MAX+1 にしとけよ
一応
0410デフォルトの名無しさん
2008/06/06(金) 13:45:44退学とかで、欠番の可能性は?
0411デフォルトの名無しさん
2008/06/06(金) 13:47:18問題の前提が番号は0〜14まで15人ってなってる
0412デフォルトの名無しさん
2008/06/06(金) 13:47:400413デフォルトの名無しさん
2008/06/06(金) 13:48:43>名前は動的割付するほど大きなデータじゃない。適当な大きさの配列で十分。
初期化したあと変更しないならconstポインタのほうがいいんじゃね?
0414デフォルトの名無しさん
2008/06/06(金) 13:52:11話はそれからだ
0415デフォルトの名無しさん
2008/06/06(金) 14:03:480416デフォルトの名無しさん
2008/06/06(金) 14:06:500417デフォルトの名無しさん
2008/06/06(金) 14:07:31おいおいそこから教えなきゃいけないのかよ
もう一回最初から本を読み直せ
0418デフォルトの名無しさん
2008/06/06(金) 14:10:57素直に全く分かりませんって言えよ
0419デフォルトの名無しさん
2008/06/06(金) 14:14:51MinGWとVC++でDLL連携をしようと思って下記みたいなソース書いたんだ。
GeoOpen関数に「1」を渡してるのに
返ってくる値は何故か「63」。
printfで出力される値も「63」。
なんぞこれー
DLL作成側cpp(MinGW)
extern "C" __declspec(dllexport) int __stdcall GeoOpen(string strLicence, string strGeoDBDir, string strNormalize, int intA) {
printf("%u", intA);
return intA;
}
DLL呼び出し側cpp(VC++)
// GeoOpen関数のポインタ取得
GEOOPEN geoOpen = (GEOOPEN)GetProcAddress(hGEOCODERDLL, "GeoOpen@16");
int testInt = 1;
// GeoOpen関数のポインタ取得成功
if (geoOpen != NULL)
{
// GeoOpen関数呼び出し
int intRes = (*geoOpen)(strLicence, strGeoDBDir, strGeoDBDir, testInt);
}
0420デフォルトの名無しさん
2008/06/06(金) 14:15:340421デフォルトの名無しさん
2008/06/06(金) 14:17:05「そんなの問題に書いてないじゃないですか」で押し通せるならしなくていい
常識的にはする
0422デフォルトの名無しさん
2008/06/06(金) 14:17:13MinGWとVC++のstd::stringの内部構造が異なるんじゃないのかたぶん
0423デフォルトの名無しさん
2008/06/06(金) 14:19:510424デフォルトの名無しさん
2008/06/06(金) 14:28:13試しにintを第一引数にしたらちゃんと1が返ってきたよ。
stringが邪魔してたのか、、、これは気づかなんだ。
サンキュー助かった。
>>423
あぁC++はスレチか。すまん
0425デフォルトの名無しさん
2008/06/06(金) 14:28:58クラスで渡したければCOM使うしかない。
0426デフォルトの名無しさん
2008/06/06(金) 14:35:160427デフォルトの名無しさん
2008/06/06(金) 14:37:390428デフォルトの名無しさん
2008/06/06(金) 15:48:130429デフォルトの名無しさん
2008/06/06(金) 21:35:24関数の中で正常に表示される文字配列が、関数の外だと化けるんですよ!
何が原因なのでしょうか?お手上げです。どなたかどうか、教えてくださいm(_ _)m
0430デフォルトの名無しさん
2008/06/06(金) 21:36:240431デフォルトの名無しさん
2008/06/06(金) 21:41:000432デフォルトの名無しさん
2008/06/06(金) 21:45:23ノードに入るkeyの値は自然数としています
現在の木に例えば3という値が入っているときにさらに3を挿入する場合は
すでに入っている3の手前と後ろのどちらに入れるかは決まっているんですか?
0433デフォルトの名無しさん
2008/06/06(金) 21:49:140434デフォルトの名無しさん
2008/06/06(金) 21:54:38文字配列はmainで宣言していて、関数の中では、char*型で引数宣言しています。
>>431
今携帯なので、うち帰ってからまたソースうpさせていただきますね。
すみません、また来ます。ありがとうございます。
0435デフォルトの名無しさん
2008/06/06(金) 21:57:55たぶん、その引数のポインタにstrtokの戻り値を代入してるだけだろう?
ちゃんとstrcpyしろ
0436デフォルトの名無しさん
2008/06/06(金) 22:03:51こういうことをやってないかどうか
#include <stdio.h>
void hoge(char *str)
{
str="STRING"; /* 間違い */
/* こっちが正解
strcpy(str, "STRING");
*/
}
int main(void)
{
char str[]="string";
hoge(str);
puts(str);
return 0;
}
0437デフォルトの名無しさん
2008/06/06(金) 22:04:41まてそれは大丈夫だろw
0438デフォルトの名無しさん
2008/06/06(金) 22:06:36落ち着け
0439デフォルトの名無しさん
2008/06/06(金) 22:08:22ごめんおちついた、ごめんなさい
mainみないで条件反射してしまいました・・・
0440デフォルトの名無しさん
2008/06/06(金) 22:10:46strtokの戻り値は次のstrtokの呼び出しで破壊されるから、
strdupしておくべし。
0441デフォルトの名無しさん
2008/06/06(金) 22:11:29お前も落ちつけよ
0442デフォルトの名無しさん
2008/06/06(金) 22:14:59されんされん
0444デフォルトの名無しさん
2008/06/06(金) 23:08:26for(i=0; i<25; i++) {
j = rand() % (i + 1);
a[i] = a[j];
a[j] = i + 1;
}
こうやるとムダなチェックが必要なくなるよ
0445デフォルトの名無しさん
2008/06/07(土) 00:45:330446デフォルトの名無しさん
2008/06/07(土) 02:50:52ぱっと見では、なんでうまくいくのか分からなかったけど面白い方法だ
0447デフォルトの名無しさん
2008/06/07(土) 03:23:540448デフォルトの名無しさん
2008/06/07(土) 03:49:22前方にかたよる気がするが
0449デフォルトの名無しさん
2008/06/07(土) 04:56:54前方にかたよるw
0450デフォルトの名無しさん
2008/06/07(土) 08:03:170451デフォルトの名無しさん
2008/06/07(土) 09:00:24くじ引きは最初と中間と最後のどこで引くのが有利だと思う?
0452デフォルトの名無しさん
2008/06/07(土) 09:08:43商店街のクジ引きなら最後のほうw
0453デフォルトの名無しさん
2008/06/07(土) 09:12:39当たりが1つで残りn個全部ハズレのクジとした場合、
1)引いたクジを戻す場合は常に確率は一緒
2)引いたクジを戻さない場合はそのときによる。
2)は最初に引く人はかなり確率は低いけど当たりも引ける。
後に引く人は当たりを引く確率は上がるが、最初に当たりを引かれると残りは
ハズレのみになる・・・・・
0454デフォルトの名無しさん
2008/06/07(土) 09:26:24マジで言ってる?
2)の場合
1回目は 1/n
2回目は (n-1)/n*1/(n-1) = 1/n
最初から最後まで確率は一定だよ。
0455デフォルトの名無しさん
2008/06/07(土) 10:33:49商店街とかだと当たりを前半に出すわけにはいかないから、
後半にしか入ってないことをいってるんだと思うぜwww
0456デフォルトの名無しさん
2008/06/07(土) 13:25:48for(i=0; i<N; i++) {
j = rand() % (i+1);
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
と同じ理屈だろ。
これが偏ってるとか思うヤツはセンスないな。
>>450
擬似乱数の精度の話なんかしてない
0457デフォルトの名無しさん
2008/06/07(土) 13:30:52それは違うな。
あらかじめ引く順番が決められてるなら(2)でも(1)と同じ確率になるが、
自分でいつ籤を引くか決められるなら、(1)とは異なった確率にできる。
たとえば当たり籤が一本しかなかったとして、
当籤が出るまでは誰かが籤を引くたびに当たり確率が高くなっていくが、
当たりが出た途端に当たり確率は0になる。
0458デフォルトの名無しさん
2008/06/07(土) 13:31:420459デフォルトの名無しさん
2008/06/07(土) 13:53:49マジレスすると、センスないのはお前だ。それは偏る。
<Proof>
N=3とすると、置換の可能性は3^2=27。
一方、3つの要素の並べ方は3!=6。
27/6は整数ではない。故に、偏る。q.e.d.
実際に列[0,1,2]に対して、6万回の試行をしてみると、
[0,1,2]:9063
[0,2,1]:10843
[1,0,2]:11236
[1,2,0]:11121
[2,0,1]:8719
[2,1,0]:9018
この程度のばらつきが出る。
数学的に考えれば、9000前後の数字が出ている列は、
それぞれ並べ替え方27のうち4を占めていて、
11000前後のはそれぞれ27のうち5を占めている。
正確にシャッフルしたければ、並べ替え方が6!のKnuthシャッフルを使うべし。
0460デフォルトの名無しさん
2008/06/07(土) 13:56:32j = rand() % N;
じゃなくて
j = rand() % (i+1);
になってるんだよ
0461デフォルトの名無しさん
2008/06/07(土) 13:57:15数学的には、確率を考えているか条件つき確率を考えてるかの違い。
数学vs実際の違いじゃないぞ。
0462デフォルトの名無しさん
2008/06/07(土) 14:01:54char str[] = hairetu //暗号化する文字列
int j = 0; //暗号化する文字列の現在位置
strとjが上記の場合
while(*(str+j) != ’\0’)
このwhileの条件ってどういう意味ですか
なぜ文字列に位置を示す数を加算できるのですか??
0463デフォルトの名無しさん
2008/06/07(土) 14:04:080464デフォルトの名無しさん
2008/06/07(土) 14:07:010465デフォルトの名無しさん
2008/06/07(土) 14:07:19恥ずかしいヤツw
0466デフォルトの名無しさん
2008/06/07(土) 14:08:02配列はその先頭の要素を指すポインタになるから
char str[] = ... ;
char *p = str;
while (*(p + j) != '\0')
と書くのと同じ
0467デフォルトの名無しさん
2008/06/07(土) 14:09:37>char str[] = hairetu
本当にこうか?
0468デフォルトの名無しさん
2008/06/07(土) 14:11:04char str[] = ”hairetu” //暗号化する文字列
微妙に間違いました
0469デフォルトの名無しさん
2008/06/07(土) 14:13:28最初の
char str[]
の先が文字化けしてるみたいです…
0470デフォルトの名無しさん
2008/06/07(土) 14:17:59*(p+j)によってstrの先頭アドレスにjを足したアドレス格納されてる数値を示しているということでしょうか?
0471デフォルトの名無しさん
2008/06/07(土) 14:26:49だいたいそんな感じ
p はわかりやすく入れてみただけで・・・ p を介さず直接 *(str + j) と書いても同じこと
0472デフォルトの名無しさん
2008/06/07(土) 14:29:31char str[] = "hairetu"; は char str[] = {'h','a','i','r','e','t','u','\0'} と同じ
文字列が終端になる(str[j]=='\0')まで処理を繰り返す
0473デフォルトの名無しさん
2008/06/07(土) 14:39:04char key[128] = "abc" //暗号キー
としたとき
*(str+j) + key[i++]
とすると、これはどういうことですか?
0474デフォルトの名無しさん
2008/06/07(土) 14:41:22*(str+j)
と
key[i++]
を足している
何が疑問??
0475デフォルトの名無しさん
2008/06/07(土) 14:41:420476デフォルトの名無しさん
2008/06/07(土) 15:00:48例えば*(str+1)はeですよね?
それに対してkey[i++]はa,b,cのうちのどれかだと思うんですけど
それなら文字と文字を加算するってどういうことですか?
0477デフォルトの名無しさん
2008/06/07(土) 15:04:120478デフォルトの名無しさん
2008/06/07(土) 15:06:350479デフォルトの名無しさん
2008/06/07(土) 15:08:22だいぶん前に習ったので忘れてました。。
ありがとうございました…
0480デフォルトの名無しさん
2008/06/07(土) 15:09:37文字を数値で扱う場合は変数をintにする必要はないのですか?
0481デフォルトの名無しさん
2008/06/07(土) 15:14:570482デフォルトの名無しさん
2008/06/07(土) 15:23:35ありがとうございましあ!
0483429
2008/06/07(土) 16:48:15遅くなりまして、すみません。長いですがソース↓です。
void hoge(char gyou[512], char *s1, char *s2, char *s3)
{
int cnt; /* ,の数 */
char *tp; /* 区切り文字へのポインタ */
cnt = 0;
memset( s1, 0x00, sizeof(s1) );
memset( s2, 0x00, sizeof(s2) );
memset( s3, 0x00, sizeof(s3) );
tp = strtok( gyou, "," );
while( tp != NULL ){
tp = strtok( NULL, "," );
if ( tp != NULL && cnt == 2 ){
strcpy( s1, tp );
printf("hogeの中のs1の値:%s",s1);
}else if( tp != NULL && cnt == 3 ){
strcpy( s2, tp );
printf("hogeの中のs2の値:%s",s2);
}else if( tp != NULL && cnt == 5 ){
strcpy( s3, tp );
printf("hogeの中のs3の値:%s",s3);
}
cnt++;
}
}
0484デフォルトの名無しさん
2008/06/07(土) 16:55:31http://pc11.2ch.net/test/read.cgi/tech/1211198816/226
はダメですか?N-BASICの昔からよく目にするからくりですが。
0485429
2008/06/07(土) 17:01:37{
char s1[18];
char s2[3];
char s3[21];
FILE *fp;
char gyou[512]; /* 一行のデータ */
memset( s1, 0x00, sizeof(s1) );
memset( s2, 0x00, sizeof(s2) );
memset( s3, 0x00, sizeof(s3) );
fp = fopen(fullFileName, "r")
while( fgets(gyou, sizeof(gyou), fp) != NULL ){
hoge(gyou, s1, s2, s3);
printf("hoge直後のs1の値:%s",s1);
printf("hoge直後のs2の値:%s",s2);
printf("hoge直後のs3の値:%s",s3);
}
}
で、中のファイルというのが、
'00099','あああ','123:サンプル','んんん','','2007/03/01','','',,
'タイトル1','タイトル2','タイトル3','タイトル4','タイトル5'
'00099','00001','1234123412341234',3000,'','','2008/03/31','2008/04/02 11:20:56','4','えええ'
とこんな感じに項目数も、中の文字数もまちまち。
で、たいてい、s1とs3が一文字分ズレてたり、化けてたりします。
一定の規則にしたがって並んだ行だけ処理したいんですが、項目を
入れる文字配列を、s1[]とかにすればいいんでしょうか?ひょっとして・・・
0486デフォルトの名無しさん
2008/06/07(土) 17:04:55ランダムシャッフルは >>456 が偏りも無く最も高速。
それでもう話はついてるのでもういいよ。
0487デフォルトの名無しさん
2008/06/07(土) 17:08:37#include <stdio.h>
int main(void){
int i;
int goukei, tensu[10];
int max = 0;
int min = 999;
printf("入力された点数の最高点、最低点、平均点を出力するプログラムです。\n");
puts("点数を入力してください。");
for(i = 0; i < 10; i++){
scanf("%d", &tensu[i]);
goukei += tensu[i];
if(tensu > max){
max = tensu[i];
}
else if(tensu < min){
min = tensu[i];
}
}
printf("最高点数は%d、最低点数は%d、平均は%dです。", max, min, goukei/10);
}
このような感じで、最高点数と最低点数、平均点を出力するプログラムなのですが、
.\1.cpp(18) : error C2446: '>' : 'int' 型から 'int *' 型への変換ができません。
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
.\1.cpp(18) : error C2040: '>' : 'int [10]' は 'int' と間接操作のレベルが異なります。
とエラーがでてしまいます。配列を使わなければコンパイルできるのですが・・エラーの文章を読んでもどうしてなのかがわかりません・・・
どうかご教授くださいです・・・
0488デフォルトの名無しさん
2008/06/07(土) 17:10:440489デフォルトの名無しさん
2008/06/07(土) 17:48:15if(tensu > max){
else if(tensu < min){
このtensuってtensu[i]の間違いじゃないの?
0490デフォルトの名無しさん
2008/06/07(土) 17:49:180491デフォルトの名無しさん
2008/06/07(土) 20:36:08�@goukeiは初期化されていない。
�Ascanf関数でのアドレス指定は不要。
�Bmaxとminの使い方が意味不明。特に、最大値・最小値アルゴリズム。
�C存在しない配列にアクセスしている。
0492デフォルトの名無しさん
2008/06/07(土) 21:45:07hoge() は配列 gyou に格納されている元になる文字列から2番目、3番目、5番目のトークンを切り出し、
s1 、s2 、s3 の指している先へコピーする。そこまではいい。問題は、その指している先の大きさが足りていないことにある。
この場合コピーする先は main() で宣言された s1[18] 、s2[3] 、s3[21] である。これらはメモリ上に連続して配置される。
そしてたぶん s2 に3番目のトークンをコピーしたときに、s2 の範囲を踏み越えて s3 にまで書き込んでしまった。
このとき hoge() の中で s2 を表示したときには正しくトークンが書き出される。しかし次に s3 に5番目のトークンが書き込まれる。
ここで、s3 の中にある、s2 から領域を踏み越えて書き込まれた文字列のシッポを塗りつぶしてしまった。
そうなると、全部の処理が収まって main() に戻ってきてから s1 、s2 、s3 を表示させると、当然トークンは壊れている。
文字列をコピーするときは、コピーする先の領域の大きさが十分かどうかが常に問題になる。
特に strtok() では、トークンの長さがどれだけなのか事前に予測しがたいために、さらに難しくなる。
万全に行うには、strtok() の戻り値を一旦保存した上で strlen() でトークンの長さを調べ、
必要な大きさの領域を malloc() などで割り付けて、そこにトークンをコピーする。もちろん使い終わったら free() する。
もし所定の大きさを越えたぶんは捨ててしまってもいいとするのなら、
strncpy() か strncat() か sprintf() を使って領域に入るぶんだけをコピーする。
もっとも、切り出したトークンに特段手を加えないなら、そもそも配列にコピーする必要もないかもしれない。
この場合は、単にトークンの先頭を示すポインタの値を記憶しておけばよい。
strtok() によって切り出される各トークンの本体は strtok() の中にあるのではなく、
最初の strtok() の呼び出しで第一引数に指定したポインタの指し示す先、
つまりトークンを切り出す元になる文字列( strtok() によって加工される)の中にあるからである。
ただし、そうやって切り出した一群のポインタの値を関数の外に持ち出すには、
ポインタのポインタ(ポインタの配列)を使う必要があることに注意すること。
0493デフォルトの名無しさん
2008/06/07(土) 21:50:30memset( s1, 0x00, sizeof(s1) );
memset( s2, 0x00, sizeof(s2) );
memset( s3, 0x00, sizeof(s3) );
hoge() 内にある上のコードは、きっと君が考えているだろう作業をしてくれない。
なぜならここでの s1 、s2 、s3 は、配列ではなくポインタだからである。sizeof(s?) はポインタのサイズを返す。
厳密に言えば、むしろこの処理は不要である。main() にある同様のコードも不要である。
strcpy() は、それが正しく行われるかぎり、必ずコピーした文字列の末尾にヌル文字を付加する。
あらかじめ領域を 0x00 でクリアしておく必要はない。
0494デフォルトの名無しさん
2008/06/07(土) 22:03:20職場とか、ヘンなサイトとか?
0495デフォルトの名無しさん
2008/06/07(土) 22:14:25かつて、今はもう時代遅れとなった「固定長の文字列」が使われていたことがあった。
これは、16バイトとか32バイトとかの固定長のフィールドに文字列を書き込んだもので、
それぞれの文字列の長さは最大でもそのフィールドの大きさにしかならないと決まっていた。
そして、フィールドの長さより短いときには、残りをヌル文字が埋めていた。
だから、フィールドに文字列をコピーするときは、あらかじめフィールドを全部ヌル文字で埋めてから、
フィールドの先頭から文字を入れていって、もう文字がなくなったらそこでやめるだけで済んだ。
この仕様の名残がライブラリ関数 strncpy() である。この関数は指定された長さまで文字をコピーし、
文字列の長さが足りないときにだけ、残りをヌル文字で埋める、という一風変わった動作をするが、
これがまさに上で紹介した固定長の文字列を扱うために最適な仕様であった。
そして今でも、そういう古い習慣を引きずってコードを書いているプログラマや、
そういうプログラマに教わったために意味も知らず古い習慣に従っているプログラマがいる。
既に述べたが、今となっては時代遅れであり、やがて消えていくだろう。
もっともそのときにC自体が残ってb「るかどうかは=A誰にもわからbネい。
0496デフャHルトの名無しbウん
2008/06/07(土) 22:16:17あとでメモリーダンプをするときは領域をmemset()しておくといい
ぶっ壊したところが一目瞭然
それ以外では?だな
0497デフォルトの名無しさん
2008/06/07(土) 22:36:01それは意味のあるmemsetの使い方
0498デフォルトの名無しさん
2008/06/07(土) 22:38:13それやるなら、VCのデバッグモードみたいに、フフフフ・・・で埋めるとかだな。
0で埋めるのはうまくない。
0499デフォルトの名無しさん
2008/06/07(土) 22:38:16意味がないとは言っていない。意味を知らない人間も多い時代遅れな使い方だというだけである。
0500デフォルトの名無しさん
2008/06/07(土) 22:39:27なんか福田の含み笑いみたいだなフフフフってw
0501デフォルトの名無しさん
2008/06/07(土) 22:40:33へぇー勉強になるなー
0502デフォルトの名無しさん
2008/06/07(土) 22:44:18方向が逆なだけで456と理屈は同じ
0503デフォルトの名無しさん
2008/06/07(土) 22:45:59万が一そこに IP が飛んだらブレークされる
0504デフォルトの名無しさん
2008/06/07(土) 23:14:14コードでは、とにかく使用するローカル変数は
memsetでクリアしておかないと、何が起こるかわからないし、下手すりゃ責任取らされる
ハメになるという職業上の経験から、
何はともわれ最初にmemsetの因習が生まれたモヨウ
0505デフォルトの名無しさん
2008/06/07(土) 23:17:190506デフォルトの名無しさん
2008/06/07(土) 23:21:24そもそも、memset()でクリアしてもバグ対策にならんだろ。
0507デフォルトの名無しさん
2008/06/07(土) 23:22:220508デフォルトの名無しさん
2008/06/07(土) 23:22:410509デフォルトの名無しさん
2008/06/07(土) 23:23:130510デフォルトの名無しさん
2008/06/07(土) 23:23:22もちろん根本的な解決ではないけど、なる場合もある
特に文字列の末尾をちゃんと処理しないアホな関数を呼ぶときには
0511デフォルトの名無しさん
2008/06/07(土) 23:23:32バークレーソケットのとある構造体もゼロクリアしないといけなかったような...。
0512デフォルトの名無しさん
2008/06/07(土) 23:24:03unixの職場でも、文字列のmemsetクリアが有効だって信じられてる所を見たことあるよ。
0513デフォルトの名無しさん
2008/06/07(土) 23:27:090514デフォルトの名無しさん
2008/06/07(土) 23:28:09セットする内容が0が多い場合はとりあえず
やちゃえでmemsetは使うけどそれ以外は微妙
0515デフォルトの名無しさん
2008/06/07(土) 23:28:580516デフォルトの名無しさん
2008/06/07(土) 23:29:270517デフォルトの名無しさん
2008/06/07(土) 23:31:280518デフォルトの名無しさん
2008/06/07(土) 23:33:270519デフォルトの名無しさん
2008/06/07(土) 23:34:07てめえ!!(笑
0520デフォルトの名無しさん
2008/06/07(土) 23:38:13それとも処理系定義とか未規定とか未定義でしょうか?
0521デフォルトの名無しさん
2008/06/07(土) 23:42:46でも結局のところ関数の中身はmalloc+memsetなんでしょ。
0522デフォルトの名無しさん
2008/06/07(土) 23:48:00c faqにstdinをクリアする一般的な方法はないってかかれていたから、rewind(stdin)にも移植性はないんじゃない?
0523デフォルトの名無しさん
2008/06/07(土) 23:52:040524デフォルトの名無しさん
2008/06/07(土) 23:59:52でもそもそも意味違うし。
0525デフォルトの名無しさん
2008/06/08(日) 00:04:02やっぱりそうですか
でも引数になるstreamに特に制限はないから未定義ではないと思っていいでしょうか?
>>523
いえ、読んでない文字を全て捨てたいのです
0526デフォルトの名無しさん
2008/06/08(日) 00:06:500527デフォルトの名無しさん
2008/06/08(日) 00:09:49ファイルポインタがファイルの先頭まで戻っちゃうんじゃないの?
0528デフォルトの名無しさん
2008/06/08(日) 00:10:580529デフォルトの名無しさん
2008/06/08(日) 00:11:34a == b のような 条件式は成り立った時必ず 1 が返ると思っていいんですか?
0530デフォルトの名無しさん
2008/06/08(日) 00:12:180531デフォルトの名無しさん
2008/06/08(日) 00:12:40思ってちゃダメ, 0以外の何かだと思って対処するように
0532デフォルトの名無しさん
2008/06/08(日) 00:14:22苦しんで覚えるC言語っていうサイトの内容を一通り覚えたんだけど
次何やればいい?
0533デフォルトの名無しさん
2008/06/08(日) 00:14:36おい嘘書くな
0534デフォルトの名無しさん
2008/06/08(日) 00:14:58標準入力のバッファリングの方法に依存したはず
stdinを読む関数を呼んだときにまるっとバッファリングするシステムなら
意図どおり未読の入力をクリアしてくれる
もちろん入力リダイレクトのことはまったく考慮してないが
わかってて使うぶんにはいいと思う
>531
違う
論理演算の結果は必ず0か1になると規格で決まってる
0535デフォルトの名無しさん
2008/06/08(日) 00:17:45宿題スレのあれはあんまり誉められた書き方じゃないけどな。
素直にifで分岐してったほうがいい。
0536デフォルトの名無しさん
2008/06/08(日) 00:21:58たまにそういう疑問が書き込まれるが、
正直そういう疑問が何故起こるのかが分からない。
何か作りたい物があったからプログラム勉強してんじゃないの?
それを作ればいいじゃないの。
0537デフォルトの名無しさん
2008/06/08(日) 00:22:52ありがとうございました
参考にします
0538デフォルトの名無しさん
2008/06/08(日) 00:23:53・アルゴリズム系の本を読む
・ゲームでもエディタのようなツールでもなんでもいいけど、なにかひとつまとまったものを作ってみる
(挫折してもいい)
・どう書く?.orgとか、2chの宿題スレの簡単なやつとか、短時間で組めるやつをたくさん書いてみる
このあたりを同時に。
0539529
2008/06/08(日) 00:29:17これで安心して 条件式 == TRUE という書き方が出来ます
ありがとうございました
0540デフォルトの名無しさん
2008/06/08(日) 00:29:590541デフォルトの名無しさん
2008/06/08(日) 00:33:190542デフォルトの名無しさん
2008/06/08(日) 00:34:30BOOL を返す関数が真の時に1を返すとは限らない。
そもそも、何で条件式と TRUE を比較する必要性があるんだ?
訳が分からん。
0543デフォルトの名無しさん
2008/06/08(日) 00:35:07だったら(((条件式==TRUE)==TRUE)==TRUE))==TRUEとか書けよ
0544529
2008/06/08(日) 01:41:59たまにif文の中の関数で混乱するから書いてみただけです
0545デフォルトの名無しさん
2008/06/08(日) 02:02:11理由は >>542
0546デフォルトの名無しさん
2008/06/08(日) 02:07:280547デフォルトの名無しさん
2008/06/08(日) 02:22:400548デフォルトの名無しさん
2008/06/08(日) 02:24:14条件式の結果云々はコンパイラの問題だろ
0549デフォルトの名無しさん
2008/06/08(日) 02:27:320550デフォルトの名無しさん
2008/06/08(日) 02:56:000551デフォルトの名無しさん
2008/06/08(日) 02:56:380552デフォルトの名無しさん
2008/06/08(日) 03:01:300553デフォルトの名無しさん
2008/06/08(日) 03:09:52真偽は比較、評価などで0か1かで、関数は0か0以外という概念もあるしね。
0554デフォルトの名無しさん
2008/06/08(日) 08:03:28#define DB(x) x
という、マクロがあり
DB(fprintf(stderr,"InitSocket\n"));
このような、使われ方をしていました
想像するに、DBにfprintf(stderr,"InitSocket\n")とい引数を持たせているのですが
このような使い方をすることで何かメリットがあるのですか?意味が分かりません
目的と、どのように何がどのように作用するのか教えてくださいエロイヒト
0555デフォルトの名無しさん
2008/06/08(日) 08:04:42マチガエマスタ
C言語で書かれたプログラムコードで
#define DB(x) x
という、マクロがあり
DB(fprintf(stderr,"InitSocket\n"));
このような、使われ方をしていました
想像するに、DBにfprintf(stderr,"InitSocket\n")とい引数を持たせているのですが
このような使い方をすることで何かメリットがあるのですか?意味が分かりません
目的と、どのように何がどのように作用するのか教えてくださいエロイヒト
0556デフォルトの名無しさん
2008/06/08(日) 08:05:15#define DB(x)
とすると
DB(fprintf(stderr,"InitSocket\n"));
が
;
になります
0557デフォルトの名無しさん
2008/06/08(日) 08:16:330558デフォルトの名無しさん
2008/06/08(日) 08:20:39う〜んよく分かりません、
fprintf関数は書式付の出力ですよね、単にInitSocket\nという文字列をstderrに対して、出力してるだけですよね?
fprintf(stderr,"InitSocket\n")だけではいけないんでしょうか?
kuwasikuオナガイシマス
0559デフォルトの名無しさん
2008/06/08(日) 08:23:34元ネタはここです↓
ttp://www.ncad.co.jp/%7Ekomata/c-kouza10.htm
0560デフォルトの名無しさん
2008/06/08(日) 08:24:33>>555です
>>556
>>557
thx
元ネタはここです↓
ttp://www.ncad.co.jp/%7Ekomata/c-kouza10.htm
0561デフォルトの名無しさん
2008/06/08(日) 08:47:49次のコードの
#define DEBUG
の行の有無でコンパイルし直して実行してみれば?
#include<stdio.h>
#define DEBUG // 普通はコンパイルオプションで指定することが多い
#ifdef DEBUG
#define DB(x) x
#else
#define DB(x)
#endif
int main(void){
DB(fprintf(stderr,"InitSocket\n"));
return 0;
}
0562デフォルトの名無しさん
2008/06/08(日) 09:06:08>>555です
あ!そっか、何となく分かったっぽいです
コンパイルオプションスイッチの有無で、出力する、しないを設定するのですね
0563デフォルトの名無しさん
2008/06/08(日) 11:28:33DEBUGにすればいいものを
0564デフォルトの名無しさん
2008/06/08(日) 12:21:55概念つーか、関数作ったやつがどう仕様をきめるかって問題だろ。
仕様が「0かそれ以外」だったら、== TRUE で比較は間違ってるってだけの話だろ。
0565デフォルトの名無しさん
2008/06/08(日) 12:23:500566デフォルトの名無しさん
2008/06/08(日) 12:25:380567デフォルトの名無しさん
2008/06/08(日) 12:26:38ム板で何言ってるんだ
0568デフォルトの名無しさん
2008/06/08(日) 14:02:44自分で作ったものは自分で決める、そりゃそうだが
標準ライブラリをもっとよく見てみることをお勧めする。
あと >>546 みたいな意見が出たが、成功すると
0以外の値を返すものも普通にあるぞ。
0569デフォルトの名無しさん
2008/06/08(日) 14:11:350570デフォルトの名無しさん
2008/06/08(日) 14:23:050571デフォルトの名無しさん
2008/06/08(日) 14:28:120572デフォルトの名無しさん
2008/06/08(日) 14:40:36いやだから、仕様を読んで、そのとおりに使えばいいんじゃん。
仕様もよくわからん関数ならともかく、標準関数とか特に。
0573デフォルトの名無しさん
2008/06/08(日) 14:46:43仕様が、それを返すってことになってたら、 func() == XX_TRUE みたいに比較したほうが安全って
意見も見たことはある。
0574デフォルトの名無しさん
2008/06/08(日) 14:49:49って言ったら1とか0とかなんてそんなのわかんないだろ!人間はコンピューターじゃないんだよ!ってコボラーの先輩がキレた
0575デフォルトの名無しさん
2008/06/08(日) 15:00:48真偽値を返す関数の戻り値はほぼ必ず0か非0を返すとドキュメントに書かれている。
0576デフォルトの名無しさん
2008/06/08(日) 15:01:580577デフォルトの名無しさん
2008/06/08(日) 15:04:45C++ なら bool 返す関数は true/false しか返さない(返せない)がな。
0578デフォルトの名無しさん
2008/06/08(日) 15:08:16そこは論点になってませんよ。
0579質問です
2008/06/08(日) 15:16:47<内容>
自分のPCにRS232Cを2つ繋いで(クロスケーブル)何でもいいので、通信させたいのです。
win32APIを使うといいらしいのですが、プログラムを作った後の動かし方等もわかりません。。
開発ツール:VisualC++2008
どなたか、答えられる方いますか??
0580デフォルトの名無しさん
2008/06/08(日) 15:19:01成功したら0を返す関数の場合 if(!func()==TRUE)
非0を返す関数の場合 if(!!func()==TRUE)って書けばおkじゃね?w
0581デフォルトの名無しさん
2008/06/08(日) 15:22:160582デフォルトの名無しさん
2008/06/08(日) 15:23:31「rs232c windows」でググったら、最初にこのページが出てきたけど、これじゃいかんの?
http://members.jcom.home.ne.jp/0434383301/vc10.htm
0583デフォルトの名無しさん
2008/06/08(日) 15:23:41基本的にTRUEは使わない
0584デフォルトの名無しさん
2008/06/08(日) 15:25:51if には基本的に真偽値を渡すんだから
真偽値を返す関数はそのまま書けばいいだけ。
別にそれで可読性は落ちない。
0585デフォルトの名無しさん
2008/06/08(日) 15:26:300587デフォルトの名無しさん
2008/06/08(日) 15:33:35そりゃあTRUEやFALSEが混在してる中でなら、分かりにくいとは思うが
0588デフォルトの名無しさん
2008/06/08(日) 15:36:550589デフォルトの名無しさん
2008/06/08(日) 20:51:59しているようだから、そんなのは規格で正しくても、規約では絶対認めない。
0590デフォルトの名無しさん
2008/06/08(日) 20:56:450591デフォルトの名無しさん
2008/06/08(日) 22:32:00・真偽は0以外か0
単純にコレだけのことじゃん。
0592デフォルトの名無しさん
2008/06/08(日) 22:55:17等価演算子?の質問なんですが
例えばfor文で、 i <= 10 ってのは10までいったら終わるって事ですよね?
if文だと、 i <= 10 、10以下の条件が満たされると思っていいのでしょうか?
0593デフォルトの名無しさん
2008/06/08(日) 22:58:560594デフォルトの名無しさん
2008/06/08(日) 23:00:42> 例えばfor文で、 i <= 10 ってのは10までいったら終わるって事ですよね?
微妙に違う。「iが10以下の場合くりかえし」つまり「iが11になったら
終り(i++の場合)」
> if文だと、 i <= 10 、10以下の条件が満たされると思っていいのでしょうか?
文脈がわからん。何を聞いているんだろう?
0595デフォルトの名無しさん
2008/06/08(日) 23:00:44if文でもfor文でも
i<=10 が成立している場合実行、だ
0596デフォルトの名無しさん
2008/06/08(日) 23:01:420597デフォルトの名無しさん
2008/06/08(日) 23:02:090598デフォルトの名無しさん
2008/06/08(日) 23:03:430599デフォルトの名無しさん
2008/06/08(日) 23:04:240600デフォルトの名無しさん
2008/06/08(日) 23:06:430601デフォルトの名無しさん
2008/06/08(日) 23:06:52printf(" * ")
って式だと,
* は11個でるんでしょうか? それとも10個で終わるんでしょうか?
0602デフォルトの名無しさん
2008/06/08(日) 23:07:28試せよ
36個だよ
0603デフォルトの名無しさん
2008/06/08(日) 23:07:519コだよ。
0604デフォルトの名無しさん
2008/06/08(日) 23:08:000605デフォルトの名無しさん
2008/06/08(日) 23:10:00それだけだと分からない
0606デフォルトの名無しさん
2008/06/08(日) 23:10:01i = 1;
if (i < 10) printf
i++
if (i < 10) printf
i++
if (i < 10) printf
i++
if (i < 10) printf
i++
if (i < 10) printf
i++
if (i < 10) printf
i++
これで考えろ
0607デフォルトの名無しさん
2008/06/08(日) 23:22:53最初は ++しないで、下に下がるんですよね?
0608デフォルトの名無しさん
2008/06/08(日) 23:23:350609デフォルトの名無しさん
2008/06/08(日) 23:27:130610デフォルトの名無しさん
2008/06/08(日) 23:29:21もう一度良く数えてみるんだ。
printf("%0d",i);してみろ
0611デフォルトの名無しさん
2008/06/08(日) 23:32:58もしかして
for(i = 1; i < 10; i++)
じゃなくて
for(i = 1; i <= 10; i++)
とかやってないだろうな・・・
0612デフォルトの名無しさん
2008/06/08(日) 23:34:02for 構文は、最初に第1式を評価し、第2式の値が真である間、
続く一文またはブロックの処理と第3式の評価を繰り返す。
たとえば for(i=1; i<=10; i++) は、最初に i を 1 に初期化し、
i が 10 以下である間、続く文かブロックを実行してから i を 1 ずつ増やす。
これは結果として同じ処理が 10 回繰り返されることを意味する。
どうしても処理の流れが想像できないときは、まず文房具を用意して絵を描くこと。
0613デフォルトの名無しさん
2008/06/08(日) 23:34:20全部 while で書け
0614デフォルトの名無しさん
2008/06/08(日) 23:34:320615デフォルトの名無しさん
2008/06/08(日) 23:40:44< はそのまま最初から++するんですか?
0616デフォルトの名無しさん
2008/06/08(日) 23:41:26日本語でいうと
< は未満
<=は以下
0617デフォルトの名無しさん
2008/06/08(日) 23:46:330618デフォルトの名無しさん
2008/06/08(日) 23:46:550619デフォルトの名無しさん
2008/06/08(日) 23:47:28本当にありがとうございました
0620デフォルトの名無しさん
2008/06/08(日) 23:52:40すっきりしましたのでありがとうございます
0621デフォルトの名無しさん
2008/06/08(日) 23:56:040622デフォルトの名無しさん
2008/06/08(日) 23:56:59あってるんじゃね?日本語にした場合の説明は。
0623デフォルトの名無しさん
2008/06/08(日) 23:57:19for ( A; B; C)
と
A
while(B) {
〜
C
}
は等価
0624デフォルトの名無しさん
2008/06/08(日) 23:59:17流れが読めてないね
0625デフォルトの名無しさん
2008/06/09(月) 00:10:40ご丁寧に大変どうもありがとうございます!
なるほど。s2やらをコピーした直後に表示しているから、壊れて出ないけど、
その後、s3がs2の領域を塗りつぶしちゃってるんですね!!
ポインタ苦手すぎて、メモリ操作とか難しすぎて涙が出ます。。
memsetは不要なんですね。よく分からないけど、みんなやってるので、やってただけなんです。
ポインタだから不要ってことですね。大変助かります。ありがとうございます。
strncpy()という関数を教えてくださり、ありがとうございます!
決まった文字数以外は切り捨ててしまって構わないので、これで確実にできると思います。
大変ありがとうございます!!
Cド初心者で、ポインタ操作が苦手なんですが、トークンの先頭を示すポインタの値を
記憶しておく場合、main()に戻ったときに、その値は消えてしまったりしないんでしょうか??
変数の範囲とポインタ関係とかもよくわかってません・・泣
> そうやって切り出した一群のポインタの値を関数の外に持ち出すには、
> ポインタのポインタ(ポインタの配列)を使う必要があることに注意すること。
これが切ないほどによく分からないので、やはり、配列コピーで、
文字列はここにある!と、安心した状態でやりたいと思います。
大変に助かりました!感謝感激!助言くださった皆様も、どうもありがとうございました!
お返事遅くなり、すみませんでした!!m(_ _)m
0626デフォルトの名無しさん
2008/06/09(月) 00:12:091 2 3 4 5 6 7 8 9 :9回
for(i = 1; i <= 10; i++)printf("%d ",i);
1 2 3 4 5 6 7 8 9 10 :10回
for(i = 0; i < 10; i++)printf("%d ",i);
0 1 2 3 4 5 6 7 8 9 :10回
for(i = 0; i <= 10; i++)printf("%d ",i);
0 1 2 3 4 5 6 7 8 9 10 :11回
0627デフォルトの名無しさん
2008/06/09(月) 00:15:08strncpyはヌル文字つけないことあるから注意しろよ
s1[n]='\0', strncpy(s1, tp, n); みたいに使うんだ
0628デフォルトの名無しさん
2008/06/09(月) 00:17:01全体的に知識不足っぽいから、本読むといいと思う。
実際プログラム組むのもいいんだけど、知識がないと、どうでもいい所でつまづく。
0629デフォルトの名無しさん
2008/06/09(月) 00:28:58ありがとうございます!
たとえば5文字の文字列をコピーしたい場合、'\0'の分もとって、
s1[6];
で宣言するんでしょうか?それとも、s1[7]?
>>628
はい、ひたすらに読みまくってみます。ありがとうございます!
0630デフォルトの名無しさん
2008/06/09(月) 00:42:505文字ならs1[6]でいい
良く使われるのは、
#define LENGTH 15
char str[LENGTH+1];
みたいな手法
0631デフォルトの名無しさん
2008/06/09(月) 01:12:52ああ、なるほど!
それはよく見かけるけど、+1 はそういう意味だったんですね!
こういうの、本に載ってないですよね!為になります。
ありがとうございます!
0632デフォルトの名無しさん
2008/06/09(月) 01:16:540633デフォルトの名無しさん
2008/06/09(月) 01:27:49論争はやめてね。
0634デフォルトの名無しさん
2008/06/09(月) 01:28:570635デフォルトの名無しさん
2008/06/09(月) 01:32:40それだけを1行に書いたら同じ機能。
if文なんかの中に組み込むと結果が違ってくる。
0636デフォルトの名無しさん
2008/06/09(月) 01:35:37それ以外で使うべきではないし、for文では積極的に使う。
0637デフォルトの名無しさん
2008/06/09(月) 01:36:58専用と言い切ったらダメだろw
あくまで慣習的に使われてるだけだし
0638デフォルトの名無しさん
2008/06/09(月) 01:38:32どうかわるの?
0639デフォルトの名無しさん
2008/06/09(月) 01:41:33for文といえばiだろ?とか言ってるようじゃ学生レベル
0640デフォルトの名無しさん
2008/06/09(月) 01:43:010641デフォルトの名無しさん
2008/06/09(月) 01:43:320642デフォルトの名無しさん
2008/06/09(月) 01:44:220643デフォルトの名無しさん
2008/06/09(月) 01:45:430644デフォルトの名無しさん
2008/06/09(月) 01:47:450645デフォルトの名無しさん
2008/06/09(月) 01:52:130646デフォルトの名無しさん
2008/06/09(月) 01:53:29教科書読め
0647デフォルトの名無しさん
2008/06/09(月) 01:58:00視野に納まる範囲のループカウンタは一文字で十分
広範囲に及ぶならなんか名前を付けたほうがいいかもしれないが、
そうならないように関数を分割するなどの努力をすべきだろう
0648デフォルトの名無しさん
2008/06/09(月) 02:01:300649デフォルトの名無しさん
2008/06/09(月) 02:03:44プロジェクトとかって自分のディレクトリに置いてやってけばいいの?
ディレクトリが沢山あってlinuxの正解というか常識がわからん
0650デフォルトの名無しさん
2008/06/09(月) 02:13:56次に進みたいので何かいい本ある?
0651デフォルトの名無しさん
2008/06/09(月) 02:15:41推薦図書/必読書のためのスレッド 40
http://pc11.2ch.net/test/read.cgi/tech/1209441159/
0652デフォルトの名無しさん
2008/06/09(月) 04:02:21「問題が発生したためtest.exeを終了します」って出るんですが
何がいけないんでしょうか?
#include <stdio.h>
int main(void)
{
int array[10];
int i;
for(i=0;i<10;i++){
printf("%d番目の数を入力してください:",i+1);
scanf("%d",array[i]);
}
for(i=9;i<0;i--){
printf("%d\n",array[i]);
}
return 0;
}
0653デフォルトの名無しさん
2008/06/09(月) 04:07:06ヒント:scanfのarray[i]引き数があやすい
scanfのマニュアルあるいは教科書を読み直す
0654デフォルトの名無しさん
2008/06/09(月) 04:09:10釣りはやめようね
0655デフォルトの名無しさん
2008/06/09(月) 04:11:32わかりました
「&」ですよね
あとどうでもいいんですけど二つ目のfor文の条件式はi>=0にしないとなんもならないですね
ありがとうございました!
>>654
マジで気づかなかったです
自分の持ってる教本にも
初心者はscanf使う時に&忘れやすいから気をつけてって書いてたんで
これからは忘れずちゃんと&つけたいと思います
簡単すぎる質問でスレ汚したかもしれないです
すいませんでした
0656デフォルトの名無しさん
2008/06/09(月) 04:12:15scanf("%d",array[i]); > scanf("%d",&array[i]);
なんだかなぁ。
0657デフォルトの名無しさん
2008/06/09(月) 04:16:580658デフォルトの名無しさん
2008/06/09(月) 05:48:390659デフォルトの名無しさん
2008/06/09(月) 07:38:270660デフォルトの名無しさん
2008/06/09(月) 11:39:130661デフォルトの名無しさん
2008/06/09(月) 11:59:02定数同士の計算じゃつまらないので何か入力させてその値に対して計算をさせたい
でもまだ文字列の説明はしていない
→ scanf
0662デフォルトの名無しさん
2008/06/09(月) 12:01:15#include とか
scanf printf みたいな可変長引数をとる関数とか
気にしてたら何もできない
0663デフォルトの名無しさん
2008/06/09(月) 12:07:580664デフォルトの名無しさん
2008/06/09(月) 13:54:00無理だろwww
プリプロセス単体の説明からはじめるのかよwwwww
0665デフォルトの名無しさん
2008/06/09(月) 14:04:43前置きで、あまり使うべきでない関数だと断った上で
0666デフォルトの名無しさん
2008/06/09(月) 15:01:00int zel(int y, int m , int d) {
if(m<=2) { y--; m+=12; } // 1,2月は前年の13,14月として扱う
return ( y + (y/4) - (y/100) + (y/400) + ((13*m+8)/5) + d) % 7;
}
int main(void)
{
int year,month,cnt;
for (year=2001,cnt=0; year<=2100; year++) {
for (month=1; month<=12; month++) {
if( zel(year,month,13)==5 ) {
cnt++;
}
}
}
printf("%d回\n",cnt);
return 0;
}
このプログラムをmain関数のみで作ることって出来ますか?
if文とfor文ぐらいしか習ってないんですが…
0667デフォルトの名無しさん
2008/06/09(月) 15:07:350668デフォルトの名無しさん
2008/06/09(月) 15:10:12すみませんが、教えてもらえませんか??
0669デフォルトの名無しさん
2008/06/09(月) 15:27:04int main(void)
{
int year,month,cnt,zelAns,y,m,d;
for (year=2001,cnt=0; year<=2100; year++) {
for (month=1; month<=12; month++) {
y = year;
m = month;
d = 13;
if(m<=2) { y--; m+=12; } // 1,2月は前年の13,14月として扱う
zelAns = ( y + (y/4) - (y/100) + (y/400) + ((13*m+8)/5) + d) % 7;
if (zelAns == 5) {
//if( zel(year,month,13)==5 ) {
cnt++;
}
}
}
printf("%d回\n",cnt);
return 0;
}
これでOKかな・・・?間違ってたら指摘にょろ
あと2chでインデント維持のためTAB1個を全角スペースx5に変換してるので
コピーする場合はエディタなどで修正必要?
0670デフォルトの名無しさん
2008/06/09(月) 15:29:20#include <stdio.h>
int main(void) {
int year,month,cnt, y, m;
for (year=y=2001,cnt=0; year<=2100; year++) {
y = year;
for (month=1; month<=12; month++) {
m = month;
if (m <= 2) {
y--;
m+=12;
}
if (((y + (y/4) - (y/100) + (y/400) + ((13*m+8)/5) + 13) % 7) == 5) {
cnt++;
}
}
}
printf("%d回\n",cnt);
return 0;
}
適当なのであってるかしらんよ。
で、これ宿題?
0672デフォルトの名無しさん
2008/06/09(月) 15:45:03今度から宿題はここで聞くといいよ。
ttp://pc11.2ch.net/test/read.cgi/tech/1212895856/
0673デフォルトの名無しさん
2008/06/09(月) 16:43:531+(1+2)+(1+2+3)+(1+2+3+・・・+n)
二重ループを用いて書いてください。
よろしくお願いします
0674デフォルトの名無しさん
2008/06/09(月) 16:47:240675デフォルトの名無しさん
2008/06/09(月) 16:51:560676デフォルトの名無しさん
2008/06/09(月) 16:59:580677デフォルトの名無しさん
2008/06/09(月) 17:07:49入力文字を5文字制限に制限をして、あふれたら収まるまで警告を出すプログラム
を考えているんですがめちゃくちゃになってしまいました・・・
#include <stdio.h>
int main(void){
char namae[5];
do{
scanf("%s", namae);
if(namae[5] > sizeof(namae)){
printf("文字数オーバーです。もう一度入力してください。");
}
else if(namae[5] < sizeof(namae)){
break;
}
}
while(namae[5] > sizeof(namae));
printf("%d", sizeof(namae));
}
文字数の比較でsizeof()を使ってます・・・上記のコードでやると、
namaeの中身がリセットされずに延々と増えていってしまいどうしたらいいのかわからなくなりました・・・
スマートなやり方はないでしょうか?どうかご教授ください・・
0678デフォルトの名無しさん
2008/06/09(月) 17:09:26↑これ間違えました・・・・さっき実験してたやつです・・・
printf("%s", namae)でした・・・
0679デフォルトの名無しさん
2008/06/09(月) 17:18:52↑
そもそも、これが(namae[5])何を指しているのか、良く考えた方がいい
つstrlen()
0680デフォルトの名無しさん
2008/06/09(月) 19:42:17こういうプログラムを実行したときに
void型はnode型に変更できませんってなるのはなぜでしょうか
0681デフォルトの名無しさん
2008/06/09(月) 19:48:35voidはmallocで確保した際の戻りアドレスで
nodeは構造体
キャストがうまく出来てない?
0682デフォルトの名無しさん
2008/06/09(月) 19:59:05>>681の通りだと
111行目あたりの
new_node = malloc( sizeof( struct node ) );
を
new_node = (struct node*)malloc( sizeof( struct node ) );
に変えてみるとかどうだろうか
0683デフォルトの名無しさん
2008/06/09(月) 20:02:40こういう・・・ということは自前で用意した物ってことか?
うまく行かないソースとエラーになる行番号をせめて書いたほうがいいよ。
0684デフォルトの名無しさん
2008/06/09(月) 20:18:570685デフォルトの名無しさん
2008/06/09(月) 20:20:13標準Cだけじゃ無理
0686デフォルトの名無しさん
2008/06/09(月) 20:26:360687デフォルトの名無しさん
2008/06/09(月) 20:29:36このあたりは画面というよりむしろプリンタを想定している所が大きいんだよな。
0688デフォルトの名無しさん
2008/06/09(月) 20:31:19DOSとかのようなシングルタスクな環境だと
VRAMのアドレスとかわかれば直接アクセスできたりするんだけど。
0689デフォルトの名無しさん
2008/06/09(月) 20:34:230690デフォルトの名無しさん
2008/06/09(月) 20:37:050691デフォルトの名無しさん
2008/06/09(月) 20:43:40一からOS作ってもwindowsのようなGUI形態とる場合は
結局同じようなAPIの道を歩むと思うので無駄。
素直にAPIたたけ。
それがいやなら、DOSでやれってことだな。
でもDOSでやるとなると今度はもっと大変なんだけどな。
0692680
2008/06/09(月) 20:49:49実行時のエラーです、行数は同じです,お願いします
> C:\borland\bcc55\Bin\make.exe -fDebug\test.mak -B TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -WC -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -nDebug -c C:\MyC\test\test.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
C:\MyC\test\test.cpp:
エラー E2040 C:\MyC\test\test.cpp 15: 宣言が正しく終了していない
エラー E2034 C:\MyC\test\test.cpp 24: 'void *' 型は 'node *' 型に変換できない(関数 main() )
エラー E2158 C:\MyC\test\test.cpp 50: 'delete' のオペランドは非 const ポインタでなければならない(関数 main() )
エラー E2034 C:\MyC\test\test.cpp 111: 'void *' 型は 'node *' 型に変換できない(関数 add(int) )
エラー E2040 C:\MyC\test\test.cpp 124: 宣言が正しく終了していない
*** 5 errors in Compile ***
** error 1 ** deleting Debug\test.obj
Build End !! (Elapsed time 0:00.871)
0693デフォルトの名無しさん
2008/06/09(月) 20:54:370694デフォルトの名無しさん
2008/06/09(月) 20:55:07おっ・・・オサー・・・ん?
0695デフォルトの名無しさん
2008/06/09(月) 21:00:10Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
a.cpp:
エラー E2040 a.cpp 15: 宣言が正しく終了していない
エラー E2034 a.cpp 24: 'void *' 型は 'node *' 型に変換できない(関数 main() )
エラー E2158 a.cpp 50: 'delete' のオペランドは非 const ポインタでなければならない(関数 main() )
エラー E2034 a.cpp 111: 'void *' 型は 'node *' 型に変換できない(関数 add(int) )
エラー E2040 a.cpp 124: 宣言が正しく終了していない
*** 5 errors in Compile ***
E:\Test>ren a.cpp a.c
E:Test>bcc32 a.c
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
a.c:
Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland
こういうこったな
0696デフォルトの名無しさん
2008/06/09(月) 21:09:24教えてください。下記のコードでは、出力される結果はchar型へのポインタの
サイズだと思いますが、メモリで確保した領域を取得する関数などは在りますか?
処理系はcygwin + gcc です。ウェブで検索するとmalloc.hにてmalloc_usable_size
という関数が紹介されていたのですが、私の環境では関数がない様でした。
int main (void){
char *str;
str = malloc(sizeof(char)*10);
printf("sizeof(str)=%d\n", sizeof(str));
return 0;
}
また、こういった動的に確保した場合の処理は皆さんはどの様に処理していますか?
やはり、自分でメモリ領域管理変数などを用意するのでしょうか?
0697デフォルトの名無しさん
2008/06/09(月) 21:10:29C++ コンパイラ使うなら 15行目の delete は使えない(C++ のキーワードだから)
修正は次の通り
delete() → del() とかにする。3箇所
15: int del(int);
50: if( del(data) != 0)
124: int(del int data)
C++ ならキャストをしっかりと。2箇所
24: root = (node*) malloc(...
111: new_node = (node*)malloc(...
>>693
この程度 C ソースなら少し気をつければ C++ で動くで。
0698デフォルトの名無しさん
2008/06/09(月) 21:11:020699デフォルトの名無しさん
2008/06/09(月) 21:14:55これだとポインターのサイズじゃねーの?
sizeof(char)*10
これを確保してるんだから
char型は1バイト、それを10個確保してるのが今回のサンプル
でmallocの場合は確保するサイズは自分でわかってないと無理でしょ・・・
int main (void){
char *str;
unsigned long malloc_size;
malloc_size = sizeof(char)*10;
str = malloc(malloc_size);
printf("sizeof(str)=%d\n", sizeof(str));
return 0;
}
0700デフォルトの名無しさん
2008/06/09(月) 21:15:39じゃないや
printf("sizeof(str)=%d\n", malloc_size);
0701デフォルトの名無しさん
2008/06/09(月) 21:22:21自分が確保するときに指定したサイズを知る方法を教えてくれってw
0702696
2008/06/09(月) 21:31:51レスありがとうございます。
>sizeof(str) これだとポインターのサイズじゃねーの?
この書き方だとポインタサイズになってしまうが、mallocした領域サイズを
自分でずっと管理するのは面倒だな・・・。もしかして、領域サイズを取得する関数や、
手法がないのかなと思い、サンプル的にそのコードを出しました。
かえって意図が伝わり難くなったようですいません。
>701
やはり、動的取得の場合は無理なのですね。自分で管理することにします。
0703デフォルトの名無しさん
2008/06/09(月) 21:31:57free(); を忘れないでね
0704680
2008/06/09(月) 21:32:06ありがとうございます
エラーなく実行できました
0705デフォルトの名無しさん
2008/06/09(月) 21:34:25sizeof(str) はあくまでも ポインタのサイズ。
ポインタの実態はアドレスの番地が管理されているため
環境にもよるが、アドレスを2^32まで割り当てられる環境では
変数の型がなんであれ、ポインタ自身のサイズは 4byte かと。
0706デフォルトの名無しさん
2008/06/09(月) 21:35:500707デフォルトの名無しさん
2008/06/09(月) 21:47:460708696
2008/06/09(月) 21:59:30少数の変数を使用して、確保するので有ればその通りだと思います。
しかしながら、確保する領域が処理したいデータによって動的に、しかも多数
管理していく必要が出てきた場合、メモリ管理を自動化できるならば、
(この場合はメモリ確保領域をシステムに任せたいということですが)そうした方が
楽だと思います。また、そういったニーズは出てくるものではないでしょうか?
ここの方ならば、そういったノウハウをもしかして持っているのではないかと思い、
質問した次第です。
それならC以外の言語を使えというのはもっともだと思いますが。
0709デフォルトの名無しさん
2008/06/09(月) 22:02:150710デフォルトの名無しさん
2008/06/09(月) 22:02:31int main()
{
int x;
x = 10;
char (*y)[x];
y = malloc(x);
printf("%d\n", sizeof(*y));
return 0;
}
0711デフォルトの名無しさん
2008/06/09(月) 22:03:35{
int length;
char *str;
}VARCHAR;
みたいにくっつけて扱え
0712デフォルトの名無しさん
2008/06/09(月) 22:04:56意味ねぇー(笑
0713デフォルトの名無しさん
2008/06/09(月) 22:05:06変更できねーじゃんw
0714デフォルトの名無しさん
2008/06/09(月) 22:05:080715696
2008/06/09(月) 22:09:35ありがとうございます。参考にさせていただきます。
>711
やはり、そのように管理するのがスマートですね。その様に実装していこうと
思います。
みなさん、変な質問に答えてください、ありがとうございました。
0716デフォルトの名無しさん
2008/06/10(火) 00:06:55そこで今日書店に指南書を探しにいったのですがいまいちどれもとっつきにくく帰ってきました。
プログラムとはそもそも何かという概念的な事から始まり、揃えるべき環境(ツール)が細かく指定されてる超入門書ってないでしょうか?
0717デフォルトの名無しさん
2008/06/10(火) 00:09:20http://pc11.2ch.net/test/read.cgi/tech/1209441159/
0718デフォルトの名無しさん
2008/06/10(火) 00:09:35>>651
0719デフォルトの名無しさん
2008/06/10(火) 00:12:31本いるか・・・?
ネットで十分だろ。
0720デフォルトの名無しさん
2008/06/10(火) 00:13:29いきなりコードを書いて、なんかで(・∀・)キターーじゃ話にならん。
どんな環境、プログラム言語も、動作させるコンピュータの仕組み
内面的な部分に命令を与えているわけだし、0と1の演算処理を
様々な変数、演算子、アルゴリズムで制御しているわけだ。
また、どんなコンピュータでもいえる事が、何かデータ、数値を与えて
与えられたデータを目的に応じて処理した結果を扱っているわけだ。
あとはそれを、人間が解釈できる形、例えば文字、色、画像、音声などで
表現できるコンピュータで都合よく見て理解しているわけだ。
画像だろうと音声データだろうと文字データだろうと、所詮は0と1の
バイナリーで他の塊に過ぎんのさ。
必要に応じて物を用意する。それは他のことでも言えること。
ただ、何があって何が出来るか?それを多少なりと把握しておく必要はある。
さて、何を見れば良いか?それは、他の人に聞いてくれ。
0721デフォルトの名無しさん
2008/06/10(火) 00:14:41>ネットで十分だろ。
どうも実体があると落ち着くもので・・・。
0722デフォルトの名無しさん
2008/06/10(火) 00:16:390723デフォルトの名無しさん
2008/06/10(火) 00:36:590724デフォルトの名無しさん
2008/06/10(火) 02:08:41って、何がありきたりか・・・配列、文字列、ポインタ、関数の自作、
素数、最大公約数、ソート、ファイルのダンプなど等、もちろんそれ以外でも
あれこれ挙げたらキリがないが。結局、何が目的か?
0725デフォルトの名無しさん
2008/06/10(火) 02:12:17韓流スター見たさに、韓国語覚えたおばちゃんを見習え。
何もする予定無いのにC言語覚えても身につくわけない。
0726デフォルトの名無しさん
2008/06/10(火) 03:26:19>>716をもう一度読むんだ
0727デフォルトの名無しさん
2008/06/10(火) 03:42:290と1の組み合わせの塊を、必要に応じて展開、処理するわけでしょ?
BMPだと分かりやすいが、SVGはおりはさっぱりでやんす。
一応、XMLで記述されているとのことで、テキストエディタでも可能とかなんとか。
まぁ、それは画像編集であって、そんな編集するプログラムを作れるかは別だが。
0728デフォルトの名無しさん
2008/06/10(火) 03:44:05画像処理でもwindows上でUSBカメラからの映像を・・・とか
マイコンで処理・・・とか
でぜんぜん扱いも違うしな。
0729デフォルトの名無しさん
2008/06/10(火) 05:10:54実際の会社のプログラムとかでもやはり使わないのですか?
0730デフォルトの名無しさん
2008/06/10(火) 05:15:51使わないね・・・
使わないように組めるようになるよ。
0731デフォルトの名無しさん
2008/06/10(火) 07:39:19それ以外では使わない。
0732デフォルトの名無しさん
2008/06/10(火) 07:45:30俺は個人でも絶対使わないが
0733デフォルトの名無しさん
2008/06/10(火) 08:36:140734デフォルトの名無しさん
2008/06/10(火) 09:45:50それでもここでは使うべきだ!と思うなら使っていい
0735デフォルトの名無しさん
2008/06/10(火) 11:16:090736デフォルトの名無しさん
2008/06/10(火) 11:19:31GOTOの代わりのようにしちゃうこともあるな。
0737デフォルトの名無しさん
2008/06/10(火) 13:23:51Cやその他の構造化言語を使うほぼ全ての人が、みだりに goto を使うことはよくないと考えている。
構造化プログラミングの恩恵は、コードの総体が構造的であるときに最もよく受けられるものだが、
goto はまったく構造的でないからである。特に複数の人間が長期に渡ってプロジェクトに関わるような
プログラム開発の現場では、保守性を低下させるとの観点から絶対に認めないとする場合も多い。
goto を使いたくなる全ての場面は、goto を使わなくても構造的な手法によって解決することができる。
特に小さいけれど結構ややこしい処理を敢えて関数に分割することで解決することができる。
あるいはちょっと手間をかけてフラグ変数を配備したり、ブロックの構成を工夫することなどがある。
しかし、ある種の処理を行う場合には goto を使うことをためらうことはないと考えている人も少なくはない。
最たるものはエラー処理である。エラーというものはその性質上、予定していた処理を全て切り上げて
制御を呼び出し元に返すことになる場合がほとんどだが、プログラムが複雑なものになってくると、
特にメモリの動的な割り付けを噛ませている場合などは、率直に return する前のちょっとした後片付けが
どうしても必要になってくることが多々ある。もちろんこれは構造的に解決することができるものであるが、
しかし構造が複雑化して却って可読性が低下したり、やたらと細かい関数分割になってしまう場合もある。
そういうことを嫌う人は、関数の末尾にだけジャンプして最低限の後始末だけを行うという限定つきで、
goto を使うことを容認していることがある。
構造化と効率は決してトレードオフの関係ではないが、どんな場合でも構造化を押し通そうとすると、
性能や保守性を低下させてしまうこともある。プログラムは常に構造的に書くことができるけれど、
プログラムで実際に解決しようとしている現実の諸問題、そして人間の思考方式そのものは、
必ずしも構造的でないからである。もちろん大抵は取るに足らない性能差で、コンパイラの最適化や
プロセッサの能力で消されてしまうが、問題となることももちろんある。そのような場面に直面したとき、
ここは goto を使うべきだと信じるなら、そうすればよい。それ以外では思いとどまったほうが無難である。
0738デフォルトの名無しさん
2008/06/10(火) 13:37:11実際はフラグにして使わないけど。
0739デフォルトの名無しさん
2008/06/10(火) 13:56:51switch や break や continue や return も構造的でないジャンプ構文であり、
本質的には goto の同類である。これらの中から特に goto が取り上げられるのは、
そのジャンプする先を知ることが特別に難しいためだ。
だから goto を容認する人は、上の例でもあるように「関数の末尾にだけ飛ぶ」と言うような
処理の追跡を容易にするためのルールを作っていることがほとんどである。
0740デフォルトの名無しさん
2008/06/10(火) 14:08:150741デフォルトの名無しさん
2008/06/10(火) 14:10:10>739だけ読んだ。
0742デフォルトの名無しさん
2008/06/10(火) 15:48:34みんなGOTOで大きくなった。
そんななかでもGOTOの使い方にはマナーはあったのだ。
0743デフォルトの名無しさん
2008/06/10(火) 15:55:160744デフォルトの名無しさん
2008/06/10(火) 16:44:430745デフォルトの名無しさん
2008/06/10(火) 16:53:54嫌がらせかな?
0746デフォルトの名無しさん
2008/06/10(火) 16:57:14:LOOP
ECHO 続けますか?
PAUSE
GOTO LOOP
0747デフォルトの名無しさん
2008/06/10(火) 16:59:220748デフォルトの名無しさん
2008/06/10(火) 17:02:340749デフォルトの名無しさん
2008/06/10(火) 17:08:57gotoは習ってないので使わないでお願いします
って言われるのがオチ
0750デフォルトの名無しさん
2008/06/10(火) 17:27:21今の学校では習わないのかな?
0751デフォルトの名無しさん
2008/06/10(火) 17:27:590752デフォルトの名無しさん
2008/06/10(火) 17:33:38GOTOはどうしようも無いケースで使う最後の手段と思ってたほうがいいな。
0753デフォルトの名無しさん
2008/06/10(火) 17:48:37まぁ、使うことが「滅多に」無いのは認めるがね。
0754デフォルトの名無しさん
2008/06/10(火) 17:58:290755デフォルトの名無しさん
2008/06/10(火) 19:02:45forなんか人によってはなかなかわかってくれないもの
0756デフォルトの名無しさん
2008/06/10(火) 19:39:34俺的にはgoto文は適度に使う分には全く問題ない。むしろ見やすい
1関数に1個なら大丈夫だろ
0757デフォルトの名無しさん
2008/06/10(火) 19:42:26スパゲッティってのは時間をおいて固まってからが本領発揮なんだぜ?
0758デフォルトの名無しさん
2008/06/10(火) 19:42:470759デフォルトの名無しさん
2008/06/10(火) 19:52:050760デフォルトの名無しさん
2008/06/10(火) 20:05:420761デフォルトの名無しさん
2008/06/10(火) 20:06:210762デフォルトの名無しさん
2008/06/10(火) 20:06:460763デフォルトの名無しさん
2008/06/10(火) 21:06:090764デフォルトの名無しさん
2008/06/10(火) 21:13:230765デフォルトの名無しさん
2008/06/10(火) 21:28:20void main(void)と
int main(void)の使い方の違いを教えて下さい
main関数はint型で戻り値が0かどうかで正常かエラーか判断するから
int main(void)の方が使い方としては正しいみたいだけどじゃあなぜ
void main(void)なんて教えたりするんでしょう?
return 0;を省略できるからでしょうか?
0766デフォルトの名無しさん
2008/06/10(火) 21:31:34void main(void) は常に間違いである。
int main(void) または int main(int argc, char **argv) を使え。)
0767デフォルトの名無しさん
2008/06/10(火) 21:32:29教えてる人間がバカだから
0768デフォルトの名無しさん
2008/06/10(火) 21:32:340769デフォルトの名無しさん
2008/06/10(火) 21:36:22void main(void) は常に間違いである。は間違いである。
0770デフォルトの名無しさん
2008/06/10(火) 21:37:28void main()と宣言してうまくいかないわけがないと思う。なぜならmain()から戻る代わりに、exit()を呼んでいるから。だいたい今使っているOSはプログラムのexit値/戻り値を無視する。
A:
main()から戻ってくるかどうかは関係ないし、そのステータスを見るかどうかも関係ない。問題はmain()の宣言がおかしいと、呼び出し側(実行時のスタートアップのコード)がmain()を正しく呼び出すことすらできないかもしれないことにある。
君が使っているOSは終了時のステータスを無視して、void main()でもうまく動くかもしれない。しかし、このやりかたは移植性が低いし、正しくもない。
0771デフォルトの名無しさん
2008/06/10(火) 21:37:47それ以外は、間違いである。
(動くけどね)
0772デフォルトの名無しさん
2008/06/10(火) 21:38:330773デフォルトの名無しさん
2008/06/10(火) 21:39:510774デフォルトの名無しさん
2008/06/10(火) 21:42:33良しと書いてあるマニュアルなんて今まで見たことがないけど。
0775デフォルトの名無しさん
2008/06/10(火) 21:43:590776デフォルトの名無しさん
2008/06/10(火) 21:45:49まだC言語などを始めたばかりの初心者です。
エラーメッセージでこのような文章が出てきました。
undefine:n
どなたかよろしくお願いします
0777デフォルトの名無しさん
2008/06/10(火) 21:46:31naが定義されてないようです
0778デフォルトの名無しさん
2008/06/10(火) 21:50:47void main(void)は使わないようにします
0779デフォルトの名無しさん
2008/06/10(火) 22:32:05じゃあかんの?
0780デフォルトの名無しさん
2008/06/10(火) 22:33:130781デフォルトの名無しさん
2008/06/10(火) 22:34:390782デフォルトの名無しさん
2008/06/10(火) 22:37:130783デフォルトの名無しさん
2008/06/10(火) 22:37:510784デフォルトの名無しさん
2008/06/10(火) 22:38:230785デフォルトの名無しさん
2008/06/10(火) 22:39:120786デフォルトの名無しさん
2008/06/10(火) 22:42:25嘘をつくな
0787デフォルトの名無しさん
2008/06/10(火) 22:42:57C89ではblessed。
0788デフォルトの名無しさん
2008/06/10(火) 22:46:150789デフォルトの名無しさん
2008/06/10(火) 22:47:04煽るだけですか?w
0790デフォルトの名無しさん
2008/06/10(火) 22:48:40日本語、勉強しておいで
0791デフォルトの名無しさん
2008/06/10(火) 22:49:580792デフォルトの名無しさん
2008/06/10(火) 22:50:410793デフォルトの名無しさん
2008/06/10(火) 22:51:060794デフォルトの名無しさん
2008/06/10(火) 22:57:50お前もだろw
0795デフォルトの名無しさん
2008/06/10(火) 23:36:110796デフォルトの名無しさん
2008/06/10(火) 23:47:490797デフォルトの名無しさん
2008/06/10(火) 23:52:530798デフォルトの名無しさん
2008/06/11(水) 00:00:450799デフォルトの名無しさん
2008/06/11(水) 00:08:49aori();
#endif
0800デフォルトの名無しさん
2008/06/11(水) 00:10:40main関数の3番目の引数envpは。
A:
これは(よく見かけるけれど)標準でない拡張である。標準で用意されているgetenv()関数が提供すること以上に環境の情報が必要ならば、グローバル変数environを使うほうがまだましな手段だろう(これも同 じように標準ではないが)。
References:
ANSI Sec. F.5.1; ISO Sec. G.5.1; H&S Sec. 20.1 pp. 416-7.
0801デフォルトの名無しさん
2008/06/11(水) 00:12:410802デフォルトの名無しさん
2008/06/11(水) 00:14:140803デフォルトの名無しさん
2008/06/11(水) 00:19:48C++と互換性のない部分はやる気なし
0804デフォルトの名無しさん
2008/06/11(水) 00:21:180805デフォルトの名無しさん
2008/06/11(水) 00:29:14ほかには__restrictや__pragmaなども。
0806デフォルトの名無しさん
2008/06/11(水) 00:39:37ダウト。”常に”も”間違い”でもないよ。環境による。
とりわけ、ISO、ANSI 準拠では main は int 型の変数を返すことになっている。
環境にもよるということで、必ずしもそうとは言えないし、少なくとも 間違い ではない。
0807デフォルトの名無しさん
2008/06/11(水) 00:43:16void main(void) は移植性は悪いが
その処理系で定義されているなら
その処理系でしかそのプログラムをコンパイルできない可能性があってもいいのであれば
使っても構わない。
ただ、入門書で使うのはどうかしてるよね。
VC++ しかコンパイラ知らないんじゃないかと。
0808デフォルトの名無しさん
2008/06/11(水) 00:43:530809デフォルトの名無しさん
2008/06/11(水) 01:00:430810デフォルトの名無しさん
2008/06/11(水) 01:02:49gccの方が柔軟なイメージがある
0811デフォルトの名無しさん
2008/06/11(水) 01:05:30わかりやすい説明ができるなら入門書の内容に移植性なんか必要無いと思う
コンパイラとか環境までオマケでついてるような書籍なら。
0812デフォルトの名無しさん
2008/06/11(水) 01:08:33移植性の無いコードなんて初心者に見せるもんじゃない。
0813デフォルトの名無しさん
2008/06/11(水) 01:13:08後からの余計な手間がかからないだろ。
0814デフォルトの名無しさん
2008/06/11(水) 01:23:270815デフォルトの名無しさん
2008/06/11(水) 01:25:49-std=c99 -pedantic-errors -Wall
のどちらかは必ず付けるね。
0816デフォルトの名無しさん
2008/06/11(水) 01:26:030817デフォルトの名無しさん
2008/06/11(水) 01:28:280818デフォルトの名無しさん
2008/06/11(水) 01:30:310819デフォルトの名無しさん
2008/06/11(水) 01:31:30c89だとだめで独自拡張でアリでc99だとアリだった気がする
0821デフォルトの名無しさん
2008/06/11(水) 01:32:210822デフォルトの名無しさん
2008/06/11(水) 02:00:15「規格には反しているが処理系によっては動く」ということを間違いでないと断定することは、
ありとあらゆる規格に反する書き方が間違いでないことになる可能性があることに気付いているか。
文法が正しいか正しくないかは、プログラムが動くか動かないかとは本質的に別の問題である。
文法は守るべきものであり、仮に文法に反することが容認されるとしても、それは正しいからではない。
0823デフォルトの名無しさん
2008/06/11(水) 02:03:26> 処理系によっては動く
ダウト。処理系ではなく開発環境。
ちゃんとある標準化に対して準拠する場合と、そうでなくても
問題のない開発環境についてとは話は別。よって、常にでも間違いでもない。
強いていうなら、ちゃんと補足しないと誤解を招くよ。知ったかだと。
0824デフォルトの名無しさん
2008/06/11(水) 02:04:50では、何で 間違い か、お答え頂こう。標準化機構はあくまでも標準的な
スタイルについての話であって、そのもの自身が 間違い とは定めてはいない。
0825デフォルトの名無しさん
2008/06/11(水) 02:09:33(゚д゚)エー
0826デフォルトの名無しさん
2008/06/11(水) 02:12:16少なくとも実装を問題にする場合の開発環境は。
0827デフォルトの名無しさん
2008/06/11(水) 02:13:06>ありとあらゆる規格に反する書き方が間違いでないことになる可能性があることに気付いているか。
ありとあらゆる規格に反する書き方が間違いでないことになる可能性はあるのだが。
ただし、文書で示す必要はあるが。
0828デフォルトの名無しさん
2008/06/11(水) 02:16:160829デフォルトの名無しさん
2008/06/11(水) 02:18:37というか、コンパイラで警告が出る。
0830デフォルトの名無しさん
2008/06/11(水) 02:20:21なぜ今そんな当たり前のことを
0831デフォルトの名無しさん
2008/06/11(水) 02:22:16開発環境:プログラムを作るためのツールの集合。処理系を含む。
コードの動作を問題にしてるならふつー同じものだと思いますね
0832デフォルトの名無しさん
2008/06/11(水) 02:22:25C99 で省略時には末尾に return 0; があるのと同じとされるようになった。
0833デフォルトの名無しさん
2008/06/11(水) 02:28:430834デフォルトの名無しさん
2008/06/11(水) 02:29:28そういう環境ではとりわけ、mainはint型の変数を返すとしている。
が、誰もが必ずしもISO、ANSI準拠の環境を使っているわけではなく
void mainでも間違いとは言えないんで、強いて間違いだの
不適切だの言うなら、条件をしてしないと通じんよ。
今度は、そのスタイルを間違いとしないコンパイラ叩きを始める奴もいるが
そうなると何が問題点か?そもそも議題の根本、要点が何か?
もう支離滅裂になるから困る。
0835デフォルトの名無しさん
2008/06/11(水) 02:40:18特に条件を指定しないなら規格に沿った一般論の話で
強いて間違いでないと言うなら条件をつけるべきだろ
0836デフォルトの名無しさん
2008/06/11(水) 02:42:41なんで規格に沿ったとか条件がつくのか理解できない。
0837デフォルトの名無しさん
2008/06/11(水) 02:43:46この人規格の意味とか認めない人だから何言っても無駄よ
0838デフォルトの名無しさん
2008/06/11(水) 02:44:370839デフォルトの名無しさん
2008/06/11(水) 02:45:38はぁ?特に条件を指定しないで 間違い なんて認められるわけねーじゃん
常に 間違い だよ?残念だが、事実上間違いではないんだよ、知ったか無知君w
0840デフォルトの名無しさん
2008/06/11(水) 02:45:420841デフォルトの名無しさん
2008/06/11(水) 02:48:39話を始めようとする奴が出るだろ?だから先に 条件を指定して 話をしろつってんだよ。
だいたい、C99だって結局は固有の条件として挙げられてるじゃんか。
だったら、まずANSI、ISO準拠ではと、とりわけint mainについて
標準スタイルではと補足しておくべきでしょ。標準化機構が示した
環境以外だって普通にあるぞ?とりわけ、標準化スタイルにしておけば
幅広い環境で通用するって話にもなるが、void mainに関しては 間違い にはならない。
むしろ、int mainでint型の数値を返さない方が不適切である。
0842デフォルトの名無しさん
2008/06/11(水) 02:48:53日本語でおk
0843デフォルトの名無しさん
2008/06/11(水) 02:49:020844デフォルトの名無しさん
2008/06/11(水) 02:50:03>>832 は規格の話であって環境の話じゃないだろw
0845デフォルトの名無しさん
2008/06/11(水) 02:51:07なんて言っちゃう人にもう何を言っても
0846デフォルトの名無しさん
2008/06/11(水) 02:51:11開発環境によっては、プログラムの開始でさえ必ずしも
main関数ではなくても良い環境もあれば、結局自作関数で
void hoge(void)といった形式で通用するところから、
hogeをmainに置き換えた屁理屈だって通ってしまう。
0847デフォルトの名無しさん
2008/06/11(水) 02:51:440848デフォルトの名無しさん
2008/06/11(水) 02:52:45Japanese please.
0849デフォルトの名無しさん
2008/06/11(水) 02:53:400850デフォルトの名無しさん
2008/06/11(水) 02:56:30そんなことを考える初夏の夜長
0851デフォルトの名無しさん
2008/06/11(水) 03:05:30他人を理解させられない。本当の意味で間違いじゃないから。
void mainなんて、かつては普通に使われていたが、今じゃ
標準スタイルに合わせることで、ソースコードをより幅広い
環境で通用するようにと、幅広い環境で通用するスタイルでは
int mainが望ましい。
まぁ、路上で言えば、黄線は越えて対向車線に出てはいけないとだけ覚えて
追い越しではないのに、他の車が黄線を越えて停止中の車、あるいは
障害物を避けたのを見て違反だと騒ぐようなもんだな。そういうのみっともねーってw
0852デフォルトの名無しさん
2008/06/11(水) 03:09:560853デフォルトの名無しさん
2008/06/11(水) 03:11:12オマエモナー
オレモナー
0854デフォルトの名無しさん
2008/06/11(水) 05:32:05void main(void)で書き始めるのは間違い。
voidはmainだけにつく引数。
正しくはint main()
0855デフォルトの名無しさん
2008/06/11(水) 06:20:13??
0856デフォルトの名無しさん
2008/06/11(水) 07:11:420857デフォルトの名無しさん
2008/06/11(水) 07:13:040858デフォルトの名無しさん
2008/06/11(水) 07:14:100859デフォルトの名無しさん
2008/06/11(水) 08:08:130860デフォルトの名無しさん
2008/06/11(水) 08:10:460861デフォルトの名無しさん
2008/06/11(水) 08:13:000862デフォルトの名無しさん
2008/06/11(水) 11:29:34これを当たり前のものとして教えるのは詐欺、ってことだろ
0863デフォルトの名無しさん
2008/06/11(水) 11:31:310864デフォルトの名無しさん
2008/06/11(水) 11:40:36利用者なんか何も考えずに適当に食い物にされてればいqあwせdrftgyふじこlp
0865デフォルトの名無しさん
2008/06/11(水) 13:45:030866デフォルトの名無しさん
2008/06/11(水) 18:00:44どの程度のレベルになったら違う言語を学び始めていいか教えてください。
それと、大卒や専門卒レベルの腕ってどれくらいか教えてください。
0867デフォルトの名無しさん
2008/06/11(水) 18:03:54レベルに関わらず複数言語並行しておkだけど手続型言語と関数型言語は並行しないほうがいいと思う
レベルはピンキリ
0868デフォルトの名無しさん
2008/06/11(水) 18:11:45ありがとうございます。ついでに中の上のレベル位までで、
プログラムの実力ってどんなもので計られるんですか?関数の暗記量とか。
0869デフォルトの名無しさん
2008/06/11(水) 18:14:150870デフォルトの名無しさん
2008/06/11(水) 18:58:10関数を暗記するよりもどういった関数が用意されていたかを覚えておくほうがいいと思うけど。
存在を知ってさえいれば後は調べられるわけで。
スレチだけどphpやC#なんかはその傾向が顕著だと思う。
0871デフォルトの名無しさん
2008/06/11(水) 19:50:31ある函数の存在さえ知らなかったとしても、
それが必要になった時点で
その存在の可能性の有無を推測でき、
それを探し出すリテラシーを持ち、
既に実装されていたらそれを使いこなす、
さもなければ自分で実装する。
こういったいうことができれば、中の下レベルかな。
0872430
2008/06/11(水) 20:10:050873デフォルトの名無しさん
2008/06/11(水) 20:12:59どうしたらいいでしょうか
0874デフォルトの名無しさん
2008/06/11(水) 20:13:19もうやめてしまいましょう
0875デフォルトの名無しさん
2008/06/11(水) 20:18:230876デフォルトの名無しさん
2008/06/11(水) 20:18:52それもやめてしまいましょう
0877デフォルトの名無しさん
2008/06/11(水) 20:20:100878デフォルトの名無しさん
2008/06/11(水) 20:20:18今後の仕様策定はどうしたらいいでしょうか?
0879デフォルトの名無しさん
2008/06/11(水) 20:24:17ソフトハウスにもよるが、開発が主体のソフトハウスではプログラミングができないとほぼアウト
0880デフォルトの名無しさん
2008/06/11(水) 20:25:34できるようになるにはどうしたら
スペックはこの前の基本情報のスコア550午前免除
0881デフォルトの名無しさん
2008/06/11(水) 20:26:250882デフォルトの名無しさん
2008/06/11(水) 20:30:18いいコードを読んで
いいコードを真似てみる
0883デフォルトの名無しさん
2008/06/11(水) 20:35:280884デフォルトの名無しさん
2008/06/11(水) 20:38:51>>870
>>871
ありがとうございました。
0885デフォルトの名無しさん
2008/06/11(水) 20:39:42を取り出す関数を作っています。
半角英数字だけならなんとか処理できるのですが、日本語が入るとうまく処理できないんです
どんな処理入れるのがベストなのか、お知恵を貸してください。
OS:XPproSP3 環境:VC6.0 SP5
今書いてるのがこんな感じです
int GetFilePath( const char *i_pszOpenFile, //開くファイルのパス
const char *i_pszKey, //探すキー
char *o_pszValue) //返すファイルパス
{
char szBuffer[_MAX_PATH], szLineBuff[_MAX_PATH];
char szHitLine[1024], szDirBuff[_MAX_PATH];
FILE *fp;
char *tp;
fp = fopen(i_pszOpenFile, "r");
if(fp == NULL){
return 0;
}
memset(szLineBuff, 0x00, sizeof(szLineBuff));
memset(szHitLine, 0x00, sizeof(szHitLine));
while(fgets(szLineBuff, 1024, fp) != NULL){
if(strstr(szLineBuff, i_pszKey) != NULL){
strcpy(szHitLine, szLineBuff);
break;
}
}
fclose(fp);
0886デフォルトの名無しさん
2008/06/11(水) 20:40:07memset(szBuffer, 0x00, sizeof(szBuffer);
tp = strtok(szHitLine, "="); //イコールより後ろを取る
tp = strtok(NULL, "=");
sprintf(o_pszValue, "%s", tp);
return 1;
}
int main()
{
char szKey[]="hogedatapath";
char szOpenFile[] = "C:\\hoge\\piyo.txt";
char szRePath[_MAX_PATH];
if(GetFilePath(szOpenFile, szKey, szRePath)){
printf("\nerr");
}else{
printf("\n%s\\ero.exeだよ!", szRePath);
}
return 0;
}
0887デフォルトの名無しさん
2008/06/11(水) 21:17:26VCのwchar_tはUTF-16だから、最後のprintfの代わりに
UTF-16へ変換してwprintfを使うなんて具合でどう?
0888デフォルトの名無しさん
2008/06/11(水) 21:18:310889デフォルトの名無しさん
2008/06/11(水) 21:19:280890デフォルトの名無しさん
2008/06/11(水) 21:22:180891デフォルトの名無しさん
2008/06/11(水) 21:24:530892デフォルトの名無しさん
2008/06/11(水) 21:29:220893デフォルトの名無しさん
2008/06/11(水) 21:29:23なるほどアレか
0894デフォルトの名無しさん
2008/06/11(水) 21:32:39表示させるプログラム」をswitch文を用いて作成せよ。と言われましても・・・唐突だよ。
続けざまにこんな問題も、「キーボードから数値を1つ入力し、実数か整数か自然数か判定し、
当てはまるものすべてを表示するプログラムを作成しなさい」と。
挙句、「フフ、僕の課題は難しいよ(キッパリ)、君達に解けるなんておもってないけどフフンwww(バンバン)」だって・・・
まるっきりどこぞのAAみたいな人だから困る。
でも解けないのは事実だから困る。上の2題、どうかご教授下さい。
0895デフォルトの名無しさん
2008/06/11(水) 21:34:04宿題スレにいくといい
もしくはしばらくまってくれるならかわりにやってあげよう
0896デフォルトの名無しさん
2008/06/11(水) 21:36:05その出題者は馬鹿だが、宿題を解いて欲しいならスレ違いだ
で、自分で解く気はあるの?
0897デフォルトの名無しさん
2008/06/11(水) 21:39:320898デフォルトの名無しさん
2008/06/11(水) 22:02:49挫折→復帰の繰り返しで。
0899894
2008/06/11(水) 22:03:03解き方の参考は何かないかな〜と思いググってみたものの今の僕には理解できないです。
課題如き100%自分で解けなくては話にならんですよね・・失礼しました。
0900デフォルトの名無しさん
2008/06/11(水) 22:26:19switch (((a >= b) & 4) + ((b >= c) & 2) + ((c >= a) & 1)) { ... }とか
if (x - (long)x != 0) ...くらいしか思いつかない
>>897
http://www.kouno.jp/home/c_faq/ くらいしか(ry
0901デフォルトの名無しさん
2008/06/11(水) 22:45:38入力のフォーマットが判然としないのは困ったことだが、はっきり出題に示されていなければ
自分で適切と思う方法に勝手に決めて押し返してしまうのも一つのやり方だ。
大抵の場合、scanf() を使うよりも、1回 Enter を叩くたびに一つの入力と決め付けて、
fgets() で入力を拾ってくるのが一番まちがいが起きにくくて簡単な方法である。
あとは実数であるとわかっているなら atof() か strtod() を使えばよい。
さて1問目だが、switch を使えという出題意図が最大の問題である。
通常 switch とは、列挙されたいくつかの処理のうち一つだけを実行するという論理構造である。
するとおそらく、3つの実数を並べる全ての組み合わせ、つまり6通りの表示処理を作って、
3つの大小の判定によって振り分ける、というアルゴリズムを期待していることが考えられる。
あとは論理演算子が 0 か 1 を返すことを利用して、switch に与える整数値を作り出せばよい。
2問目はちょっと難しい。与えられた文字列が過不足なく特定の数値形式を表していることを
解釈する必要があるからだ。しかし、余計な何かを検出したらエラーと断じてよいことに気付けば、
strtod() とstrtol() を使ったあとで、endptr に返される位置以降の文字をチェックするだけで済む。
あとは整数と自然数の切り分けだけである。
0902デフォルトの名無しさん
2008/06/11(水) 22:56:002問目は数値が入力されるという前提があるから小数点があり、
かつ小数部が0のみではない場合に実数という判定じゃダメかな
0903デフォルトの名無しさん
2008/06/11(水) 22:58:35小数点以下二桁までを有効桁数とみなすかどうかによって違ってくるよね
0904デフォルトの名無しさん
2008/06/11(水) 22:59:260905デフォルトの名無しさん
2008/06/11(水) 23:01:51はっきり出題に示されていなければ
自分で適切と思う方法に勝手に決めて押し返してしまうのも一つのやり方だ
と
0906デフォルトの名無しさん
2008/06/11(水) 23:12:410907デフォルトの名無しさん
2008/06/11(水) 23:14:26わざわざ実数と整数と・・・って言ったってことは数値以外の文字列が来・・・
複素数?いやまさか
0908デフォルトの名無しさん
2008/06/11(水) 23:25:45取り込んだ実数値をprintfで出すんじゃなく、
元の文字列を出力するようにすることか
誤差が出るかもしれないから
0909デフォルトの名無しさん
2008/06/11(水) 23:40:18http://kmaebashi.com/programmer/pointer.html
0910デフォルトの名無しさん
2008/06/12(木) 01:43:12VisualC++2005 をインストールして使ってみたのですが私にはまだ難しくプログラムの実行までもすることができませんでした。
どなたかいいコンパイラを教えてください。
0911デフォルトの名無しさん
2008/06/12(木) 01:44:18dmcもいいコンパイラだぞ。
0912デフォルトの名無しさん
2008/06/12(木) 01:46:33それは作成してからビルド→実行とできますか?
bccとググればでますか?
0913デフォルトの名無しさん
2008/06/12(木) 01:50:48あくまでコンパイラだな
君が言いたいのは開発統合環境か?
やっぱVisual StudioとかBorland Builder、Turbo
フリーならEclipseだろう
0914デフォルトの名無しさん
2008/06/12(木) 01:52:58VisualC++2005を使ってみたのですが難しくて全然使えなかったんです。
Visualstudioとはこれとまた違うものなのですか?
0915デフォルトの名無しさん
2008/06/12(木) 01:54:330916デフォルトの名無しさん
2008/06/12(木) 01:58:23質問し直します
C言語の開発統合環境で初心者におすすめのものはなにがありますか?フリーソフトでお願いします。
C言語の始めよう というものを今まで使っていました。VisualC++2005は難しくて使えませんでした
0917デフォルトの名無しさん
2008/06/12(木) 02:00:49書籍も多いし統合環境の中では一番初心者向けだと思うけど
0918デフォルトの名無しさん
2008/06/12(木) 02:01:17IDEなんてほかにいくらでもあるけど、どれも同じだよ。
0919デフォルトの名無しさん
2008/06/12(木) 02:03:500920デフォルトの名無しさん
2008/06/12(木) 02:05:05というか今までのと勝手が違いすぎてなにがなんやら
学校ではVisualstudioC++ みたいなのを使ってるんですがこれはもの凄い使いやすいです
0921デフォルトの名無しさん
2008/06/12(木) 02:08:070922デフォルトの名無しさん
2008/06/12(木) 02:10:110923デフォルトの名無しさん
2008/06/12(木) 02:11:350924デフォルトの名無しさん
2008/06/12(木) 02:21:300925デフォルトの名無しさん
2008/06/12(木) 02:30:53検索してみたらいくらでも情報ある
Microsoftの製品ね
0926デフォルトの名無しさん
2008/06/12(木) 03:19:10これでも見ておけ。プロジェクトを作ってビルドするところまで。
http://www.kumei.ne.jp/c_lang/net2005/project.htm
0927デフォルトの名無しさん
2008/06/12(木) 03:22:52「VisualstudioC++ みたいなの」がものすごく使いやすく
「VisualC++2005」は難しいとな
その段階なら、まずはそれぞれの環境を明確にしたほうがいい。
で、VCいれたらVisualStudio付属のコマンドプロンプト(というと語弊が歩けど)
のショートカットが作成されているだろうから、それを起動してコンパイラ
(cl.exe)直叩きもいいと思う。
0928デフォルトの名無しさん
2008/06/12(木) 08:29:13ソースがportsなどで容易に手に入りやすくて、勉強になるプログラムは、
どういったものがおすすめでしょうか?
普段からコマンドとして使用頻度が高くて、ソースコードが長くなくていいのかなと思って
bc, wc, cd, ls, catとか、簡単なコマンドのソースをみてみたいんですが、
ソースの手に入れ方がわかりません
自分の調べられる範囲でいくつか当たってみました
jlsは、コンパクトでなかなかいい感じでした
nvi, lynx, w3mなどを落としてみたんですが、ちょっとコードの量が多くて、
今の力量では、ちょっと無理そうです
0929デフォルトの名無しさん
2008/06/12(木) 09:10:54標準コマンドのソースはOSのソースの中にある。
http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/
http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/
portsで取れるかどうかは知らないけど、cvsコマンドで取れるよ。
0930デフォルトの名無しさん
2008/06/12(木) 09:13:32ありがとう
このリンクが欲しかったのです
これでコード読み読みできる
0931デフォルトの名無しさん
2008/06/12(木) 10:34:50「初心者なもので」はあまりいい言い方ではないな。「未熟なもので」とかならわかる。
0932デフォルトの名無しさん
2008/06/12(木) 10:38:410933デフォルトの名無しさん
2008/06/12(木) 10:47:53初心者って言葉に悪いイメージがついてるのかもな。
0934デフォルトの名無しさん
2008/06/12(木) 16:46:430935デフォルトの名無しさん
2008/06/12(木) 16:48:110936デフォルトの名無しさん
2008/06/12(木) 16:50:350937デフォルトの名無しさん
2008/06/12(木) 16:51:170938デフォルトの名無しさん
2008/06/12(木) 16:54:180939デフォルトの名無しさん
2008/06/12(木) 16:55:010940デフォルトの名無しさん
2008/06/12(木) 17:16:470941デフォルトの名無しさん
2008/06/12(木) 18:04:58課題は1から100までの素数をすべて求めるプログラムの作成です。
for文を使うのですが、よくわかりませんでした。ご返答よろしくお願いします。ちなみにLinuxで作成しなければいけません。
0942デフォルトの名無しさん
2008/06/12(木) 18:08:280943デフォルトの名無しさん
2008/06/12(木) 18:08:340944デフォルトの名無しさん
2008/06/12(木) 18:10:520945デフォルトの名無しさん
2008/06/12(木) 18:13:43今できてる分だけでもupすると食いつきが違うぞ。
0946デフォルトの名無しさん
2008/06/12(木) 18:14:401から10までのとき、手計算でやるにはどうしてる?
0947デフォルトの名無しさん
2008/06/12(木) 18:15:49素数判定のプログラミングは見つかったのですが、素数表示のプログラミングは見つかりませんでした。なにかいいサイトとかあったら教えていだだければ幸いです。
0948デフォルトの名無しさん
2008/06/12(木) 18:18:38とりあえず、プログラミングに不慣れなら、総当たりでいいんじゃないの?
>>946さんの質問に答える事からはじまる
0949デフォルトの名無しさん
2008/06/12(木) 18:22:530950デフォルトの名無しさん
2008/06/12(木) 18:29:000951デフォルトの名無しさん
2008/06/12(木) 18:29:47判定して表示すればよくね?
0952デフォルトの名無しさん
2008/06/12(木) 18:31:59#include <stdio.h>
int main(void) {
int flg,i,n,x,cnt;
printf("2 ");
for(n=3,cnt=1; n<=100; n+=2) {
for(i=3,flg=1; i*i<=n; i+=2) {
if(n%i==0) { flg=0; break; }
}
if(flg) {
cnt++; printf("%d ",n);
if(cnt%10==0) {
printf("\n");
cnt=0;
}
}
}
return 0;
}
0953デフォルトの名無しさん
2008/06/12(木) 18:41:42自分が考えたやり方は、まず3つの文字a(割られる数)、i(割る数)、b(a%i=0となる数の数)をおいて、for文とif文を用いる方法です。
#include<stdio.h>
main()
{
int a;
int i;
int b;
for(a=1;a<=100;a++)
{
for(i=1;i<=100;i++)
{
for(b=1;b<=a;b++)
{
if(a%i==0 && b==2)
{
printf("%d");
}
}
}
}
return(0);
}
0954デフォルトの名無しさん
2008/06/12(木) 18:51:28こんなんでどうよ、例えば、、だけど。
for (a = 2; a <= 100; ++a)
{
for (b = 2; b < a; ++b)
{
if (a % b == 0)
{
break;
}
}
if (b == a)
{
printf("%d ", a);
}
}
0955デフォルトの名無しさん
2008/06/12(木) 19:30:590956デフォルトの名無しさん
2008/06/12(木) 19:45:23単純に奇数で奇数を割っていくのか、その辺の手法についてもくやしく
0957デフォルトの名無しさん
2008/06/12(木) 20:13:53int main(void){
unsigned int x = 100, i, j;
printf("2\n");
for(i = 3; i <= x; i += 2){
for(j = 3; j * j <= i && i % j; j += 2);
if(j * j > i) printf("%u\n", i);
}
return 0;
}
0958デフォルトの名無しさん
2008/06/12(木) 20:20:050959デフォルトの名無しさん
2008/06/12(木) 20:25:11すいませんまだ入門書レベルなもんでして・・・どうかくのがいいんでしょう?
0960デフォルトの名無しさん
2008/06/12(木) 20:28:310961デフォルトの名無しさん
2008/06/12(木) 20:28:450962デフォルトの名無しさん
2008/06/12(木) 20:30:000963デフォルトの名無しさん
2008/06/12(木) 20:31:280964デフォルトの名無しさん
2008/06/12(木) 20:31:29自分の書いたプログラムは効率は悪いが間違ってはいないということでしょうか?
0965デフォルトの名無しさん
2008/06/12(木) 20:34:52このループの条件を抜けたということは、どちらかが偽になった。
そこで、割り切れたのではなく j*j<=i すなわち j*j>i の条件を満たす
のであれば、素数と判定しておkかと。
0966デフォルトの名無しさん
2008/06/12(木) 21:11:12printf("2¥n");
for(i=3;i<=MAX;i+=2){
for(j=3; (j*j<=i)&&(k=i%j) ;j+=2);
if(k==0) continue;else printf("%d¥n",j);
}
とすると間違い(何故か?)
0967デフォルトの名無しさん
2008/06/12(木) 21:34:45printf("%d¥n",j ) ×
printf("%d¥n",i) ◎
0968デフォルトの名無しさん
2008/06/12(木) 21:51:31printf("2 3\n") ○
0969デフォルトの名無しさん
2008/06/12(木) 22:00:14unsigned MAX=10000,i,j,k=1; ◎
0970デフォルトの名無しさん
2008/06/12(木) 22:02:020971デフォルトの名無しさん
2008/06/12(木) 22:12:40int main(void) {
int i,n;
printf("2 3 ");
for(n=5; n<=100; n+=2) {
for(i=3; (n/i>i)&&(n%i); i+=2);
if(n%i) {
printf("%d ",n);
}
}
return 0;
}
0972デフォルトの名無しさん
2008/06/12(木) 22:20:10ん〜?素数判定のとこおかしくない?
0973デフォルトの名無しさん
2008/06/12(木) 22:26:260974デフォルトの名無しさん
2008/06/12(木) 22:32:230975デフォルトの名無しさん
2008/06/12(木) 22:50:33APIはDirectXかwindous API を使おうとおもいます。
OSはVISTAです。
すいません、ハードウェアとドライバとはどのようなものなのかよくわかりません。
0976デフォルトの名無しさん
2008/06/12(木) 23:26:30Waveform-Audio Interfaceを使うんではないかな?
http://www.microsoft.com/japan/msdn/directx/techart/audiooverview.aspx
のサウンドキャプチュアを参考
他にもいろいろな方法があるようだ。
0977デフォルトの名無しさん
2008/06/12(木) 23:37:56ありがとうございます。
少し調べてみます。また、わからなかったら来るのでその時はよろしくおねがいします。
0978デフォルトの名無しさん
2008/06/12(木) 23:52:32おそらくこんな流れかと・・・
マイク
↓
waveInxxx <- Waveform-Audio Interface
↓
ファイルに落とす(時系列データ)
↓
FFTで時系列データを周波数ごとに変換
↓
ファイルに落とす(周波数ごとのデータ)
かな。FFTはネットで調べればコードが載っている。
0979デフォルトの名無しさん
2008/06/13(金) 00:14:100980デフォルトの名無しさん
2008/06/13(金) 00:46:11FFTせんでもそのままファイルにすりゃいいじゃないか。
PCMも忘れないでください
0981デフォルトの名無しさん
2008/06/13(金) 15:01:14このあたりを参考に↓
http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/audiocapture.html
これ以上はスレ違いだからやめとく
0982デフォルトの名無しさん
2008/06/13(金) 20:42:13c99規格の各種コンパイラでの対応状況がいまいちってことは知りましたがほかに何かありますか?
0983デフォルトの名無しさん
2008/06/13(金) 20:44:100984デフォルトの名無しさん
2008/06/13(金) 20:44:34それが唯一かつ最大の欠点。
付け加えるとしたらそのせいでマイナーで知らない人も多いということくらい。
0985デフォルトの名無しさん
2008/06/13(金) 20:45:13それくらいならC++使うよ!ってなる
0986デフォルトの名無しさん
2008/06/13(金) 21:25:070987デフォルトの名無しさん
2008/06/13(金) 21:31:280988デフォルトの名無しさん
2008/06/13(金) 21:37:30例を教えてください。C89でどんな例で困るのかに興味があります。
0989デフォルトの名無しさん
2008/06/13(金) 21:41:14C89→C99で何が変わったのか、追加ではなく、改善されたと思しき
内容があれば、それがC89で困っていた点であろう事は想像に難くないよね
0990デフォルトの名無しさん
2008/06/13(金) 21:42:11コンパイラの対応状況を私が思って頼り重要視されていただけなんですね
>>987
困るってほどじゃないが、途中での宣言だとか
動的配列だとかあるじゃないか
0991デフォルトの名無しさん
2008/06/13(金) 21:44:56C89だと変数宣言は全部最初にしなきゃならない
0992デフォルトの名無しさん
2008/06/13(金) 21:48:47でも、(もちろん見苦しくなるけど)ブロックを途中に書けば
ある程度は何とかなりますよね。それに、ブロックなら
その変数が不要になった後(というかブロックを閉じた後)では
見えなくなるから、ブロックを使う方がより安全な気がします。
0993デフォルトの名無しさん
2008/06/13(金) 21:51:22そうですね
0994デフォルトの名無しさん
2008/06/13(金) 22:22:38また、//コメントやbool型の採用も保守性への貢献が大きい。
しかし、それらはc99じゃなくても使えてしまう現実が普及に歯止めを掛けている気がしなくもない。
0995デフォルトの名無しさん
2008/06/13(金) 23:17:410996デフォルトの名無しさん
2008/06/13(金) 23:24:19ぐぐってみなよ
0997デフォルトの名無しさん
2008/06/13(金) 23:26:500998デフォルトの名無しさん
2008/06/13(金) 23:33:59がよくわかんないんですけど単精度型・・・ってfloatのことですよね
はやいの?
0999デフォルトの名無しさん
2008/06/13(金) 23:35:24http://oku.edu.mie-u.ac.jp/~okumura/algo/archive/algo.lzh
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。