C言語なら俺に聞け(入門篇) Part 18
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/08/16(木) 06:39:50・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 17
http://pc11.2ch.net/test/read.cgi/tech/1185286631/
教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 94代目
http://pc11.2ch.net/test/read.cgi/tech/1185452895/
0002デフォルトの名無しさん
2007/08/16(木) 06:40:23Part 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/
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
0003デフォルトの名無しさん
2007/08/16(木) 06:41:080004デフォルトの名無しさん
2007/08/16(木) 06:42:58/ > でもそんなの関係ねぇ!
< \ そんなの関係ねぇ!
〇/ はい!
/| オッパッピー!!
/>
http://ja.wikipedia.org/wiki/%E5%B0%8F%E5%B3%B6%E3%82%88%E3%81%97%E3%81%8A
> 元々「オッパッピー」は卑猥な言葉の略語だったらしいが、他の芸人にダメ出しを受けて
> 「オーシャンパシフィックピース」に変更した。
0005997
2007/08/16(木) 06:43:47前スレの>>998さん返答ありがとうございます。その書き込み不可属性というのは
どうやったら解除できるんでしょうか?
0006デフォルトの名無しさん
2007/08/16(木) 06:46:19ファイルを右クリックしてプロパティを開く
Windowsなら読み取り専用ってチェックボックスのがある
0007デフォルトの名無しさん
2007/08/16(木) 07:13:18C++使えってことですよね?
自分で書いても良いですけど効率悪いので...
皆さんはどうされてます?自分で全部かいてます?
0008デフォルトの名無しさん
2007/08/16(木) 07:14:280009デフォルトの名無しさん
2007/08/16(木) 08:17:50マクロでも実装はできるけど、エレガントとは言いがたい。
0010デフォルトの名無しさん
2007/08/16(木) 08:37:31Linuxでデバイスドライバかいてると
マクロで実装した汎用リストがあったりするんですが
それ使えるのはもちろんLinuxカーネルだけだから
それの汎用バージョンみたいなのないのかなぁ...っと
0011デフォルトの名無しさん
2007/08/16(木) 08:45:300012デフォルトの名無しさん
2007/08/16(木) 08:47:22こんなの見つけた
http://www5d.biglobe.ne.jp/~noocyte/Programming/CMacros.html
00135
2007/08/16(木) 17:30:09また質問なのですが、Visual C++:2005 の設定を間違えて保存などした場合、
どうすれば初期設定にもどせるんでしょうか?
0014デフォルトの名無しさん
2007/08/16(木) 17:32:210015デフォルトの名無しさん
2007/08/16(木) 17:56:050016デフォルトの名無しさん
2007/08/16(木) 18:00:46男なら絶対そうやろ?隠さんでええよ、バレとるからw
0017デフォルトの名無しさん
2007/08/16(木) 19:17:350018デフォルトの名無しさん
2007/08/16(木) 22:19:2800195
2007/08/16(木) 22:23:27なんかマイクロソフト公式HPに
Visual SourceSafe エクスプローラのプロジェクト ペインで削除されたファイルが所属していたプロジェクトを選択します。
[ファイル] メニューで [プロパティ] をクリックし、[削除された項目] タブをクリックします。
復元するファイルを選択します。
[復元] をクリックします。
って書いてあるけど、これどうやるんでしょうか?
0020デフォルトの名無しさん
2007/08/16(木) 22:52:50再インスコ
0021デフォルトの名無しさん
2007/08/16(木) 23:02:08それは Visual SourceSafe がインストールされてないとどうにもならない
Visual SourceSafe エクスプローラは Visual SourceSafe の本体の一部だしな
っつーか
その「書いてあるけど、」の部分は SourceSafe の中に格納したデータを削除した時に
SourceSafe の中の「ごみ箱」的な場所からデータを復元させるための手順なんだが
この際再インスコに同意しておく
0022デフォルトの名無しさん
2007/08/17(金) 10:59:14int a[3][4];
int *p = a[0];
のように、int * 型のポインタ p を a[0] に初期化すれば、 a[i][j] は p[i*4+j]
と書いても同じことになります。ネットのポインタ説明よりコピペなのですが、
a[i][j] は p[i*4+j]この部分が良く分かりません。[i*4+j]の詳しい解説を
していただけませんか?
0023デフォルトの名無しさん
2007/08/17(金) 11:04:55a[3][4]は、メモリ上(?)で
a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[1][0]、a[1][1]、a[1][2]、・・・・
という順番になっているから。
0024デフォルトの名無しさん
2007/08/17(金) 11:11:510025デフォルトの名無しさん
2007/08/17(金) 11:16:54と共通してるんですか?なんか悩んでる内に[i*4+j]を覚えてしまった。
分からないのならまるおぼえしてしまおうかなw
0026デフォルトの名無しさん
2007/08/17(金) 11:27:400027デフォルトの名無しさん
2007/08/17(金) 11:51:08入門書を一通り読み、簡単なアプリも幾つか作りましたが、
今ひとつ他人のソースを追うのが苦手です。
そこで、数読んで慣れようと考えました。
もしご存知でしたら、ソースを沢山読めるサイトを教えていただきたく。
0028デフォルトの名無しさん
2007/08/17(金) 11:55:24002922
2007/08/17(金) 12:08:01考えてもさっぱりなんで公式として覚えてしまおうと思います。
003027
2007/08/17(金) 12:17:12ライブラリやフリーのソースについては、
コードリーディングという本で読んでみたのですが、
規模が大きすぎる&仕様がソースのみで、今ひとつでした。
003122
2007/08/17(金) 12:23:570032デフォルトの名無しさん
2007/08/17(金) 12:30:03冗談だろwww
a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[1][0]、a[1][1]、a[1][2]、・・・・
==a[0] 、==a[1] 、==a[2] 、==a[3] 、==a[4] 、==a[5] 、==a[6] 、・・・・
あとは分かるよな?
003322
2007/08/17(金) 12:58:272次元配列をポインタでを表す場合、感覚で言うと繰り上げないでそのまま数を加算
するんですね。
0034デフォルトの名無しさん
2007/08/17(金) 13:08:14int *p = a じゃ警告出るだろ。
a[0] か *a か (int*)a じゃないと。
003522
2007/08/17(金) 13:10:170036デフォルトの名無しさん
2007/08/17(金) 13:13:52そうだな。スマン
003719
2007/08/17(金) 14:03:38アクセス権限がありません、管理者に許可をもらってください。ってでる
どうしたらいい?
0038デフォルトの名無しさん
2007/08/17(金) 14:07:09ものすごくアレだ
もしかしてVista使ってて
VisualStudioにまだ公式Vista用パッチ当ててないか
ソースを\Program Files\の下に保存かけてしまってる
とか
なんか
0040デフォルトの名無しさん
2007/08/17(金) 14:55:58それ以上はVisualStudio関連スレでやって下さいな。
0041デフォルトの名無しさん
2007/08/17(金) 14:59:10ラスト。これ以上は判らんスよ
MSのサイトで 2005 update SP1 vista で検索しとけば大概わかるっしょ
あとは別スレで
0042デフォルトの名無しさん
2007/08/17(金) 17:41:010043デフォルトの名無しさん
2007/08/17(金) 23:10:0930過ぎの女性だとしても苦笑もんだな。
0044デフォルトの名無しさん
2007/08/17(金) 23:51:08配列は、大きな連続した領域として、メモリ上に確保されます。
a[3][4]とb[12]はメモリ上では同じ様に存在します。
仮に a == b(同じアドレス)だとしたら。
&a[0][0] == &b[0]
&a[0][1] == &b[1]
&a[0][2] == &b[2]
&a[1][0] == &b[4]
&a[2][0] == &b[8]
&a[2][3] == &b[11]
の様に対応します。
aの右側の添字が1増える毎に、bの添字が1増え、
aの左側の添字が1増える毎に、bの添字が4増えるのが分かるとおもいます。
お察しの通り、4は要素数です。
したがって a[i][j] は b[i*4+j] です。
2次元配列は1元配列を、ただ折り畳んだものと考えれば分かりやすいでしょうか?(下の例で同じ文字同士が対応していると思ってください)
1次元配列:a[12]
0123456789AB
2次元配列:a[3][4]
0123
4567
89AB
0045デフォルトの名無しさん
2007/08/17(金) 23:53:280046デフォルトの名無しさん
2007/08/18(土) 00:01:34・Javaはそれなりにやってる。
・Cは「触ったことある」レベル。ポインタのポインタって頭破壊する気? マクロとか#defineぐらいしか知りませんが?
・内容は多少ハイレベルでも大丈夫、というかみっちりやってくれる本の方が嬉しい。
・演習がしっかりある奴がいい。むしろ多少重いぐらいで丁度良い。
お願いしますだ
0047デフォルトの名無しさん
2007/08/18(土) 00:52:41規格書。
・プログラミング初心者向けではない。
・それを知るために読むのだろ。
・内容はハイレベルだが漏れもなければ間違いもない。
・世の中の全てが演習のテーマだ。
0048デフォルトの名無しさん
2007/08/18(土) 01:07:080049デフォルトの名無しさん
2007/08/18(土) 01:55:23C++だけど「独習C++」なら持ってる。演習付き。
これのC版はどうだろう?(俺は読んだことないけど)
書店で片っ端から開いてみたら?
ところで、ポインタのポインタで頭破壊なら、二次元配列でも頭破壊か?
0050デフォルトの名無しさん
2007/08/18(土) 03:29:35独習Cは書店にあったなー。平積みだったし、定評ある本なんだろうなやっぱり。thx
2次元配列は大丈夫、かな? ポインタで要素にアクセスしようとするのは慣れないけど。
基本的に、ポインタ周りの使い方と理解が全くだめ。Javaにポインタがないからだねw
参照という意味ではJavaでも無意識で使ってるのは確かだけど、Cだときっちり意識して使わないと駄目な感じに見える・・・
0051デフォルトの名無しさん
2007/08/18(土) 04:15:36int ia;
while(ia != -999){
scanf("%d",&ia);
}
これを実行させて入力時に「a」とかを入れると無限ループするのですが
なぜでしょうか?
もちろんchar型ではないのでこんなんしたらダメだと思うんですが
a のアドレスが ia に代入されるんだったら-999じゃないから
無限ループにならずにまた入力になると思ったんですが・・
なんでだろぅ・・
0052デフォルトの名無しさん
2007/08/18(土) 04:24:30> scanf()で読み込み不一致が起こる問題では、上記 「atoi()、atol()、atof()」を使って回避します。
> 読み込み不一致は、scanf()を for や while などのループの中で用いた場合、入力バッファに
> 残されたデータを永遠に受け付けないため無限ループになってしまい意外に深刻な問題となります。
> そのためデータを一旦、scanf("%s", ○)や gets()を用いて文字列として入力し、それから上記の
> 変換関数を用いて期待するデータ型に変換するのです。
int i = 0;
char a[20];
while(i != -1) {
printf("整数値を入力してください(終了条件:-1)\n");
scanf("%s", a);
i = atoi(a);
}
0053デフォルトの名無しさん
2007/08/18(土) 04:30:09超すばやいお返事&回答ありがとうございます(@w@
なるほど・・これをすると入力を永久に受け付けなるのですね
しかもサイトまで教えていただいてありがとうございます!
このサイトいいですねw勉強してきます
0054デフォルトの名無しさん
2007/08/18(土) 06:22:06#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int i;
srand((unsigned)time(NULL));
for(i = 0; i < 10; i++){
printf("%d\n", rand() % 100);
}
return 0;
}
でおkと書いてるんです。
コンパイルは通ったのですがこの部分の
printf("%d\n", rand() % 100);
これってもし 0 がきたら0割りで無限ループになるんでしょうか?
0がくることはないですか?
自分は
printf("%d\n", (rand() +1 % 100);
のほうがいいんじゃないかと思ったのですがどうなのでしょうか?
0055デフォルトの名無しさん
2007/08/18(土) 06:22:34だからそのサイトは地雷だって。果てしなく間違いが見つかる。
0056デフォルトの名無しさん
2007/08/18(土) 06:25:29馬鹿もん、0割る100は0だ。
005751
2007/08/18(土) 06:28:180058デフォルトの名無しさん
2007/08/18(土) 06:29:06別に誰でもいいから自分宛のレスを読んでレスしてから言い訳しろ。
005951
2007/08/18(土) 06:33:35今 0/100やっても大丈夫でした^^;申し訳ありません。
学校でCOBOLとC、同時にやってるのでごっちゃになってしまいました。。
(COBOLは0を割ると無限ループになっちゃうので・・)
一回試してから聞くようにします^^;ごめんなさい
0060デフォルトの名無しさん
2007/08/18(土) 06:41:01そうだっけ? どうでもいいけど常識的には有り得ないんだけど。
006151
2007/08/18(土) 06:42:56あぅ、うちの学校のホストだけなのか´ω`;
GS−8200って富士通のホストです
0062デフォルトの名無しさん
2007/08/18(土) 06:46:09--
COBOL アプリケーションプログラムを強制終了するには、2 通りの方法がありま
す。
方法 1
0 で 0 を割る COBOL アプリケーションプログラムを作成します。
0063デフォルトの名無しさん
2007/08/18(土) 06:46:36古代の処理系ならありがちだよ。
0064デフォルトの名無しさん
2007/08/18(土) 06:50:28ゼロを除算する事が問題になるなんて聞いたこと無いな
006551
2007/08/18(土) 06:54:47100/0にしたらコンパイルエラーになった。
完全に私の覚え間違いでした・・ちょっとROMって勉強しなおします・・
0066デフォルトの名無しさん
2007/08/18(土) 10:31:490067デフォルトの名無しさん
2007/08/18(土) 10:35:22そういう頭でっかちの考え方を捨てること
0068デフォルトの名無しさん
2007/08/18(土) 10:37:580069デフォルトの名無しさん
2007/08/18(土) 10:46:27人によってはコード、文字列を入力しているようにしか思えないだろうけど
汎用電子計算機に処理してもらっていること、どのように処理されているのかとか。
そういうのを知ると、より適切なプログラミングが出来るようになる。
0070デフォルトの名無しさん
2007/08/18(土) 11:12:26なんか、そのサイトの作者が自作自演で宣伝してるんじゃないかってかんぐりたくなるな。
0071デフォルトの名無しさん
2007/08/18(土) 11:19:220072デフォルトの名無しさん
2007/08/18(土) 20:06:55/ > でもそんなの関係ねぇ!
< \ そんなの関係ねぇ!
〇/ はい!
/| オッパッピー!!
/>
全部わすれておっぱっぴー!
0073デフォルトの名無しさん
2007/08/18(土) 20:29:38realloc()についてなんですが、このメモリ領域拡大縮小関数の
P186の定義を見てあきれたんですが、
新規にメモリを確保して、memcpy()で内容をコピーしてるんですが
領域を縮小するときはともかく、領域を拡大した場合、
元のメモリ領域の外までコピーしていますよね。
これってエラーにならないんですか?
確かに書き換えているわけではないので
問題ないのかもしれませんが、これじゃメモリを別アプリから覗き見放題じゃ
ないですか。本当のところどうなんでしょうか。単にわたしの資料が古いだけかな。
それと今、C++でrenew()みたいな関数作ろうと思ったんですが、
元のメモリ領域のサイズがわからないので難儀しています。
何かよい解決策がありましたらご教授ください。
0074デフォルトの名無しさん
2007/08/18(土) 20:31:220075デフォルトの名無しさん
2007/08/18(土) 20:37:500076デフォルトの名無しさん
2007/08/18(土) 20:40:540077デフォルトの名無しさん
2007/08/18(土) 20:58:29標準の話じゃなくて、なにかの本のP186に載ってる実装例の話でしょ。
0078デフォルトの名無しさん
2007/08/18(土) 21:03:540079デフォルトの名無しさん
2007/08/18(土) 21:04:232文字目だけコピーするまたは3文字目から5文字目をコピーするといった方法ありますか?
strcpy()だとできない・・・
0080デフォルトの名無しさん
2007/08/18(土) 21:07:360081デフォルトの名無しさん
2007/08/18(土) 21:11:28ANCI C言語辞典です。
ちなみに、XPでBCCのC++でnew使って同様にmemcpyしてみましたがエラーにならないようですね。
char* p1;
char* p2;
p1 = new char[10];
memset(p1, 'A', sizeof(char)*10);
p2 = new char[1000000];
memcpy(p2, p1, sizeof(char)*1000000);
delete p1;
delete p2;
0082デフォルトの名無しさん
2007/08/18(土) 21:14:25そりゃエラーにならんだろう
範囲外を書き換えているわけじゃないし
0083デフォルトの名無しさん
2007/08/18(土) 21:26:36オッパッピーのピーだよ、きっと
0084デフォルトの名無しさん
2007/08/18(土) 21:27:46こんなんでどうでしょう
const int siz = 3;
char s[] = "ABCDEFG";
char* p;
p = new char[siz];
memset(p, '\0', siz);
p[0] = s[1];
printf("2文字目:[%s]\n", p);
memset(p, '\0', siz);
memcpy(p, &s[2], sizeof(char)*3);
printf("3文字目から5文字目:[%s]\n", p);
memcpy(p, &s[2], &s[5] - &s[2]);
printf("3文字目から5文字目:[%s]\n", p);
delete p;
0085デフォルトの名無しさん
2007/08/18(土) 21:29:43やっぱりそうですか。了解しました
0087デフォルトの名無しさん
2007/08/18(土) 23:18:53間違っても>84を真似してはいけません。それはCではありません。
--
bool strExtract(char * dest, const char * str, unsigned from, unsigned to)
{
if (str == NULL || dest == NULL) return false;
unsigned length = strlen(str);
if (from - 1 >= length || from < to) return false;
length = to - from + 1;
sprintf(dest, "%*.*s", length, length, str + from - 1);
return true;
}
char buf[100];
char str[] = "ABCDEFG";
// 2文字目をコピーした文字列を得る
strExtract(buf, str, 2, 2);
// 3-5文字目をコピーした文字列を得る
strExtract(buf, str, 3, 5);
0088デフォルトの名無しさん
2007/08/18(土) 23:30:440089デフォルトの名無しさん
2007/08/18(土) 23:36:0484が初心者(というか、自称初級者)で87が悪意のある(というか、臍曲がりの)上級者かと。
0090デフォルトの名無しさん
2007/08/18(土) 23:36:13#include <string.h>
int main(){
char a[]="ABCDEFG";
char b[10];
/* 3文字目から5文字目こぴー */
strncpy(b, a+2 ,3);
b[3]='\0';
/*確認*/
printf("%s.%s\n", a, b);
return 0;
}
0091デフォルトの名無しさん
2007/08/18(土) 23:43:04realloc()の返り値は、渡した引数と必ずしも一致していない。
必要なら、別の領域を探してきてそちらに移す。
というか、
>>これじゃメモリを別アプリから覗き見放題じゃないですか。
物理アドレスと論理アドレスの違いを勉強してくれ。
0092デフォルトの名無しさん
2007/08/18(土) 23:49:3490が普通の書き方だけど、Windows環境なら、windows.hをインクルードして、
lstrcpyn()を使う方法も。
009387
2007/08/18(土) 23:57:12--
- if (from - 1 >= length || from < to) return false;
+ if (to - 1 >= length || from < to) return false;
--
toで制限しておけばfromは必然的に制限の必要がないのを逆にしてしまった。
toで制限するなら、%*.*sも冗長と言えば冗長か。%.*sにすれば引数のlengthが一つですむ。
>>88>>89
何さ。
>>90>>92
strncpy()の仕様を覚えるくらいならsprintf()を使いこなした方が潰しが利きそうな気がするが。
009490
2007/08/19(日) 00:07:12>strncpy()の仕様を覚えるくらいならsprintf()を使いこなした方が
両方覚えるのが良いかと思います。後回しにするのならまだしも、
少なくともこの時点で切り捨てる必要は無いでしょう。
両方知れば、使い分ける事ができますから...
0095デフォルトの名無しさん
2007/08/19(日) 00:07:46覚えるのは「strcpy()の長さ制限のあるバージョンがあったな」ってくらいでいいでしょ。
使うときは、仕様を確認すればいい。
0096デフォルトの名無しさん
2007/08/19(日) 00:15:29動かしたいときには、よさそうな気もするけど、データの異常に気づかない
可能性があるのでおすすめではないです。
sprintは普通に重い処理だからスピードとか気にするところでは
避けたいですが、まぁ使いやすいっちゃ使いやすいですね。
memsetで初期化するのも褒められたやり方じゃないよな。
0097デフォルトの名無しさん
2007/08/19(日) 00:20:53strncpy()でデータ異常に気づかないって、どういうケースで?
0098デフォルトの名無しさん
2007/08/19(日) 00:22:24その様な状況ではsprintfが適切でしょ。
対して,strcpy,strncpyは文字列のコピーが目的の関数ってことで、
>>79の様なケースでは、関数本来の目的にあってるかと思う。
0099デフォルトの名無しさん
2007/08/19(日) 00:26:17strncat()を使ったほうが速度的には有利だけど、書き方が直感的ではなくなる。
dst[0] = '\0';
strncat(dst, src, n);
0100デフォルトの名無しさん
2007/08/19(日) 00:26:50文字列終端の'\0'を忘れるケースがありますね。
0101デフォルトの名無しさん
2007/08/19(日) 00:29:28コピー元の文字列が、0がついてないような場合でも、長さ制限があるから無事に処理ができてしまうということ?
それは(この文脈では)sprintf()でも同じことでは?
0102100
2007/08/19(日) 00:49:40送り側の文字列に0が無ければそうですが、送り側に0があった場合でも、
strncpyの場合、送り側が受け側の長さ(与えた長さ制限)以上の場合、付きません。
対して、sprintfならば0は自動的につきます。受け側に起きる問題ですね。
ちなみに >>100 != >>96 ですので、
>>96さんのいう異常が同じ事を言ってるのかは、わかりませんが。
0103デフォルトの名無しさん
2007/08/19(日) 00:50:34\0終端してくれないってことだろ
0104デフォルトの名無しさん
2007/08/19(日) 01:14:06strncpy(d, s, sizeof(d));
ってやったときにdは0終端されないっす。
こういう挙動なのでとっても使いづらいっす。
使いどころはないこともないんだけど、
まず使うことはないですね。
0105デフォルトの名無しさん
2007/08/19(日) 01:34:210106デフォルトの名無しさん
2007/08/19(日) 01:35:460107デフォルトの名無しさん
2007/08/19(日) 01:39:40strncpyの返り値が d じゃなくて、コピー後の末尾だったら良かった。
と思ったことがある。そうすれば、次々に連結する処理が楽かなーと。
まあ、それくらいなら自作出来るけど。
0108デフォルトの名無しさん
2007/08/19(日) 02:01:33いいのかどうか分からないけど
少し重いが
同じツールでJavaも開発できるエクリプスなんかどうでしょう?
コマンドプロンプトしかありませんが
0109デフォルトの名無しさん
2007/08/19(日) 04:40:420110デフォルトの名無しさん
2007/08/19(日) 14:05:01なでしことかドリトルでは限界があるの?プログラマーは生涯にたくさんの言語を使うらしいけど
DとかJavaとかいろいろありすぎてどれをやればいいのか分からない、とりあえずCからやってるけど
0111デフォルトの名無しさん
2007/08/19(日) 14:08:05Cはその次がいいと思うよ
0112デフォルトの名無しさん
2007/08/19(日) 14:20:160113デフォルトの名無しさん
2007/08/19(日) 14:24:360114デフォルトの名無しさん
2007/08/19(日) 14:27:170115デフォルトの名無しさん
2007/08/19(日) 14:33:570116デフォルトの名無しさん
2007/08/19(日) 14:38:28Cより型付けが強いし何かあれば例外投げて原因に気づきやすい。
あとGCがあるからメモリ周りは比較的無頓着にできる。
もちろんその後もCはやらないでいいって言ってるわけじゃないよ。
0117デフォルトの名無しさん
2007/08/19(日) 16:23:01strlcpy が標準になればいいのに。
0118デフォルトの名無しさん
2007/08/19(日) 16:34:54結局ラッパー関数書くハメになるし
0119デフォルトの名無しさん
2007/08/19(日) 18:11:09for(int x=40; x<640; x=x+40) DrawLine(x,0,x,480,GetColor(64,64,64));
for(int y=40; y<480; y=y+40) DrawLine(0,y,640,y,GetColor(64,64,64));
DrawCircle(320,240,30, GetColor(255,0,0),TRUE);
}
ていうプログラムが本に載ってたんですがそのままやっても
> C:\borland\bcc55\Bin\make.exe -fDebug\dxtest.mak TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -L..\DxLib -DDEBUG -nDebug -I..\DxLib;C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib -c C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp:
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 3: 未定義の関数 'DrawLine' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 3: 未定義の関数 'GetColor' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 未定義の関数 'GetColor' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 未定義の関数 'DrawLine' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 未定義の関数 'DrawCircle' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 未定義の関数 'GetColor' を呼び出した(関数 PhysicsDraw() )
エラー E2451 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 未定義のシンボル TRUE(関数 PhysicsDraw() )
*** 7 errors in Compile ***
** error 1 ** deleting Debug\dxtest.obj
Make End !! (Elapsed time 0:00.296)
ってエラーが出るんです。どうしてでしょうか?
ちなみに今日プログラム始めたばかりです。
0120デフォルトの名無しさん
2007/08/19(日) 18:40:01それはコードの一部だからコンパイルできないよ。
どっかにコードの全部が掲載してあるんじゃね。
もしくはCDに入ってるか。
つか、本文も読めばいいのに。
0121名無しさん@お腹いっぱい
2007/08/20(月) 02:31:35microsoft.net Framework version 2.0 再頒布可能パッケージ
microsoft.net Framework version 2.0 SDK 日本語版
をダウンロードしたのですが友達の話によると
microsoft.net Framework version 2.0 日本語版 language pack
が必要らしいのですがmicrosoftの公式サイトに行っても見つからないのですが
どうやったら手に入るのでしょうか?
すごい初歩的な質問ですいません
0122デフォルトの名無しさん
2007/08/20(月) 02:38:44悪いことは言わんから Visual C++ 2005 Express Edition 使っとけ。
0123デフォルトの名無しさん
2007/08/20(月) 10:45:330124デフォルトの名無しさん
2007/08/20(月) 10:47:250125デフォルトの名無しさん
2007/08/20(月) 11:10:49あー、それ俺も思った。
strncpy(d, s, sizeof(d))[sizeof(d)] = '\0';
↑ ↑
ここがなんかクドイ
0126デフォルトの名無しさん
2007/08/20(月) 11:39:29くどいかどうか以前に、いろんな意味で間違いすぎ。
012751
2007/08/20(月) 12:41:28こないだ友人と話してたのですが(どちらも現場経験なし)、
if文に{}っていりますか?
ifのあと文が1つなら{}は省略してよし、と書いてあるので友人はいらないといいます。
けど私は読みやすいから{}つけたい人間です。
こんな感じです。
if(ia==0){
printf("HelloWorld\n");
}
{}はつけないほうがいいのでしょうか?
0128デフォルトの名無しさん
2007/08/20(月) 12:48:48宗教論だな。正直どっちでもいい。
いろいろな人がソースコードを編集するなら
インデントとか括弧とかはツールで一括変換するようにすればおk
GreatCode とか
0129デフォルトの名無しさん
2007/08/20(月) 12:53:52if(boo) zoo=0;
else // !fooのつもり
zoo=1;
みたいなのをやらかしそうなら、付けといた方がいいかな、程度のもんだと思う。
0130デフォルトの名無しさん
2007/08/20(月) 12:58:20つまり、
if (foo) bar();
はOKだけど
if (foo)
bar();
はダメ。
勿論、
if (foo) {bar();}
も
if (foo) {
bar();
}
もOK。
0131デフォルトの名無しさん
2007/08/20(月) 12:58:51>if文に{}っていりますか?
つけてもつけなくても文法上間違いではない。
>{}はつけないほうがいいのでしょうか?
つけたほうがいい。
0132デフォルトの名無しさん
2007/08/20(月) 13:07:31>いろんな意味
kwsk
0133132
2007/08/20(月) 13:10:15× sizeof(d)
○ sizeof(d)-1
0134デフォルトの名無しさん
2007/08/20(月) 13:11:37えへへ
0136デフォルトの名無しさん
2007/08/20(月) 13:18:09dが配列だと思っていいのかな?
だったら
sprintf(d, "%.*s", sizeof(d) - 1, s)
でいいじゃん。
0137デフォルトの名無しさん
2007/08/20(月) 13:25:540終端の為だけに態々そんな余計な文字列パースさせるの?
0138デフォルトの名無しさん
2007/08/20(月) 13:31:17余計なメンテナンスに時間取られるくらいならありじゃね?
パフォーマンスが問題になるようなら入れ替えればいいことだし。
# まさかMS-DOSの時代みたいにprintf()系をリンクしないでサイズ節約なんて考えないだろうし。
0139デフォルトの名無しさん
2007/08/20(月) 18:58:08文がひとつのケースでも括弧をつけたほうがミスがなくなる。
0140デフォルトの名無しさん
2007/08/20(月) 20:58:520141デフォルトの名無しさん
2007/08/20(月) 21:18:10どーしても自分語りがしたい阿呆が多くてなかなか収束しません。
0142デフォルトの名無しさん
2007/08/20(月) 21:19:170143デフォルトの名無しさん
2007/08/20(月) 21:35:48|>
((
〇∧〃
/ > でもそんなの関係ねぇ!
< \ そんなの関係ねぇ!
〇/ はい!
/| オッパッピー!!
/>
チントンシャンテントン♪
チントンシャンテントン♪
0144デフォルトの名無しさん
2007/08/20(月) 22:10:270145デフォルトの名無しさん
2007/08/20(月) 22:57:39一行のときは{}は無いほうがいいよ。
10年に一度もしないようなミスのために、読みやすさを損なうことはない。
コードを大量に書いてる人は、省略する派が多いし。
0146デフォルトの名無しさん
2007/08/20(月) 23:21:380147デフォルトの名無しさん
2007/08/20(月) 23:39:51コードを大量に書いてる人ってだれ?
0148デフォルトの名無しさん
2007/08/20(月) 23:54:270149デフォルトの名無しさん
2007/08/20(月) 23:56:52linux書いてる人とか、apache書いてる人とか、postgres書いてる人とか、その他いろいろ。
0150デフォルトの名無しさん
2007/08/21(火) 00:01:02くだらない事を質問するような奴なら、つけた方が良いと思う。
俺はつけないが
0151デフォルトの名無しさん
2007/08/21(火) 00:42:31その人たちは本当に読みやすさのために省略してるのか?
0152デフォルトの名無しさん
2007/08/21(火) 00:44:55その人たちの中じゃこっち派が多いよってのは無理があるだろう。
そこらへんのプログラマだって大量にコードは書いてる。
0153デフォルトの名無しさん
2007/08/21(火) 00:45:550154デフォルトの名無しさん
2007/08/21(火) 05:56:54if () {
}
って勝手に出してくる(ように設定している)ので、
消すのが面倒だし害はないし後々の面倒を予防できるのでそのまんまにしてまーす。
0155デフォルトの名無しさん
2007/08/21(火) 06:49:280156デフォルトの名無しさん
2007/08/21(火) 07:51:06質問内容は釣ネタに見えますがまだレスが流れている様ですので
プログラムは評価を受けるとかレビューとかされる場合があり
必ず中括弧'{}'で括るケースでも例えば1行しかないのに何でわざわざ中括弧で括るの?と質問された時
何と答えるかです
自分なりに定性的定量的な論旨展開で結論を出すか
ご存知かと思いますが世の中にあるコード標準とか規約とかを引用するかですね
例えば以下リンクが良く纏まっていますのでお勧めですが
http://www.literateprogramming.com/nrad.pdf
次レスに続く
0157wolf ◆8VH3XAqjlU
2007/08/21(火) 07:51:49続き
中括弧で括るケースについての記述は
2.C++ Coding Standard
└─Usage Of The Implementation Language
└─Control Structures
└─Branching
└─if ... else statement
に有りますが中括弧だけでなくインデントや比較代入記号に関しても検討して下さい
if(ia==0){
printf("HelloWorld\n");
}
僕ならこう書きます
if(0==ia)
{
printf("HelloWorld\n");
}
0158デフォルトの名無しさん
2007/08/21(火) 07:54:310159デフォルトの名無しさん
2007/08/21(火) 08:08:03>>135 つけたほうがいいっぽいですね^^
続き
if(ia==0){
printf("HelloWorld\n");
}
僕ならこう書きます
if(0==ia)
{
printf("HelloWorld\n"); <---- 訂正
}
>>158 定量的な論旨展開ってなんだ?
あまり即答はしないほうですがたまにはソフトウエア工学的な
意見展開もいいかもしれませんので
例えば
ひと纏まりしたコードは1画面内に収まったほうがreadabilityが良いですから
0160デフォルトの名無しさん
2007/08/21(火) 08:12:000161デフォルトの名無しさん
2007/08/21(火) 08:19:170162デフォルトの名無しさん
2007/08/21(火) 08:23:40にコーディングするって当たり前のことをしてれば必要ないですね。
変に技巧にはしるようなことはやめて、素直に書きましょう。
0163デフォルトの名無しさん
2007/08/21(火) 08:24:480164デフォルトの名無しさん
2007/08/21(火) 08:26:060165デフォルトの名無しさん
2007/08/21(火) 08:27:250166デフォルトの名無しさん
2007/08/21(火) 08:58:160167デフォルトの名無しさん
2007/08/21(火) 10:24:11どこが
> 読みやすさを損なう
のかさっぱり。やっぱ、主観的なことしかいえないだろ?
だからやめろつってんのにw
コンパイルが通ればどっちでも良いんだよ。
むしろ必要性について知らない方がダメ
0168デフォルトの名無しさん
2007/08/21(火) 10:25:24そういう人たちは複雑になるんで、やはり規則性を持った記述をしているため
書いたり書かなかったりみたいな、ことはしてないはず。
0169デフォルトの名無しさん
2007/08/21(火) 10:41:52書いたり書かなかったりしていますが何か。
// 書かないケース
if (foo) bar();
// 書くケース
if (foo) {
bar();
}
0170デフォルトの名無しさん
2007/08/21(火) 10:47:34画面に入力した瞬間から反映される関数ってありますか?
0171デフォルトの名無しさん
2007/08/21(火) 10:50:15標準ではありません。環境依存になりますが、例えばcursesなどのライブラリを使えばできないわけではありません。
0172デフォルトの名無しさん
2007/08/21(火) 10:51:10if() の後ろにそのまま続けてifと同じ行に書いていたり。
だから読みづらいだの主観的な意見はナンセンス。
自分が思うとおりに動作するように記述できて、コンパイルが通れば良し。
0173デフォルトの名無しさん
2007/08/21(火) 11:04:530174デフォルトの名無しさん
2007/08/21(火) 11:08:07読みにくいという指摘なら、話を聞かないでもないが。
0175デフォルトの名無しさん
2007/08/21(火) 11:12:100176デフォルトの名無しさん
2007/08/21(火) 11:14:400177デフォルトの名無しさん
2007/08/21(火) 11:14:52コーディングトラブルの約70%はif文などでの{}省略
http://pc11.2ch.net/test/read.cgi/tech/1173416521/
0178デフォルトの名無しさん
2007/08/21(火) 11:16:12だからその読みづらいって主観が個人的なものでナンセンスだって言っているんだが?
人それぞれで、括弧があれば読みづらい、なければ読みづらいとか言われても
んじゃどっちだよ?って争いになるから、括弧の必要性を理解した上で
自分が思う通りに処理するソースがコンパイラに通ればそれで良いだっつってんだよ、バカかてめぇはw
0179デフォルトの名無しさん
2007/08/21(火) 11:22:53一個人の読みやすさという客観的ではない曖昧な基準で話を進められても困るだろ。
とりあえず、オープンソースのように、他者と交互にやりとりしている人たちのソースを見て
参考にするのも良いだろ。自分だけが編集するソースならどっちをとろうが個人の自由。
0180デフォルトの名無しさん
2007/08/21(火) 11:24:390181デフォルトの名無しさん
2007/08/21(火) 12:05:16例を教えてください
お願いします
0182デフォルトの名無しさん
2007/08/21(火) 12:28:52例としてcursesライブラリを挙げていますが。
0183デフォルトの名無しさん
2007/08/21(火) 12:58:43[結論]
ifに括弧はつけなさい。
[理由]
つけてもつけなくてもいい文法が問題だけど
このスレだけでも大半の人間がどちらでもよい、又はつけたほうがいい
というんだからつけなさいYO!
可読性なんてものは人それぞれ違うんだから議論自体が無意味。
もし{}つけたら効率が落ちるんなら
あんたのプログラムif文使いすぎ。作り直しなさい
{}つけるのにそんな面倒か?
なんでそんなにつけるのに反発するんだ?
YOU!つけちゃいなYO
以上まとめでした
0184デフォルトの名無しさん
2007/08/21(火) 13:08:18これとか括弧付けるだけ無駄だろ
0185デフォルトの名無しさん
2007/08/21(火) 13:11:48・迷ったらつけとけ。つけないなら理論武装しておけ。
0187デフォルトの名無しさん
2007/08/21(火) 13:35:18日本語読めますか? >185には「つけないなら」と書いてあるのですが。
0188デフォルトの名無しさん
2007/08/21(火) 13:37:10じゃあ「つけないなら」どういう理論武装しておけばいいですか?
0189デフォルトの名無しさん
2007/08/21(火) 13:38:480190デフォルトの名無しさん
2007/08/21(火) 13:39:340191デフォルトの名無しさん
2007/08/21(火) 13:43:310192デフォルトの名無しさん
2007/08/21(火) 13:44:570193デフォルトの名無しさん
2007/08/21(火) 14:16:00相手を罵倒したり屁理屈が横行するからやめろつってんのに、うざっ
所詮夏厨か
0194デフォルトの名無しさん
2007/08/21(火) 14:35:00ぐぐったら理解できました
ありがとうございました
0195デフォルトの名無しさん
2007/08/21(火) 14:42:110196デフォルトの名無しさん
2007/08/21(火) 16:20:33国家機密なんです(><)
0197デフォルトの名無しさん
2007/08/21(火) 17:42:350198デフォルトの名無しさん
2007/08/21(火) 17:44:55教えたいのはやまやまですが国家機密なんです。
0199デフォルトの名無しさん
2007/08/21(火) 17:45:06どう、とは?
環境の話なのか、前提知識の話なのか、
それともそれらはクリアしてて、コーディングの話なのか。
0200デフォルトの名無しさん
2007/08/21(火) 18:15:47まず、Windows NT系の入ったパソコンを用意します。
0201デフォルトの名無しさん
2007/08/21(火) 18:42:030202デフォルトの名無しさん
2007/08/21(火) 18:43:43もちろんエディタが()の中にカーソルを勝手に移動させまーす。
あと、そこに加えて{}の中にマークをつけるので、
()と{}の中にキー一発で飛べるようにしてまーす。
0203197
2007/08/21(火) 18:52:30え、そうなんですか?私は国家には忠誠を誓っているものですから安心しておしえてください。
>>199
あ、すいません、前提知識ですね。
APIとかをOSの仕組みなどを勉強すればいいのでしょうか?
APIの実装方法やアルゴリズムなどの実装がなんか漠然としてしまって理解できません、
>>200
パソコンは、Windows XPなのでNT系だと思うので多分大丈夫だと思います。
>>201
VC2003なんとかというコンパイラとボーランドの無料のコンパイラをインストールしてあります。
0204デフォルトの名無しさん
2007/08/21(火) 19:00:540205デフォルトの名無しさん
2007/08/21(火) 19:06:18VC2003なんとかというコンパイラを使います。
ひとりでGUIを勉強するときは、チュートリアルがないと無理。
サンプルのたくさん載った参考書が必要。
Windowsアプリの作成は理解するというより慣れるです。
理解しようとすると挫折します。サンプルを入力、コンパイルして慣れてください。
0206デフォルトの名無しさん
2007/08/21(火) 19:10:37まさかノってくれるとは思わなんだ。
つかGUIプログラミングはせめてC++とMFCでする気は無いか?
もっと簡単にするならC#という言語を使う手もある。
C言語でやるのは面倒だが、何か理由があっての事か?
0207デフォルトの名無しさん
2007/08/21(火) 19:31:01・Visual C++ 2005 Express Edition と Microsoft Platform SDK を一緒に使う
ttp://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/
・Win32 API入門
ttp://wisdom.sakura.ne.jp/system/winapi/
0208デフォルトの名無しさん
2007/08/21(火) 21:03:04コーディングスタイルって、経験が足らないヤツが頭で考えたっていびつになるんだよな。
実際コードをたくさん書いて、世間で実際に評価されてる人のを参考にしたほうがいいよね。
0209デフォルトの名無しさん
2007/08/21(火) 22:55:29COBOLを連想させるような200行以上もある関数はヤメレ
0210デフォルトの名無しさん
2007/08/21(火) 23:13:440211デフォルトの名無しさん
2007/08/21(火) 23:15:33同感です。if文だけに着目するよりも、前後の文を含めて、
そして全体を通してシンプルであることが望ましいですね。
適当に空行を入れるだけでも、それなりに変わりますからね。
0212デフォルトの名無しさん
2007/08/21(火) 23:24:05--
double sum = func(
sx[ox]
,cx[ox]
,sy[oy]
,cy[oy]
,xDim
,yDim
,wr
,wi
);
0213デフォルトの名無しさん
2007/08/21(火) 23:33:151行にしてみました。どうでしょう?
double sum = func(sx[ox], cx[ox], sy[oy], cy[oy], xDim, yDim, wr, wi);
それとも構造体にまとめて、ポインタ渡しが良いですか?
具体的に希望があればどうぞ。
0215デフォルトの名無しさん
2007/08/21(火) 23:52:40全部グローバル変数で渡して引数はなしの方向で
0216デフォルトの名無しさん
2007/08/22(水) 00:04:310217デフォルトの名無しさん
2007/08/22(水) 12:45:29コーディング規約でそのスタイルを規定しているところもある。
これだと、引数一つ一つにコメントがつけられるという利点がある。
コーディングスタイルはそれぞれ良いところもあれば、悪いところもあるのが普通で、
プロジェクトあるいは会社でコーディングスタイルが統一されていることが大事。
0218デフォルトの名無しさん
2007/08/22(水) 12:56:14カンマを行頭に持っていくのは規約以前の問題。
英語圏の人が見たら発狂するぞ。
0219デフォルトの名無しさん
2007/08/22(水) 13:16:24悪質にも程があるわ
0220デフォルトの名無しさん
2007/08/22(水) 13:58:010221デフォルトの名無しさん
2007/08/22(水) 14:19:32聞いたのですが、ではどういう風にすればいいのでしょうか、実際のプログラムではどうしているか教えてください。
0222デフォルトの名無しさん
2007/08/22(水) 14:23:44>>52参照。
getsは問題がないだろう。
0223221
2007/08/22(水) 14:29:44gets関数はバッファオーバーランの危険性がありませんか?
例えば、char buffer[1024] と宣言した場合に1024バイトであるという情報を
gets関数に伝える手段がないと思うのですが、、、
0224デフォルトの名無しさん
2007/08/22(水) 14:40:390225デフォルトの名無しさん
2007/08/22(水) 14:41:42fgets
0226デフォルトの名無しさん
2007/08/22(水) 14:51:240227デフォルトの名無しさん
2007/08/22(水) 14:53:320228デフォルトの名無しさん
2007/08/22(水) 15:11:440229デフォルトの名無しさん
2007/08/22(水) 15:13:180230デフォルトの名無しさん
2007/08/22(水) 15:14:00入力可能な最大文字数を超えるサイズののバッファを確保しておけばいいだけじゃん。
0231デフォルトの名無しさん
2007/08/22(水) 15:21:560232デフォルトの名無しさん
2007/08/22(水) 15:27:170233デフォルトの名無しさん
2007/08/22(水) 15:30:33getsに対する俺の考えなんてどーでも良い。存在そのものが問題視されているのは
とっくの昔に知れ渡っていること。それに関する文献を自分で調べな。この板に
一定の期間来て色々と議論を見てきた人なら、まず知っているよ。そう、そんなのは使わないのが鉄則。
0234デフォルトの名無しさん
2007/08/22(水) 15:31:310235デフォルト名無しさん
2007/08/22(水) 15:37:290236デフォルトの名無しさん
2007/08/22(水) 15:38:14知らないならレスしないでください!
0237デフォルトの名無しさん
2007/08/22(水) 15:40:18対処すりゃみたいなことを言わず、プログラム側でしっかり対処すること。
とにかく、getsだけはありえん。
0238デフォルトの名無しさん
2007/08/22(水) 15:41:37これくらいは理解してみて
http://ykr414.com/dos/
0239デフォルトの名無しさん
2007/08/22(水) 15:42:40>>233 だから、それをここで君の言葉でいいなさいよ。
236 名前:デフォルトの名無しさん 投稿日:2007/08/22(水) 15:38:14
>>233
知らないならレスしないでください!
↑なんだこいつ?うざすぎ。説明してもらえなきゃ相手が理解していないってことになるなら
そう思ってろ。すでに説明は済んでいるのにな。痛すぎ。お前みたいな奴が質問に答えるのも
問題があるだろ。とっとと失せな、夏厨。
0240デフォルトの名無しさん
2007/08/22(水) 15:44:14知らないならレスしないでください!
0241デフォルトの名無しさん
2007/08/22(水) 15:44:55ファイルからリダイレクトってのもあるし、データを受ける側が用意した記憶領域を
超えて入力を受け付けてしまうことなんて考えたらキリがないが、そういうのも含めて
getsだけはありえん。使った時点でアホだと思われるぞ。
0242234
2007/08/22(水) 15:48:10fgets関数と違ってgets関数の引数にはバッファのサイズの引数がないからだ。
でも、それは>>230のいうとおりで、想定最大入力文字数のバッファを用意しておけば
それですむはずだ。
プログラムを作るときは、入力データの種類やサイズの範囲、誤動作の許容レベル
というものがあるはずで、自分または身内が使う簡単なテストプログラム程度のもの
であればコンソール入力のバッファをchar buf[1000];ととってもなんら問題がないと思われる。
0243デフォルトの名無しさん
2007/08/22(水) 15:50:08問題点のヒントを出しても調べようとしないのか。頼む、お前みたいな無知が
生半可な浅はかな知識でいい加減な回答をするのは迷惑なんで黙っていてくれ
0244デフォルトの名無しさん
2007/08/22(水) 15:54:19知らないならレスしないでください!
0245デフォルトの名無しさん
2007/08/22(水) 15:56:45反面教師のようなところが利点
#include<stdio.h>
int main(void){
int a=3;
char buf[8];
int b=5;
int diffa, diffb, diff=-1;
int i;
diffa=(char*)&a-buf;
diffb=(char*)&b-buf;
if(diffa>0 && diffa<50) diff=diffa;
if(diff>diffb && diffb>0 && diffb<50) diff=diffb;
if(diff<0) return 0;
printf("a=%d b=%d\n", a, b);
printf("Input next string\n");
for(i=0;i<diff;i++) putchar('*');
printf("x\n");
gets(buf);
printf("a=%d b=%d\n", a, b);
return 0;
}
0246デフォルトの名無しさん
2007/08/22(水) 16:07:32業務で使用するものなら、getsは使わないほうが望ましい。fgetsを使う。
テストプログラムや身内で使うものならgetsも可。
ただし、その場合でもバッファは「十分なサイズ」のものを用意しておくこと。
ということかな?
0247デフォルトの名無しさん
2007/08/22(水) 16:08:420248デフォルトの名無しさん
2007/08/22(水) 17:19:09>>245 みたいに広い範囲で使えるソースを書くのって難しいね
0249デフォルト名無しさん
2007/08/22(水) 17:43:250250デフォルトの名無しさん
2007/08/22(水) 18:10:52飽きないね。
0251デフォルトの名無しさん
2007/08/22(水) 18:35:48a というプログラム(プロセス)から b を必要に応じて起動し
(aはbを起動した後引き続き起動し続ける)ようにしたいのですが、
どうやるのが正しいのでしょうか?
今は、
a側で
pid = fork();
if (pid==0) execv(b);
のようにしているのですが、このやり方であってます?
0252デフォルトの名無しさん
2007/08/22(水) 20:06:36Linux Programmer's Manualには「gets()は絶対に使用してはならない。」と書かれている
0253デフォルトの名無しさん
2007/08/22(水) 20:07:03そういうやらないほうがいいマナーがまとまってる解説サイトはないですか
0254デフォルトの名無しさん
2007/08/22(水) 20:15:25http://www.kouno.jp/home/c_faq/
0255デフォルトの名無しさん
2007/08/22(水) 20:18:370256デフォルトの名無しさん
2007/08/22(水) 20:38:43捨てプログラムくらいならいいだろー
0257デフォルトの名無しさん
2007/08/22(水) 20:38:500258デフォルトの名無しさん
2007/08/22(水) 21:09:06そういう話をしたらキリがないだろ。だったら話に入ってくるなよ。
なんでお前の個人的な都合を受け付ける話題になってんだ?
頼むからお前みたいな自分勝手なことしかいえない奴は大勢とやりとりする
場での議論には入ってこないでくれ。それからお前は二度とここで質問に回答するな。
0259デフォルトの名無しさん
2007/08/22(水) 21:10:12そう思うなら自分だけが扱うソースでは使えば良いだろ。正式なものに書き換えるときに
わざわざgetsの部分を探して仕様を変更して書き直してたらそれこそ手間が掛かるだろ。
0260デフォルトの名無しさん
2007/08/22(水) 21:12:11確かにお前みたいな奴が作るプログラムなんて、他の人に使わせないだろうから良いけどさ。
getsを使った入力を受け付けるプログラムが、予期せぬ状況下でバッファオーバーランをして
OSの動作にまで何かトラブルを起こすようなら話にならんのだよ。そういうことも考えて
より精巧なプログラムを作れないようなら、お前はプログラミングには向いてない。
今すぐ将来の進路を変更した方が良いよ。
0261デフォルトの名無しさん
2007/08/22(水) 21:13:01いいですよ^^
0262デフォルトの名無しさん
2007/08/22(水) 21:15:450263デフォルトの名無しさん
2007/08/22(水) 21:29:42同じ人ですか?
0264デフォルトの名無しさん
2007/08/22(水) 21:32:43ゲッツ1万回チャレンジを思い出しているに違いない。
0265デフォルトの名無しさん
2007/08/22(水) 21:45:13なぜか他人が使っているという不思議な事態も想定すべき。
0266デフォルトの名無しさん
2007/08/22(水) 21:46:38自分で判断しないから
信号も赤なら渡らない、と決め込んで
青なら安全確認もろくにしないで事故に会うタイプだな
0267デフォルトの名無しさん
2007/08/22(水) 21:56:23余計泣けるじゃないか
虚しさに
0268デフォルトの名無しさん
2007/08/22(水) 22:01:58> なぜか他人が使っている
ないない、お前日本語が理解できないアホだろ。だから議論に入ってくるなっつってんだが?
言葉以前に現状すら理解できんだろ。よく読め、アホ。
>>260
> 他の人に使わせないだろうから良いけどさ。
だから捨てなんだろ?getsを使ったプログラムを他人に使わせるなんて当然迷惑だ。
0269デフォルトの名無しさん
2007/08/22(水) 22:15:12何をそんなに興奮してるんですか?
0270デフォルトの名無しさん
2007/08/22(水) 22:16:240271デフォルトの名無しさん
2007/08/22(水) 22:26:26167 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/21(火) 10:24:11
>>145
どこが
> 読みやすさを損なう
のかさっぱり。やっぱ、主観的なことしかいえないだろ?
だからやめろつってんのにw
コンパイルが通ればどっちでも良いんだよ。
むしろ必要性について知らない方がダメ
0272デフォルトの名無しさん
2007/08/22(水) 22:29:37捨てとけ
0273デフォルトの名無しさん
2007/08/22(水) 22:33:11sが配列型でなかったら死亡。
C++ならもっと頑張れるが、std::string使えという罠。
0274デフォルトの名無しさん
2007/08/22(水) 22:38:26> むしろ必要性について知らない方がダメ
もっともらしい理屈がいくつが挙がってるけど、そのスタイルを採用してないプロダクツでも
世間で評価されてるような実績をあげてるってことは、それらは机上の空論ってことだろ。
センスも見識もない人間が頭の中だけで考えたスタイルなんて、そういうことになりがち。
と遅レスしてみる。
0275デフォルトの名無しさん
2007/08/22(水) 22:50:02>>221 の質問は
> ではどういう風にすればいいのでしょうか
これに対して十分な領域を確保しとけってのは不適切。
なぜなら、確保した領域を 超えて受け付けることが出来る仕様 になっている以上
getsを使ってたら対処にならないんだよ。
その問題点の解決の対処をすることが >>221 に対して適切な回答になる。
getsに問題があるけど、問題が起こらないように使いましょうって
だからgetsを使うからセキュリティーホールなるものが出来てんだろって報告も無視するし。
0276デフォルトの名無しさん
2007/08/22(水) 22:52:050277デフォルトの名無しさん
2007/08/22(水) 22:52:07お前のバカじゃね?理解してなさすぎ。個人的な主観による 読みやすさ っていう基準が
無意味だって話だろ。自分が思う通りに処理が出来るソースがコンパイルに通れば
どういうスタンスやスタイルをとろうが自由だろ。あんたの言う世間で評価って言うのは
括弧を付ける付けないが評価の対象じゃないだろ?アホ杉・・・
0278デフォルトの名無しさん
2007/08/22(水) 22:53:430279デフォルトの名無しさん
2007/08/22(水) 22:54:22んじゃ世間で評価されるプログラムのソースに1文のみで括弧が必要ない部分にも
括弧があったらどーすんだよ?くだらねぇ
0280デフォルトの名無しさん
2007/08/22(水) 22:54:220281デフォルトの名無しさん
2007/08/22(水) 22:56:14だから「必要性」ってなんの話だよ。
それに理解できてないのはおまえのほうだろ。
括弧つけてるつけてないが評価されてるなんてどこにかいてる?
0282デフォルトの名無しさん
2007/08/22(水) 22:59:28だから、上のほうで挙がってる括弧のをつける理由ってのは机上の空論ってことだよ。
0283デフォルトの名無しさん
2007/08/22(水) 23:14:490284デフォルトの名無しさん
2007/08/23(木) 07:56:31今時捨てプログラム以外でCUIで書くことってあるの?
getsなんぞそもそも使う場面が思いつかない
0285デフォルトの名無しさん
2007/08/23(木) 08:02:28君はサーバプログラムを知らないようだ。
他にもシェル上から使えるちょっとしたフィルタプログラムは便利だ。
まあ君には必要のないことなのかもしれないがな。
0286デフォルトの名無しさん
2007/08/23(木) 09:39:29はスクリプトで書くからなー
0287286
2007/08/23(木) 09:40:160288デフォルトの名無しさん
2007/08/23(木) 09:50:460289デフォルトの名無しさん
2007/08/23(木) 09:53:35vi みたいなスクリーンエディタもCUIエディタと呼ぶのかも
0290デフォルトの名無しさん
2007/08/23(木) 09:53:510291デフォルトの名無しさん
2007/08/23(木) 09:55:060292デフォルト名無しさん
2007/08/23(木) 11:15:37実行手順」まで来ました。Hello, World!というソースプログラムを用例通り
に作ってc:\に「cppprog」フォルダを作成しました。
コマンドプロンプトの\system32\cmd.exeの画面で
C:\Documents and Settings>の後にcd \cppprogを入力しenterキーを押すと
「指定されたパスが見つかりません。」と表示されます。なぜか教えてください。
保存の状態は、C:→Documents and Settings → 大野→ My Documents →
cppprogフォルダです。 よろしくお願いします。
0293デフォルトの名無しさん
2007/08/23(木) 11:31:470294デフォルトの名無しさん
2007/08/23(木) 11:32:420295デフォルトの名無しさん
2007/08/23(木) 11:51:34だと、
C:\cppprog
になる
cd cppprog
なら、現在の場所からの相対位置になる
0296デフォルトの名無しさん
2007/08/23(木) 12:02:090297デフォルトの名無しさん
2007/08/23(木) 12:10:490298デフォルト名無しさん
2007/08/23(木) 12:14:18漢字を打ち込む方法を教えてください。
0299デフォルトの名無しさん
2007/08/23(木) 12:18:02ショートカットの作業フォルダに指定するべし
0300デフォルトの名無しさん
2007/08/23(木) 12:19:07Alt+半角/全角
0301デフォルトの名無しさん
2007/08/23(木) 12:33:590302デフォルト名無しさん
2007/08/23(木) 13:06:34C:\Documents and Settings\All Users>まで進みました。
この後ろへcd \My Documentsを入力しエンターキーを押すと、
「指定されたパスが見つかりません。」が出ました。
対策を教えてください。
0303デフォルトの名無しさん
2007/08/23(木) 13:24:33>>295
0304デフォルトの名無しさん
2007/08/23(木) 13:25:06標準入力もまだまだ捨てたものじゃないってことだな
やったことないから勉強になった
0305デフォルト名無しさん
2007/08/23(木) 13:34:04Documents and Settings\All Users>cd cppprogでエンターキーでも
「指定されたパスは見つかりません。」が出ます。
0306デフォルトの名無しさん
2007/08/23(木) 13:39:53一個上に行くのは、 cd .. な
0307デフォルトの名無しさん
2007/08/23(木) 13:48:19そこからコンパイルまでいくのは大変だし、ここはスレ違いになるから
みんな相手してられなくなるぞ
0308デフォルトの名無しさん
2007/08/23(木) 13:51:000309デフォルト名無しさん
2007/08/23(木) 14:04:48「一個上に行く」というのは,>cd ○○○○(ログインネーム)と
置くことを指しているのでしょうね。
0310デフォルトの名無しさん
2007/08/23(木) 14:10:13これ見て勉強して
http://ykr414.com/dos/
0311デフォルトの名無しさん
2007/08/23(木) 14:29:100312311
2007/08/23(木) 14:31:45key=value という文字列をsscanfをつかって'='で分解したいんですが
char text[256] = "key=value";
char *key,*value;
sscanf(text,"%s=%s",key,value);
という感じで打ってもできませんでした。だれかご教授おねがいします
0313デフォルトの名無しさん
2007/08/23(木) 14:34:450314デフォルトの名無しさん
2007/08/23(木) 14:46:44カレントディレクトリが C:\Documents and Settings\All Users なんだったら、
その状態で cd cppprog ってやったら
C:\Documents and Settings\All Users\cppprog
へ移動することになるし、cd 大野 ってやったら
C:\Documents and Settings\All Users\大野
へ移動することになる。もちろんそんなディレクトリは存在しないから、エラーが出るわな。
君が移動したいのは C:\Documents and Settings\大野\My Documents\cppprog だろ?
だったら1つ上のディレクトリ(つまり C:\Documents and Settings)に戻ってから、
大野 → My Documents → cppprog へと移動すればいい。
具体的には
cd ..
cd 大野
cd "My Documents"
cd cppprog
と順に移動していけばいい。
だいたいなんでCマガの書いてあるようにやらないんだよ。
0315デフォルトの名無しさん
2007/08/23(木) 14:46:59strtokでも使え
0316デフォルトの名無しさん
2007/08/23(木) 14:49:51OSはおいといて、key と value の領域確保の問題が一つ。
もう一つは、keyが"="まで読み込んでしまうこと。
"%[^=]=%s"とかでどうか
0317デフォルト名無しさん
2007/08/23(木) 15:40:26打ち込めないことです。フォルダ名をローマ字に変えようと
してもできません。よろしく。
0318デフォルトの名無しさん
2007/08/23(木) 15:46:12コンパイラ起動できるようになるまで、Win板で聞いたら?
とりあえず>>300-301
ちなみに、
C:\Documents and Settings\大野\My Documents
は、エクスプローラーの「マイ ドキュメント」のことだって知ってたか?
0319デフォルトの名無しさん
2007/08/23(木) 15:57:57それどころかレスをまともに読んですらいない、
救いようがないなこりゃ
0320デフォルトの名無しさん
2007/08/23(木) 15:59:000321デフォルトの名無しさん
2007/08/23(木) 16:05:44typedef struct{
char a[2];
char b[3];
char c[4];
}AA;
typedef struct{
char e[16];
}BB;
AA aa;
BB bb;
…こんなんで、aaに代入された値をbbに一発で書き込んで、
しかもスペースで埋めてくれる関数とかありませんか?
VBからCに書き直してたら、LSetで一発だったので。。
0322デフォルトの名無しさん
2007/08/23(木) 16:13:02memcpy() と memset() でどうか
0323デフォルト名無しさん
2007/08/23(木) 16:18:12プロンプトに打ち込めないみじめさ。嬉しさも中ぐらいなり、秋の風。
0324デフォルトの名無しさん
2007/08/23(木) 16:21:37右クリックかシステムメニューでできる
0325デフォルトの名無しさん
2007/08/23(木) 16:31:150326321
2007/08/23(木) 16:35:43できました。ありがとうございます!
0327デフォルトの名無しさん
2007/08/23(木) 16:49:57構造体のパディングは大丈夫なのか?
文字列の連結ではないのか?
いやできたならいいんだけど。
0328デフォルトの名無しさん
2007/08/23(木) 17:09:580329デフォルトの名無しさん
2007/08/23(木) 17:13:26LSetの仕様を考慮しないとね。どっちにしても一発は厳しい
0330デフォルトの名無しさん
2007/08/23(木) 19:09:03{
char *p;
for( p = str; *p != '\0'; p++ )
if( *p == ch ) return p;
return 0;
}
これと同等の処理を行う標準ライブラリ関数を教えてください お願いします
0331デフォルトの名無しさん
2007/08/23(木) 19:18:280332デフォルトの名無しさん
2007/08/23(木) 19:18:520333デフォルト名無しさん
2007/08/23(木) 20:06:370334デフォルトの名無しさん
2007/08/23(木) 20:23:42ありがとうございます
strcharだと
char *func_b( char *str, char ch )
じゃなくて
char *func_b( char *str, int c)
になるんじゃないかと迷ってました
0335デフォルト名無しさん
2007/08/23(木) 20:26:41Borland C++ Compiler のつぎはTurbo Debuggerです。
ありがとう!ありがとう! >293,294,295,314,318,
325さんAlt + 半角/全角や漢字のコピペが可能だとは驚きでした。
まだいろいろ教えていただくこともあろうと思います。
0336デフォルトの名無しさん
2007/08/23(木) 20:26:46memset(&bb, ' ', sizeof(bb));
bb = aa;
これでいいような気がするんだが、
構造体の要素って順番に並んでるとは規定されてないけどね。
0337デフォルトの名無しさん
2007/08/23(木) 20:29:48char *strchr (const char *s, int c) だよ
0338312
2007/08/23(木) 20:38:42>>316の[^=]を使う方法を試したのですがうまくできなかったです。。。
strtokを使うしかないって事ですかね
0339デフォルトの名無しさん
2007/08/23(木) 20:39:290340デフォルトの名無しさん
2007/08/23(木) 20:40:21>構造体の要素って順番に並んでるとは規定されてないけどね。
またいい加減なことを…ここは入門者が答えるスレ?
0341デフォルトの名無しさん
2007/08/23(木) 20:41:54だからgets肯定派のダンディ坂野は回答しなくて良いよって言っただろ?
ったく、これだから夏厨は・・・
0342デフォルトの名無しさん
2007/08/23(木) 21:18:410343デフォルトの名無しさん
2007/08/23(木) 21:30:38規定されてるよ
0345デフォルトの名無しさん
2007/08/23(木) 22:29:210346デフォルトの名無しさん
2007/08/23(木) 23:08:32#include <stdio.h>
main()
{
printf("Hello World\n");
}
を、Cygwinでコンパイルしたいのですが、うまくいきません。
何故でしょうか。
0347デフォルトの名無しさん
2007/08/23(木) 23:10:400348デフォルトの名無しさん
2007/08/23(木) 23:30:460349デフォルトの名無しさん
2007/08/24(金) 10:08:44どううまくできなかったのか。
ちゃんと
*key は key[128]
*value は value[128]
とかにしたか?
0350デフォルトの名無しさん
2007/08/24(金) 17:50:23作るとします。実際この関数を使おうと#includeしようとしたら同じく#includeした
time.hライブラリーにも同じ関数がある事に気づきました。
同じ名前の関数がある場合、関数の使用優先度って何で決まるんですか?
0351デフォルトの名無しさん
2007/08/24(金) 17:52:15多分リンクした順だけど、普通はリンク時にエラーがでると思うよ
0352デフォルトの名無しさん
2007/08/24(金) 17:56:37ふつうは自作の関数の名前を変えると思うんだが
0353デフォルトの名無しさん
2007/08/24(金) 17:57:20ありがとうございました。
0354デフォルトの名無しさん
2007/08/25(土) 00:37:04エラーは出ないんじゃないかな。
関数の戻り値なり引数なりの型が違うなら、
コンパイル時にエラーになると思う。
警告かも知れない。
0355デフォルトの名無しさん
2007/08/25(土) 01:27:57Spain 2 0 1
Egypt 1 2 0
のように入力して、数字を左から 3点 0点 1点分と数えて点数の高い順に並べ
Spain, 7
Japan, 5
Egypt, 3
のように出力したい場合二次元配列使うと思うんだけど、データの型はどうすればいい?
全部intで出力のときだけ %s,%d で合ってますか?
0356デフォルトの名無しさん
2007/08/25(土) 01:44:14おれだったら、構造体の一次元配列で処理する。
0357デフォルトの名無しさん
2007/08/25(土) 11:58:03{
char name[1024];
int mark;
}
0358デフォルトの名無しさん
2007/08/25(土) 12:24:47struct {
char name[1024];
int mark[3];
}
0359デフォルトの名無しさん
2007/08/25(土) 17:58:54b = (struct B *)buf+20;
Bの構造体にbufの20バイト後から取り出したいんだけど
この記述はできない?
0360デフォルトの名無しさん
2007/08/25(土) 18:07:15でも、>>359 は何か根本的なことが分かっていない気がする
0361デフォルトの名無しさん
2007/08/25(土) 18:07:53bufがchar *などであるなら、
struct B b=*(struct B*)(buf+20)
0362デフォルトの名無しさん
2007/08/25(土) 18:09:37すっとこどっこい。
0363デフォルトの名無しさん
2007/08/25(土) 18:17:560364359
2007/08/25(土) 22:23:25でもあんまり理解してないorz
0365デフォルトの名無しさん
2007/08/26(日) 00:57:240366デフォルトの名無しさん
2007/08/26(日) 07:15:28うまく領域を確保できなくてデータが変になる現象が起きてます。
今は使わない文字配列を共用体の中に書いて
無理やり余裕を持たせて領域確保してるんですが
共用体で使うメモリ領域をうまく確保する方法はありますか?
ちなみに環境はVineLinux4.1でgcc3.3.6コンパイラ使ってます。
0367デフォルトの名無しさん
2007/08/26(日) 07:24:220368366
2007/08/26(日) 08:00:382Dのrobocup用ライブラリlibsclientをいじってて
http://www.koders.com/c/fidD6E7EBDD071F6F9579D1CAF12EF2FC434F5F7074.aspx
292~295行目
typedef struct _Ppos {
WhichTeam team ; // enum(WhichTeam=int)
int unum ;
} PlayerInfo ;
に「int type;」というのを追加してライブラリとプレイヤーを再コンパイルして
実際にサーバーに接続してみたら動作が明らかに変になるんです。
312~317行目
union {
PlayerInfo player ;// 292~295行目の構造体
Side side ; // enum(Side=int)
FlagPos fpos ; // enum(FlagPos=int)
LinePos lpos ; // enum(LinePos=int)
} id ;
ここに「char hoge[30];」を追加すると問題なく動作するようになるんで
共用体で構造体の大きさの領域が確保できてないという結論に至ったわけです。
0369デフォルトの名無しさん
2007/08/26(日) 11:14:490370デフォルトの名無しさん
2007/08/26(日) 13:08:100371デフォルトの名無しさん
2007/08/26(日) 13:27:06システムコールはC言語でもサポートされていますが
システムコールはC言語ではありません
0372366
2007/08/26(日) 13:49:54それでしたorz
ライブラリとプレイヤ自体はmake cleanしてたんですが
ライブラリを読み込んでるプレイヤ共通の関数をまとめたやつをし忘れてました。
>>367,>>369,>>370こんな僕にレスしてくれてありがと
0373デフォルトの名無しさん
2007/08/26(日) 21:34:06a[1]=AAA
a[2]=BBB
a[4]=DDD
これを以下のように新規で追加,削除,変更などしたい場合,
a[1]=AAA
a[2]=ABC
a[3]=DEF
一回全部読み込んでbufなどに保存し,それから一気に全部ファイルへ書き込む方法が
あると思いますが,それ以外に方法ありますか?
0374デフォルトの名無しさん
2007/08/26(日) 21:43:43固定長レコードもファイルならfseekで該当レコードのところにファイルポインタを
位置決めしてfwriteでレコードを上書き。
0375デフォルトの名無しさん
2007/08/26(日) 21:53:28データをファイルの最後尾に書き込みして
読み込み時、重複する場合は「もっとも後ろにあるデータ」を有効とするとか
たとえば
a[1]=AAA
a[2]=BBB
a[4]=DDD
↓
a[1]=AAA
a[2]=BBB
a[4]=DDD
a[3]=DEF
a[2]=ABC
a[4]=
読み込み時にデータ(a[2]=BBB)をデータ(a[2]=ABC)で上書きする感じ
a[3] は新規追加、a[2]は変更、a[4]は値なしなので削除
0376デフォルトの名無しさん
2007/08/26(日) 22:01:50その標準関数を使ったことないんで調べてみます
>>375
その方法も考えたんですが,何回も書き込みを行うとデータが多くなり
読み込むのに時間がかかりそうなんで,有効データだけ残す方法をとりたいですね
お二人様サンクスです!検討してみます
0377デフォルトの名無しさん
2007/08/27(月) 17:11:432の0乗+2の1乗+2の2乗+2の3乗+2の4乗+・・・
というプログラムはどのようにしたらよいのでしょうか?
いろいろ調べてかいてみたのですができませんでした><
どなたかアドバイスお願いしますm(__)m
0378デフォルトの名無しさん
2007/08/27(月) 17:19:530379デフォルトの名無しさん
2007/08/27(月) 17:40:040380デフォルトの名無しさん
2007/08/27(月) 17:47:15しょぼくて申し訳ないが、
int hoge(int count){
int result = 1;
if(count <= 0)
return 1;
for(int i=1;i<count;i++){
result += 2*i;
}
return result + hoge(count-1);
}
0381デフォルトの名無しさん
2007/08/27(月) 18:12:29#include <stdio.h>
int main(void)
{
for (;;)
putchar('1');
}
0382デフォルトの名無しさん
2007/08/27(月) 18:14:02int func(size_t n) {
int ret = 1;
size_t i;
for (i = 1; i < n+1; ++i)
ret += 1<<i;
return ret;
}
0383デフォルトの名無しさん
2007/08/27(月) 18:15:400384デフォルトの名無しさん
2007/08/27(月) 19:00:13pow(2, n+1) - 1
0385デフォルトの名無しさん
2007/08/27(月) 19:40:33~(~0<<n)
0386デフォルトの名無しさん
2007/08/27(月) 20:01:400387デフォルトの名無しさん
2007/08/27(月) 21:15:030388デフォルトの名無しさん
2007/08/27(月) 21:17:000389デフォルトの名無しさん
2007/08/27(月) 21:17:59==
0390デフォルトの名無しさん
2007/08/27(月) 21:18:36C言語には対応するものはないかな?
C++なら、状況応じて==をequals風に定義しなおすことになる。文字列とか。
Javaのように==とequalsを明確に区別することはできない。
0391デフォルトの名無しさん
2007/08/27(月) 21:25:34あくまで、文字列比較という意味でね
もっとも、equalsメソッドはオブジェクトのデータの比較だから
そういう意味なら、オブジェクト指向でないCにはそれに該当するものはない
0392デフォルトの名無しさん
2007/08/27(月) 21:31:410393デフォルトの名無しさん
2007/08/27(月) 22:11:53構造体だと、専用の比較関数作らなきゃならんね。
0394デフォルトの名無しさん
2007/08/27(月) 22:18:110395デフォルトの名無しさん
2007/08/27(月) 22:27:05失礼しました、説明が足りなかったようで・・・
Javaでは、([変数].equals("○○○")) と書くところを
C言語だとどのように書くのかという意味です
0396デフォルトの名無しさん
2007/08/27(月) 22:31:16何も読んでないのか?
クラスによってequalsの挙動は違うだろうが。
0397デフォルトの名無しさん
2007/08/27(月) 22:31:47[変数]の型は何?
派生クラスでオーバーライドできるから、
クラスによって挙動が違い、Cで対応するものも異なる。
なお、Stringなら>>391。
0398デフォルトの名無しさん
2007/08/27(月) 22:48:56そのファイルの拡張子を除いたファイル名を設定するプログラムを作成したいのですが
どのようにすればタイトルに書き込めるのでしょうか?
0399デフォルトの名無しさん
2007/08/27(月) 22:53:24if (strcmp(変数, "○○○”) == 0) ・・・
0400デフォルトの名無しさん
2007/08/27(月) 22:55:30プロパティ窓を取得、拡張子まで削ってSetWindowText
0401398
2007/08/27(月) 23:11:00プロパティ窓はどのようにして取得するのでしょうか?
0402デフォルトの名無しさん
2007/08/27(月) 23:17:33IPropertyStorageでググればいろいろ見付かる。
ただし、Cでやるのは面倒。少なくともC++は欲しい。
なお、この情報は、NTFSの副次ストリームに保管される。
あるいは、OLE構造化ストレージ(2003までWord/Excelファイルなど)なら
ファイル自身に保管される(このため構造化ストレージならNTFSでなくても可能)。
0404デフォルトの名無しさん
2007/08/28(火) 22:01:370405デフォルトの名無しさん
2007/08/29(水) 03:30:57ありがとうございました
0406デフォルトの名無しさん
2007/08/29(水) 11:41:07みなさんありがとうございます><
0407デフォルトの名無しさん
2007/08/29(水) 20:34:19* : int index : 追加したい位置
* : element *new_data : 新しく追加するリスト
* 戻り値:成功1,失敗-1
*/
int add_data(char *data, int index, ELEMENT *new_data){
ELEMENT *tmp;
int cnt = 0;
if(data == NULL || index < 0 || index > element_cnt || new_data == NULL){
return -1;
}
new_data->data = data;
/* インデックスの位置の直前に移動 */
for(tmp = head;cnt != index;cnt++,tmp = tmp->next);
new_data->next = tmp->next;
tmp->next = new_data;
printf("help\n");
return 1;
}
こんな感じでリスト構造にデータを入れる関数を作ったんですが、
Borlandでは正しく動くのにVisual Studioでは呼び出しもとに返らず終了してしまいます
helpというプリント文は表示されます。どなたか、解決策を教えてもらえませんか?
↓がリストの構造体です
typedef struct element {
char *data;
struct element *next;
} ELEMENT;
0408デフォルトの名無しさん
2007/08/29(水) 21:11:45そのソースだけだとわかんないなぁ
引数の「char *data」はその都度領域確保されているの?
それから「element_cnt」って要素数だよね?いつインクリメントしてる?
0409デフォルトの名無しさん
2007/08/29(水) 21:14:25デバッガでも使って確かめろ位しか
0410デフォルトの名無しさん
2007/08/29(水) 21:20:40そうですよね。>>409さんのデバッガを調べてみます
「char *data」はただダブルコーテーションで文字列を渡すだけしてます
「element_cnt」については処理を書き込み忘れました
0411408
2007/08/29(水) 21:31:46それから追加するインデックスを0にした場合は
実際に追加されるのはインデックス1の場所にならない?
0の場合headを書き換えないとおかしくなるんじゃない?
まぁあと/* インデックスの位置の直前に移動 */ といっているけど
cnt!=index ってことはindex の位置で止まる
で
>new_data->next = tmp->next;
index+1の要素を新要素の次の要素にする
>tmp->next = new_data;
indexの次の要素を新要素にする
結局追加される場所はindex+1の場所にならない?
0412407
2007/08/29(水) 21:50:13すいません!書き忘れてましたけど、headはstatic変数で今回ダミーとして扱います
ちなみにheadはhead->next = NULLで初期化してあります。
for文の初期化でtmp = head;とあるので、head->nextでダミーではない値をもつリストに入るときにはcntは1になっています
なのでcnt == indexはひとつ前になるんじゃないかな〜と考えてます。間違えてたらすいません
0413408
2007/08/29(水) 21:54:23つまり head->next が最初の要素ってことですね
なら納得です
だとすると、やはりこのソースからだと分かりませんね
私はここまでです
0414407
2007/08/29(水) 22:11:13そうですか、ありがとうございました。
原因はこれだけのソースではわからないと思うので、ななし.orgに全部のソースをアップしました
見てくれるなら見てほしいです。んでVisualStudioで実行してほしいです
まだ途中なんでできたらツッコミとかよろしくおねがいします
0416407
2007/08/29(水) 22:43:24http://77c.org/upload.php?fn=off&page=1
0417408
2007/08/29(水) 23:02:01まずここかな
void init_list(void){
ELEMENT top;
head = ⊤
element_cnt = 0;
head->next = NULL;printf("\(^o^)/");
}
ELEMENT top; は関数のローカル変数
head = ⊤
top の実体は関数抜けたら無効になる
にも関わらず 関数外でhead(top) にアクセスしてる
0419408
2007/08/29(水) 23:16:02一応こちらの環境(BCC5.5)では>>417を改善することで動作はします
(もう少し動作チェックしてみますが)
それから余談ですが、ポインタ配列使うなら ELEMENT next いらないんじゃないですか?
せっかくポインタ繋ぎしてるんですから add_data() 内で new_data=(ELEMENT *)malloc(sizeof(ELEMENT)) してみては?
いまは動作チェックが目的でこうしているというならゴメンナサイね
それから最後にfree()も忘れずに
0420407
2007/08/29(水) 23:24:18関数内でmallocはしなくて良い、と言う問題だったので、main側で確保したんです。
自分も関数内で確保した方がいいと思うのですが・・・
0421408
2007/08/29(水) 23:52:07そういうことですか
分かりました
それらが題意であるならしょうがないですね
余計なことかもしれませんが、
remove_element() は要素を削除するんですよね?
この方法(配列上で行う連結リスト)だと要素を削除した後、その後追加する際に、
空いている要素と空いていない(使われている)要素の区別がつかないので
その点も考慮していく方がよろしいかと思います
0422421
2007/08/29(水) 23:53:29main()
{
static int a[5]={15,8,48,50,27}
int sum,heikin,i;
sum=0;
for(i=0;i<5;i++){
sum=sum+a[i];
}
heikin=sum/5;
printf("goukei=%d\n",sum);
printf("heikin=%d\n",heikin);
}
これにあと配列中の奇数と偶数の数を出力するのを追加したいんですが
どうすればいいんでしょうか?
0424408
2007/08/30(木) 00:05:50こんなんでどうですか?
配列中の値を2で割ってあまりが出るかでないかで奇数、偶数を判断
#include <stdio.h>
main()
{
static int a[5]={15,8,48,50,27}
int sum,heikin,i;
int kisu=0,gusu=0;
sum=0;
for(i=0;i<5;i++){
sum=sum+a[i];
if(a[i]%2) kisu++;
else gusu+++
}
heikin=sum/5;
printf("goukei=%d\n",sum);
printf("heikin=%d\n",heikin);
printf("奇数 %d個 / 偶数 %d個",kisu,gusu);
}
0425408
2007/08/30(木) 00:08:32ところでなんで 421 なんですかね?
>printf("奇数 %d個 / 偶数 %d個",kisu,gusu);
改行忘れたので入れといてください
printf("奇数 %d個 / 偶数 %d個\n",kisu,gusu);
0426デフォルトの名無しさん
2007/08/30(木) 00:09:460427422
2007/08/30(木) 00:15:18ありがとうございます。
名前はミスして書いてしまったようです。すいません^^;
0428デフォルトの名無しさん
2007/08/30(木) 00:26:430429デフォルトの名無しさん
2007/08/30(木) 21:19:36例えば、データの処理(検索など)を行いながら、
同時に秒単位で経過時間を標準出力するといったようなことってできますか?
できるのであれば教えていただきたいのですが。
0430デフォルトの名無しさん
2007/08/30(木) 21:44:54検索のループ中に時間表示機能入れるなり、スレッド作るなり、signal使うなり
まぁ状況次第でなんなりとどーぞ。
0431デフォルトの名無しさん
2007/08/30(木) 23:14:55if(a[i] & 1)
//奇数
else
//偶数
では?
0432デフォルトの名無しさん
2007/08/30(木) 23:18:54% 2 でなにか不都合なことがあるの?
0433デフォルトの名無しさん
2007/08/30(木) 23:22:31負数が2の補数表現で無い環境の場合はうまくいかないんじゃない?
(そんな環境があるかどうかは知らないが…)
0434デフォルトの名無しさん
2007/08/30(木) 23:38:350435デフォルトの名無しさん
2007/08/30(木) 23:58:46もちろん論理的な不都合はないです。
ただ除算は一般に非効率なので、高速化を狙った提案。ですが、、
>>433
たしかに、そうですね。
使用可能かどうかの確認は必要だと思います。
0436デフォルトの名無しさん
2007/08/31(金) 01:46:43大丈夫、まともなコンパイラなら%2を割り算では実装しないから。
0437435
2007/08/31(金) 02:43:21gcc -S で試したら、確かに論理命令が生成されてました。
しかもunsigned だと n % 1 と n & 1 は完全に同じコードに。
勉強になりました。流れ止めて失礼しました。
0438デフォルトの名無しさん
2007/08/31(金) 09:54:01バグじゃね?
0439デフォルトの名無しさん
2007/08/31(金) 09:57:080440デフォルトの名無しさん
2007/08/31(金) 10:08:560441デフォルトの名無しさん
2007/08/31(金) 15:31:29整数のところだけを別の計算に使いたいのです。
どのようにすればできるのかでしょうか。
0442デフォルトの名無しさん
2007/08/31(金) 15:37:22一度 int にキャストする (正数のときのみ)、あるいは floor()。
入門以前のレベル。本くらい買え。
0443デフォルトの名無しさん
2007/08/31(金) 15:40:06浮動小数点の小数点以下を簡単に取る方法ってないですか?
473 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/31(金) 15:13:39
f - floor(f)
0444デフォルトの名無しさん
2007/08/31(金) 18:40:31--出力結果--
sample01.txt
sample02.txt
sample03.txt
sample04.txt
sample05.txt
------------
上のように出力し、かつそれぞれを格納したいのですが、
数字の部分に繰り返し文を使ってうまくやる方法がわかりません。
おしえてくらはい><
0445デフォルトの名無しさん
2007/08/31(金) 18:52:510446デフォルトの名無しさん
2007/08/31(金) 19:08:260447デフォルトの名無しさん
2007/08/31(金) 19:17:160448デフォルトの名無しさん
2007/08/31(金) 22:00:310449デフォルトの名無しさん
2007/08/31(金) 22:41:01うまくいきそうです!ありがとうございました!!
0450デフォルトの名無しさん
2007/09/01(土) 00:38:58できなくはないが、C言語入門の範疇じゃないな。
OS関連のプログラミングを勉強しないと無理。
0451デフォルトの名無しさん
2007/09/01(土) 01:05:03char filename[5][100];
for (i = 0; i < 5; i++) {
sprintf(filename[i], "sample%02d.txt", i + 1);
printf("%s\n", filename[i]);
}
0452デフォルトの名無しさん
2007/09/01(土) 23:22:05これもwindowsプログラミング特有の、#defineした型なんでしょうか?
0453デフォルトの名無しさん
2007/09/01(土) 23:23:290454デフォルトの名無しさん
2007/09/01(土) 23:35:05size_tは標準の型。
unsigned intとかunsigned longあたりのtypedef。
strlen()のリターン値とかで使われてる。
uintptr_tは知らんけど、
http://docs.sun.com/source/806-4836/conv_v9.html
これを見ると、導入が予定されてるのかな?
0455デフォルトの名無しさん
2007/09/02(日) 00:12:21sizeof演算子の結果の型と定められている。
uintptr_tはC99から導入された<stdint.h>で宣言されている型の1つで、
ポインタをキャストしても表現を失わないと規定されている符号無し整数型。
VC++でも最近はuintptr_t/intptr_tだけ<stdlib.h>で宣言されている。
<stdint.h>ごと入れればいいものを。
Windowsプログラムなら、uintptr_tよりUINT_PTRのほうが良く見かけるな。
こっちはWindows APIの型とされているし、
VC++にuintptr_tが入るよりも前から存在していたから。
0456デフォルトの名無しさん
2007/09/02(日) 00:43:43ttp://homepage3.nifty.com/mmgames/c_guide/05-02.html
まで勉強しました。そこで、もっといいサイトがあるよ〜
っていうのがあれば教えてくださいm(_ _)m
できれば書籍等も・・・・
教えて君で失礼しますた(´・ω・`)
0457452
2007/09/02(日) 00:48:08ありがとうございます。
なるほど、typedefでしたか・・・・。
0458デフォルトの名無しさん
2007/09/02(日) 00:49:16とりあえずこのサイト全部終わらせればいいんでない
0459デフォルトの名無しさん
2007/09/02(日) 01:12:37アセンブラのほうがいいですかね?
0460デフォルトの名無しさん
2007/09/02(日) 01:14:350461デフォルトの名無しさん
2007/09/02(日) 01:14:41アルゴリズムの問題だと思われ。
0462デフォルトの名無しさん
2007/09/02(日) 01:15:54grepか何かのソース読んでみるのはどーか
0463デフォルトの名無しさん
2007/09/02(日) 01:23:43その比較した正規表現の処理系も、おそらくCで書かれてると思われ。
0464デフォルトの名無しさん
2007/09/02(日) 01:28:480465デフォルトの名無しさん
2007/09/02(日) 01:35:56って初心者ですか
そうですね
0466デフォルトの名無しさん
2007/09/02(日) 05:17:20俺としては、今はもう読むこと無いけど
「C言語入門本物志向が身に付く本」;入門
「ポインタ完全制覇」:ポインタ関連
「文字列操作+ファイル入出力完全制覇」:文字通りの内容
全部「科学技術評論社」
あとは、一応K&R。入門本じゃないけど。
まぁサイトでいえばwisdomsoftかな。
他にも色々あるけど。まぁ、がんばってね
それにつけても、俺が今のレベルまでどうやって勉強してきたのか
さっぱりわからん。学びはじめの頃は
[putchar()//一文字出力する関数]なんてコメントを書きながら
ソース書いてたな。
0467デフォルトの名無しさん
2007/09/02(日) 06:45:53CでOSや組み込み系のドライバをサクサク書けるようになるには10年はかかる
やっと使えるなって感じた頃は全く需要がない恐れがある
0468デフォルトの名無しさん
2007/09/02(日) 07:10:1710年もかからないよ
それに、C言語とOS、ドライバーは関係がない
0469デフォルトの名無しさん
2007/09/02(日) 07:12:09ってアセンブラ厨の老人が沸いてくるよ
0470デフォルトの名無しさん
2007/09/02(日) 08:05:57ドライヴァはCで書かれている。
むしろmkdirだのpasswdとかのユーザープログラムがアセンブラで書かれて
たりして笑える。
0471デフォルトの名無しさん
2007/09/02(日) 08:06:540472456
2007/09/02(日) 08:46:32レス((ヾ(。・ω・)ノ☆゚+.ァリガトゥ
とりあえず今のサイト最後までがんばってみて、
終わったら466さんの紹介してくださった書籍
よんでみます^^
0473デフォルトの名無しさん
2007/09/02(日) 11:27:38個人的には文字列操作はダルいけど、メモリ操作は楽。
0474デフォルトの名無しさん
2007/09/02(日) 13:44:29C て高級アセンブラだよね
こんな言語で業務アプリ書くアホいないよな
って感じてた老人ならここにいますが...
0475デフォルトの名無しさん
2007/09/02(日) 14:22:06あんたアフォですか?
OSを作成するためにCが作成されたのに・・・
0476デフォルトの名無しさん
2007/09/02(日) 14:26:530477デフォルトの名無しさん
2007/09/02(日) 15:22:49今回は1325という正しい答えを知っていたのでエラーに気づきましたが、答えがわからない場合はどんな風にデバッグしていますか?
0478デフォルトの名無しさん
2007/09/02(日) 15:26:440479デフォルトの名無しさん
2007/09/02(日) 15:30:12それぞれ個別にテストしてみる。
0480デフォルトの名無しさん
2007/09/02(日) 15:34:280481デフォルトの名無しさん
2007/09/02(日) 15:36:56そのようなプログラムをCで書かなきゃいけないか?w
excelで十分だろ
0482デフォルトの名無しさん
2007/09/02(日) 15:40:25それで>>477みたいな疑問を持ったんだからやる価値があったってことだろう
0483デフォルトの名無しさん
2007/09/02(日) 16:52:58/* Buffer for line numbers.
An 11 digit counter may overflow within an hour on a P2/466,
an 18 digit counter needs about 1000y */
#define LINE_COUNTER_BUF_LEN 20
static char line_buf[LINE_COUNTER_BUF_LEN] =
{
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0',
'\t', '\0'
};
/* Position in `line_buf' where printing starts. This will not change
unless the number of lines is larger than 999999. */
static char *line_num_print = line_buf + LINE_COUNTER_BUF_LEN - 8;
/* Position of the first digit in `line_buf'. */
static char *line_num_start = line_buf + LINE_COUNTER_BUF_LEN - 3;
/* Position of the last digit in `line_buf'. */
static char *line_num_end = line_buf + LINE_COUNTER_BUF_LEN - 3;
0484デフォルトの名無しさん
2007/09/02(日) 16:55:36/* Compute the next line number. */
static void
next_line_num (void)
{
char *endp = line_num_end;
do
{
if ((*endp)++ < '9')
return;
*endp-- = '0';
}
while (endp >= line_num_start);
if (line_num_start > line_buf)
*--line_num_start = '1';
else
*line_buf = '>';
if (line_num_start < line_num_print)
line_num_print--;
}
Cの基本的なことを勉強して、cat.cのソースを読んでいますが
この行を計算する関数の処理が何が言いたいのかわかりません。
line_bufを参照しながらカウントしているように見えますが、いまひとつわかりません。
どなたかご教授お願いします。
0485デフォルトの名無しさん
2007/09/02(日) 17:16:14>何が言いたいのかわかりません
何を聞きたいのかわかりません
0486デフォルトの名無しさん
2007/09/02(日) 17:37:21"399" → "400"みたいに。
0488デフォルトの名無しさん
2007/09/02(日) 18:37:35文字列を逆順に表示したりするプログラムを書くためですか?hw
0489デフォルトの名無しさん
2007/09/02(日) 18:41:380490デフォルトの名無しさん
2007/09/02(日) 18:42:260491デフォルトの名無しさん
2007/09/02(日) 18:43:350492デフォルトの名無しさん
2007/09/02(日) 19:06:28変数Aに一秒ごとに1を追加していくようにしたいのですが、どうしたらいいのでしょうか。
0493デフォルトの名無しさん
2007/09/02(日) 19:07:300494デフォルトの名無しさん
2007/09/02(日) 19:09:41いや、タイマーに使いたいのですが。
0495デフォルトの名無しさん
2007/09/02(日) 19:14:44main()
{
int A = 0;
while (1) {
sleep(1);
A++;
}
}
0496デフォルトの名無しさん
2007/09/02(日) 19:16:24つ time.h
使った事無いけど…orz
0497デフォルトの名無しさん
2007/09/02(日) 19:21:450498デフォルトの名無しさん
2007/09/02(日) 19:22:160499デフォルトの名無しさん
2007/09/02(日) 19:29:53時刻の取得の仕方は環境依存
0500デフォルトの名無しさん
2007/09/02(日) 19:35:31ありがとうございます
試してきます
0501487
2007/09/02(日) 20:03:34> 文字列を逆順に表示したりするプログラムを書くためですか?hw
なかなかよいポイントをついているね
プログラミングの本質はデータの加工と入出力
世の中のすべてのプログラムは「文字列を逆順に表示したりするプログラム」
データーベースのアプリだって通信モジュールだって高度な科学技術計算のプログラムだって
みーんな本質的には「文字列を逆順に表示したりするプログラム」だ
OSもね
0502デフォルトの名無しさん
2007/09/03(月) 05:33:180503デフォルトの名無しさん
2007/09/03(月) 20:21:340504デフォルトの名無しさん
2007/09/03(月) 23:10:59ヒント:なんかVIPの同盟国とかほざいてるから
http://live24.2ch.net/test/read.cgi/ootoko/1188634806/
0505デフォルトの名無しさん
2007/09/04(火) 16:12:59スクリプト系の言語のことをいってんじゃないの?
0506デフォルトの名無しさん
2007/09/04(火) 16:17:540507デフォルトの名無しさん
2007/09/04(火) 18:12:15{
do {
switch (getnum("番号を入力してください\n")) {
case 1:
question(1);
break;
}
} while (0);
return 0;
}
int getnum(const char *msg)
{
int n;
for (printf(msg); scanf("%d", &n) != 1;) {
while (getchar() != '\n');
}
return n;
}
ここで使われているgetnumがいまいち理解できません。
何をしてるいるのか教えてください。
0508デフォルトの名無しさん
2007/09/04(火) 18:18:44scanf("%d", &n) は数字を入力
!= 1 は scanf で数字が正しく入力されたか確認
while (getchar() != '\n'); は改行が来るまで入力を読み飛ばす
return n; は入力された数字を返す
これでおk?
0510デフォルトの名無しさん
2007/09/05(水) 16:50:33質問させてください。
+と-と|を使って升目を出力するプログラムです。
第一に40行目のところのコメントをはずすと最初のループはなぜ止まるのですか?
第二に40行目の部分のコメントをはずしたときに
47行目を切り取り、49行目の後に記述すると結果が変わるのはなぜですか?
いろいろ試すうちに2つ目の問題もでてきて分からなくなりました。
よろしくおねがいします。
0511デフォルトの名無しさん
2007/09/05(水) 16:54:420512デフォルトの名無しさん
2007/09/05(水) 17:09:320513デフォルトの名無しさん
2007/09/05(水) 17:45:26> 第二に40行目の部分のコメントをはずしたときに
> 47行目を切り取り、49行目の後に記述すると結果が変わるのはなぜですか?
コンパイラのバグだと思われる。
0514デフォルトの名無しさん
2007/09/05(水) 18:09:57>>512も言っているけどswitch内のcontinueやめてbreakにするとこうなる
+---+
| |
+---+
| |
+---+
0515デフォルトの名無しさん
2007/09/05(水) 18:14:27確認してないけどたぶんあれね
continueにしちゃっているから44行目からwhile()の式評価にとんじゃっているんだと思う
実際には47〜49行目は実行されていない
本来は47行目に行かなきゃ行けないのでbreakにする
0516デフォルトの名無しさん
2007/09/05(水) 18:20:35while (d < e){
↓
while (d < e){printf("");
0517デフォルトの名無しさん
2007/09/05(水) 18:26:23bcc だと >>516 の変更前後で出力内容が変化した
変更前
+---+
変更後
+---+
| |
+---+
| |
+---+
0518デフォルトの名無しさん
2007/09/05(水) 18:28:46とりあえず>>515は忘れて
>>514は目的の動作が分からんので保留かな
0519510
2007/09/05(水) 18:42:26continueで戻ることばかり考えていてbreakを忘れていました、
while文の中にあるのでcontinueを使わずとも繰り返しになるのですね、
whileとbreakとcontinueの使い方を再確認します。
変数名も以後気をつけます。
コンパイラのバグということで
他のコンパイラを試してみようと思っていたのですが
>>517さん試していただきありがとうございました。
0520デフォルトの名無しさん
2007/09/05(水) 21:23:40switch があるから、breakはそっちを抜けるだけで
whileにまで影響しないんだよ
switchとwhileが同じbreakなのは
たまに不便だがな
0521デフォルトの名無しさん
2007/09/05(水) 22:16:45ループフラグとかgotoとかキラーイ
0522デフォルトの名無しさん
2007/09/06(木) 02:48:24{
struct node *b;
b = a;
a = NULL;
free( b );
return a;
}
free関数の形式を調べてみるとvoid free(void *ptr);と書いてありました
ttp://www.bohyoh.com/CandCPP/C/Library/free.html
つまり、上記の関数を実行すると、引き数で渡されたポインタaがNULLを代入される前に指していた領域を開できるということでしょうか?
自分で調べてみて「たぶんあっているな。」とは思ってもどうしても確信できなくて不安になってしまいます。みなさんはそんなことありませんでしたか?(このレス二つ目の疑問です)
0523デフォルトの名無しさん
2007/09/06(木) 04:23:10y/n を聞いてくるコマンド ques が
あったとします。y/n を検知して
代わりに y を入力してくれる
プログラムを書きたいのですが、
何をキーワードに検索してよいのか
すらわかりません。パイプで検索したのですが
何か違う感じでした。
よろしくお願いします。
0524デフォルトの名無しさん
2007/09/06(木) 07:33:36・できる。
・根本的にポインタを理解できていればそんなことはないと思う。
>>523
他に標準入力する項目がなく、quesが確実に標準入力を利用しているというのなら、
yes | ques
でOK。
0525デフォルトの名無しさん
2007/09/06(木) 10:22:16すいません。C言語でやりたいのです。
それと質問に応じて no と答える場面もあります。
よろしくお願いします。
0526デフォルトの名無しさん
2007/09/06(木) 11:01:35それなら、パイプで間違ってないと思う。
コマンドの標準出力/標準エラー出力を監視しながら特定のパターンを認識したら、
コマンドの標準入力に対して、yまたはnを投げる。
>何か違う感じでした。
何を期待しているか知らないが、コンソールアプリでは
WindowsのGUIアプリのように、入力待ちになったとかのイベントが
飛んできて、そこに処理を記述するわけではない。
実装はどうしても泥臭くなると思うが。
0527デフォルトの名無しさん
2007/09/06(木) 11:03:40もし現在の日付をfprintf("%d %d %d %d %d %d\n",local->tm_year・・・以下略
こういう風にファイルに保存したとしますよね。
このファイルを読み込むとき、
fscanf("%d%d%d%d%d%d",&year,・・・以下略という風に読み込んだとき、
何故yearという変数にはしっかりとyearで保存した数字が格納されるのですか?
説明下手ですみません。
0528デフォルトの名無しさん
2007/09/06(木) 11:07:05で書き込むと当然、
2007 09 06 ・・・
となるから、fscanf("%d%d%d%d%d%d",&year,・・・で読み込むときは
空白か改行まで読まれるので
2007
09
06
・・・
と順に読み込まれる
0529デフォルトの名無しさん
2007/09/06(木) 11:08:05どういう結果になると思ってた?
0530デフォルトの名無しさん
2007/09/06(木) 11:10:00順番に気をつけないとメチャクチャになりますね。分かって良かった。
ありがとうございました。
0532デフォルトの名無しさん
2007/09/06(木) 16:52:09mainでその関数を100回くらいまわしたら
値がかわってくるんだけど何が原因だと思われますか?
配列は20要素で
引数は4つ使ってます。
0533デフォルトの名無しさん
2007/09/06(木) 16:56:09そりゃプログラムのバグでしょ
具体的にコード見せてくれないとそれ以上はわからん
0534デフォルトの名無しさん
2007/09/06(木) 17:09:10double ma[120][20];
double h1[20],h2[20],n[120];
int num;
fileinput(h1,h2,num);
for(i=0;i<120;i++){
n[i]=fmake(ma[i],h1,h2,num);
}
}
そしてfmake関数に渡します
double fmake(double a[20],double b1[20],double b2[20],int n){
int i;
for(i=0;i<20;i++){
printf("b1:%lf b2:%lf",b1[i],b2[i]);
}
}
まー一部なんでわかりにくいかもしれませんが。
fmake関数のprintfで20ループくらいまでは
きちんと表示されるんですけど途中でnanとかおかしな数字が表示されるんです。
0535デフォルトの名無しさん
2007/09/06(木) 17:10:210536532
2007/09/06(木) 17:13:300537デフォルトの名無しさん
2007/09/06(木) 17:25:070538デフォルトの名無しさん
2007/09/06(木) 17:26:57思わず笑ってしまった。
>>535の not a number は>>534の nan を指してる。
NaN (Not a number)、日本語だと非数。
浮動小数点演算で、0除算など計算結果が正しく求められない計算を
したときに、値が正常でないことを示す特別な値が格納される。その値のこと。
繰り返しはまったく同じものを表示しているわけではないみたいだけど、
fileinputで読んできた値がすでにおかしいんじゃないの?
0539デフォルトの名無しさん
2007/09/06(木) 17:45:24fileinput をでっちあげて動かしてみたが、まったく問題ない。
省略した部分がおかしいと思われ。
0540532
2007/09/06(木) 17:46:27プログラムはあってるってことですか
ありがとうございます。
どうしようもなくなったら直接fmakeにb1,b2のファイルいれますわ。
0541デフォルトの名無しさん
2007/09/06(木) 17:49:45プログラムもなにも、挙げられた断片だけでは何もしないコードに見え
る。fmake()は何も返してないし。
0542532
2007/09/06(木) 17:53:22double a[20], データ120X20
double b1[20], 20次元の平均
double b2[20], 20次元の分散
int n 平均・分散の組。
式は書くの大変だから省いてるだけです。
0543デフォルトの名無しさん
2007/09/06(木) 18:02:250544532
2007/09/06(木) 18:04:15int i;
for(i=0;i<20;i++){
printf("b1:%lf b2:%lf",b1[i],b2[i]);
}
以上
0545デフォルトの名無しさん
2007/09/06(木) 18:06:140546デフォルトの名無しさん
2007/09/06(木) 18:30:270547デフォルトの名無しさん
2007/09/06(木) 19:15:12どこに問題があるんですかね?
コンパイラはgcc3.3.6です。
ttp://www8.uploader.jp/user/vipprog/images/vipprog_uljp00020.txt
0549デフォルトの名無しさん
2007/09/06(木) 19:35:120550デフォルトの名無しさん
2007/09/06(木) 19:39:090551デフォルトの名無しさん
2007/09/06(木) 19:48:250552デフォルトの名無しさん
2007/09/06(木) 19:48:450553デフォルトの名無しさん
2007/09/06(木) 19:51:32配列の宣言の仕方とsizeの扱い直せばいけると思う
0554デフォルトの名無しさん
2007/09/06(木) 19:53:07連投スマン
0555デフォルトの名無しさん
2007/09/06(木) 20:18:460556デフォルトの名無しさん
2007/09/06(木) 21:39:02#include<stdio.h>
int main(void){
int x, y, width=3, height=4;
for(y=0;;y++){
for(x=0;x<width;x++) printf("+---");
printf("+\n");
if(y>=height) break;
for(x=0;x<width;x++) printf("| "" "" "); // コピペ用
printf("|\n");
}
return 0;
}
0557デフォルトの名無しさん
2007/09/06(木) 22:38:24サイトありましたらおしえてください m)_ _m)
0558デフォルトの名無しさん
2007/09/06(木) 22:43:180559デフォルトの名無しさん
2007/09/06(木) 23:16:500560デフォルトの名無しさん
2007/09/07(金) 10:46:15ありがとうございました
0561デフォルトの名無しさん
2007/09/07(金) 12:55:50Cで作成できないことはない。
まぁ開発にあたっては、Cの知識だけでなく、それ以上の多くの知識が求められます。
0562デフォルトの名無しさん
2007/09/07(金) 14:31:570563デフォルトの名無しさん
2007/09/07(金) 16:02:02それとも既存のものの効率的な組み合わせにこだわったほうがいいですか?
0564デフォルトの名無しさん
2007/09/07(金) 16:59:440565デフォルトの名無しさん
2007/09/07(金) 19:00:20ありがとうございます。なるほど!積極的に作ります
0566デフォルトの名無しさん
2007/09/07(金) 19:21:22どういう違いがあるんでしょう?いくつかの説明文見たところ自分では同じように
思えるんですが、グローバル変数にstaticを付けるプログラムの例を見かけたので気になりました。
0567デフォルトの名無しさん
2007/09/07(金) 19:27:15static を付けたグローバル変数 → 他のファイルからは参照できないが、同じソースファイル内ならどの関数からでも参照できる
static を付けた関数内の変数 → 他の関数からは参照できない
間違って書き換えたりしないように、見える範囲をなるべく最小限にする方が良い。
0568デフォルトの名無しさん
2007/09/07(金) 19:40:10ありがとうございます、アクセスできる範囲に違いがあるんですね。
つい値を保持できる期間ばかりに目が言ってたみたいです
0569デフォルトの名無しさん
2007/09/07(金) 23:03:28#include <stdio.h>
#include <string.h>
int getflg(char wd);
main()
{
int n;
char word;
printf("文字入力:");
scanf("%s",&word);
n=getflg(word);
printf("flg=%d",n);
}
int getflg(char wd)
{
int flg=0;
if ( strcmp(wd,"あいうえお")==0 ){
flg=1;
}
return flg;
}
これだとエラーがでるのですがどうすればよいのでしょうか;;
0570デフォルトの名無しさん
2007/09/07(金) 23:06:22>printf("文字入力:");
>scanf("%s",&word);
え?w
0571デフォルトの名無しさん
2007/09/07(金) 23:08:53「文字」ではなく「文字列」だから
#include <stdio.h>
#include <string.h>
int getflg(char *wd);
main()
{
int n;
char word[20];
printf("文字入力:");
scanf("%s",word);
n=getflg(word);
printf("flg=%d",n);
}
int getflg(char *wd)
{
int flg=0;
if ( strcmp(wd,"あいうえお")==0 ){
flg=1;
}
return flg;
}
だね
0573デフォルトの名無しさん
2007/09/07(金) 23:18:20>文字列だと&は必要ないということですかね?
必要ない
>scanf("%s",word);
>if ( strcmp(wd,"あいうえお")==0 )
文字列同士の比較をしたいわけでしょ
char wd だと1文字だけしか渡せない、文字列として渡したいならポインタとして渡すしかない
char *wd は文字列のポインタを渡している
0574デフォルトの名無しさん
2007/09/07(金) 23:30:21#include <string.h>
int getflg(char *wd);
main()
{
int n;
char word[20];
printf("文字入力:");
scanf("%s",word);
n=getflg(word);
printf("flg=%d",n);
}
int getflg(char *wd)
{
return !strcmp(wd,"あいうえお") ? 1 : 0;
}
0575デフォルトの名無しさん
2007/09/07(金) 23:34:11> double ma[120][20];
これでスタックフレームを何byte消費しているか理解しているか?
static double ma[120][20];
static double h1[20]
static double h2[20]
static double n[120];
にしてみろ
これで結果がお前の予想通りになったなら
コンパイラはお前の予想通りには動かないということを知っておけ
0576569
2007/09/07(金) 23:35:04char wdだと1文字だけなんですか?
0577デフォルトの名無しさん
2007/09/07(金) 23:41:55> これでスタックフレームを何byte消費しているか理解しているか?
たった、18,9Kじゃん。
0578569
2007/09/07(金) 23:47:17int getflg(char wd[])
と違いは何かありますか??
0579デフォルトの名無しさん
2007/09/07(金) 23:52:06int getflg(char wd[]);
と
int getflg(char wd);
の違いが理解できない奴はCをする資格が無い
VBかJavaScriptあたりで妥協しておくことをお勧めする
0580デフォルトの名無しさん
2007/09/07(金) 23:54:25入門書でも買えばいいのに。
0581デフォルトの名無しさん
2007/09/08(土) 00:14:43ほかの言語ではまずありえないことだけど
0582569
2007/09/08(土) 00:33:22基礎的なHPをいろいろ探してみてきたが
int getflg(char *wd);
これだと、ポインタによる引渡しで
int getflg(char wd[]);
これだと、wdに文字列を直接代入する的なものですか?
0583デフォルトの名無しさん
2007/09/08(土) 00:33:430584デフォルトの名無しさん
2007/09/08(土) 00:34:39いや、ややこしいことに
int getflg(char *wd);
と
int getflg(char wd[]);
は同じ
0585デフォルトの名無しさん
2007/09/08(土) 00:38:23C FAQのポインタあたりを一通り読んでみるとか。
http://www.kouno.jp/home/c_faq/
0588デフォルトの名無しさん
2007/09/08(土) 00:45:140589デフォルトの名無しさん
2007/09/08(土) 01:04:12ちがいます
Cでは関数の引き数の宣言において、char wd[]とchar * wdは全く同じ扱いです。
0590デフォルトの名無しさん
2007/09/08(土) 01:10:48とか書くとまた変わって来るからややこしい。
0591デフォルトの名無しさん
2007/09/08(土) 01:45:54int getflg(char wd[]); も
int getflg(char wd[10]); も
int getflg(char wd[42]); も一緒
0592デフォルトの名無しさん
2007/09/08(土) 02:30:12char型の領域を動的に確保してそこにコマンドライン引数のargv[i]を格納していきます。
void main(int argc, char *argv[]){
int i;
char *hikisu;
for(i=0; i<argc; i++){
hikisu[i] = (char *)malloc(sizeof(char));
memset(hikisu[i], NULL, sizeof(char));
strcpy(hikisuu[i], argv[i]);
}
}
これでコンパイルが通らないのですが、何が悪いのかよくわかりません。
ご教授お願いします。
0593デフォルトの名無しさん
2007/09/08(土) 02:38:44動的確保以前のポインタの勉強をしなおせ。
--
// インクルードファイルを適切にインクルードしていない
void main(int argc, char *argv[]){
// mainの戻り値型はintにするべき
// 中括弧は別の行に書くのが一般的
int i;
// 一文字変数はインクリメンタルサーチしにくいからお勧めしない
char *hikisu;
// ポインタ変数は、ポインタ一個しか保持できない。引き数を複数保持したいなら、これではダメ
for(i=0; i<argc; i++){
hikisu[i] = (char *)malloc(sizeof(char));
// malloc()の引き数はバイト数。これでは1バイトしか確保できない
memset(hikisu[i], NULL, sizeof(char));
// malloc()したエリアをmemset()で潰してしまうのはナンセンス(一部に妄信者はいるが)
// つーか、引き数が無茶苦茶
strcpy(hikisuu[i], argv[i]);
// これも引き数が間違っている
}
}
--
まぁ、取り敢えずこの辺にしておいてやるかw
0594デフォルトの名無しさん
2007/09/08(土) 02:44:46stdlib.hがincludeされてない。
strcpy(hikisuu[i], argv[i]);
「hikisuu」はどっから出てきた?(タイプミス?)
この2つ直すととりあえずコンパイルは通るかもしれない。(コンパイラ次第)
が、落ちる可能性が高いな。
ていうかコンパイルのエラーを書け。
0595デフォルトの名無しさん
2007/09/08(土) 21:00:46/**
@param
@return
*/
のようなのが決まっていて、これでHTMLのドキュメントを自動作成できますが、
Cにはそのようなものはありますか?
0596デフォルトの名無しさん
2007/09/08(土) 21:03:280597595
2007/09/08(土) 21:25:58できるだけ標準的なものを使いたいのですが、そのDoxygenというのはよく使われていますか?
もしJISやISOやその他の標準化団体の制定した書式があるようならば、教えて欲しいのですが。
0598デフォルトの名無しさん
2007/09/08(土) 21:28:38デファクトスタンダードには近いかも
0599デフォルトの名無しさん
2007/09/08(土) 23:08:08成功は0で、失敗は-1で返すのがいいんでしょうか?
古いCの関数はこれが多いですよね。
成功は1で失敗は0にすると、判定側でif(!func()){ printf("error"); }
のような書き方ができるので、これの方が便利な気もするのですが、
どっちがいいんでしょうか。
0600デフォルトの名無しさん
2007/09/08(土) 23:16:04古いCの関数っていうか、unixのシステムコールだろ。
0601デフォルトの名無しさん
2007/09/08(土) 23:24:16俺は自分でSUCCESSとFAILUREをdefineして使うのが好き。
SUCCESSが1でも0でもif(func!=SUCCESS)と書く。
この辺は好みじゃね?
0602デフォルトの名無しさん
2007/09/08(土) 23:40:14いろいろ値が定義してあると、読むのに負担がかかる。
単純なTRUE,FALSEでも、0以外と0になっているかとか、定義が一箇所かとか気にする必要あるし。
いまやってる仕事なんて、RTN_OKとRTN_ERRだけかと思ってたら、RTN_NODATAとか返してたり返した無かったり
するし。
0603デフォルトの名無しさん
2007/09/08(土) 23:55:20を順番に読み込みたいのですが、どのようにすれば良いのでしょうか?
通常のファイルを開く方法(fopen)では、指定ファイル名をしてforループで回して変更するとかいう事が出来ない
みたいなので困っています。どなたかご教授よろしくお願い致します。
0604デフォルトの名無しさん
2007/09/08(土) 23:58:010605デフォルトの名無しさん
2007/09/08(土) 23:58:21OSのAPIに頼ってディレクトリのファイル名一覧を作る。
で、順番にfopenか何かで開く。
0606デフォルトの名無しさん
2007/09/08(土) 23:58:490607デフォルトの名無しさん
2007/09/08(土) 23:59:520608デフォルトの名無しさん
2007/09/09(日) 00:00:300609デフォルトの名無しさん
2007/09/09(日) 00:00:39ファイル名が規則的なら、、ループで回して処理できるよ。
0610デフォルトの名無しさん
2007/09/09(日) 00:10:340611デフォルトの名無しさん
2007/09/09(日) 00:31:100612デフォルトの名無しさん
2007/09/09(日) 00:42:52FILE *fp;
char filename[12];
for (i = 1; i <= 1000; i++) {
sprintf(filename, "***%d.dat", i);
fp = fopen(filename, "r");
以下略
0613603
2007/09/09(日) 00:50:17どうもありがとうございます。
sprintfという関数を知りませんでした。
非常に助かりました。
0614デフォルトの名無しさん
2007/09/09(日) 12:21:33この最後のFor文は何をしているのですか?
よろしくお願いします。
int wk1;
char DateT[10+1];
char bufs[128];
DateT[0] = "2007/10/01"
memset( bufs, 0x0, sizeof(bufs) );
memcpy( bufs, DateT+ 5, 2 );
wk1= atoi(bufs); wk1-= 1;
for( i=6; i>=5; i--, wk1/=10 )
DateT[i]= (char)((wk1%10)+'0');
0615デフォルトの名無しさん
2007/09/09(日) 12:31:140616デフォルトの名無しさん
2007/09/09(日) 12:33:450617デフォルトの名無しさん
2007/09/09(日) 12:37:52とりあえずそのコード、コンパイル通らなくない?
質問するくらいだから自分で書いたコードじゃないんだろうけど、あんまり参考にしたくないコードだと思う。
で、for 文限定だと
短い答え:数値を文字列に変換している。
もうちょっと長い答え:
wk1 % 10 で wk1 の一の位の数値を得る。
これに '0' ('0' の文字コード値を足すと 0 なら '0' に 1 なら '1' と数値→文字の変換が出来る。
wk1 /= 10 で十の位が一の位に移って繰り返し。
0618デフォルトの名無しさん
2007/09/09(日) 12:51:37?? DataT[0] = "2007/10/01"
そいつは、通らねえよ。
それにしても、俺の現場にあるソースに似てるwまさかww
0619sage
2007/09/09(日) 13:47:36>>616様
>>617様
>>618様
どうもありがとうございました。助かりました。
私の知り合いが解析しているソースを
出来ないなりに私も手伝おうかと思って頭から調べているときに
ひっかかった次第です。
自分はもう少しCの勉強が必要ですね。orz
0620デフォルトの名無しさん
2007/09/09(日) 13:50:39失礼しました。
0621デフォルトの名無しさん
2007/09/09(日) 20:40:55sageで書き込んでもスレッドは下がりません
0622デフォルトの名無しさん
2007/09/09(日) 21:54:44どうすれば改善できるか見てもらえないでしょうか?
http://www.dotup.org/ C言語ってコメント入れているファイルです
0623デフォルトの名無しさん
2007/09/09(日) 22:06:180624デフォルトの名無しさん
2007/09/09(日) 22:08:41根本的に改善する余地あり
改善案は次の通り(命名に付いては適当に変えたほうが良い)
QUE *queue_init(void);
void queue_terminate(QUE *que);
int queue_enque(QUE *que, void *data);
void *queue_deque(QUE *que);
int queue_size(QUE *que);
0625デフォルトの名無しさん
2007/09/09(日) 22:12:520626622
2007/09/09(日) 22:17:55確かにそうですね。とりあえず今回はって事で書きました
>>623
queue_terminateはどういう処理をしますか?
>>625
そうします
0627デフォルトの名無しさん
2007/09/09(日) 22:21:08QUE *queue_init(void); → QUE型のメモリ割り当て、初期化
void queue_terminate(QUE *que); → 保持しているキューデータのメモリ解放、QUE型をメモリ解放
だと思う。まぁC++のあれだよね^^
0628622
2007/09/09(日) 22:42:24そういう事ですか、わかりました
根本的な改善はわかったんですが、今回のデータを入れることができないっていう事の
改善策はありませんか?
また次も同じことになりかねないので・・・
0629デフォルトの名無しさん
2007/09/09(日) 22:57:07いそいで作ってみた
バグあるかも
ttp://2sen.dip.jp:81/cgi-bin/upgun/up1/source/up8249.lzh
0630デフォルトの名無しさん
2007/09/09(日) 22:57:110631624=629
2007/09/09(日) 23:04:25まあいっか
0633デフォルトの名無しさん
2007/09/10(月) 00:00:07>>629 の不完全型はデータを隠蔽するのに便利!
オススメのテクニックだよ
0634デフォルトの名無しさん
2007/09/10(月) 13:51:08閏年にも対応すること.
西暦年が4で割り切れる年は閏年
ただし、西暦年が100で割り切れる年は平年
ただし、西暦年が400で割り切れる年は閏年
指定された年,月の一日の曜日を求めると良い.曜日を求めるには,Zellerの公式を使う.年も月も整数型の変数を用い,日の部分は1に置き換えること.
(年+年/4-年/100+年/400+(13*月+8)/5+日 )%7
1月と2月は前年の13月,14月として考える.
この式の答えと曜日の関係は以下の通り.
0:日曜日,1:月曜日,2:火曜日....,6:土曜日
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
このようなプログラムを作りたいのですがちんぷんかんぷんでまったくできません。
よろしければ見本のようなものを作ってもらえないでしょうか。
お願いします。
0635デフォルトの名無しさん
2007/09/10(月) 13:54:010636デフォルトの名無しさん
2007/09/10(月) 14:01:370637デフォルトの名無しさん
2007/09/10(月) 14:04:46typedef struct tagAAA {
int a;
int b;
int c;
} AAA, * PAAA;
AAA aaa1 = {0};
AAA aaa2;
memset(&aaa2, 0, sizeof(AAA));
おしえてください。
0638デフォルトの名無しさん
2007/09/10(月) 14:27:280639デフォルトの名無しさん
2007/09/10(月) 14:38:39memsetでもそれは同じではないの?
両方、構造体のサイズ分、0 でクリアされるとおもってるんだけど。
0640デフォルトの名無しさん
2007/09/10(月) 14:43:38memsetで0をセットは百害あって一利なし。使わないほうがよい。
構造体を初期化したいときには、各々の構造体メンバー変数に対し、
決められた初期変数を代入すること。
memsetが唯一有効なのは、メモリーをバイナリーエディッターで除くとき。
反論↓↓↓
0641デフォルトの名無しさん
2007/09/10(月) 14:45:29doubleの0x00000000は0.0と保障されているわけではない。
ということでしょ。
0642デフォルトの名無しさん
2007/09/10(月) 14:46:49エディッターのあたりがよくわからない
0643デフォルトの名無しさん
2007/09/10(月) 14:50:06= {0} での初期化と、 memset での初期化の違いはあるの?
�@ AAA aaa1 = {0};
�A AAA aaa2; memset(&aaa2, 0, sizeof(AAA));
は同じことをしているのかということです。
0644デフォルトの名無しさん
2007/09/10(月) 15:17:060645デフォルトの名無しさん
2007/09/10(月) 15:28:18コンパイラによっては、{0}の方が、より最適化される可能性が高い。
0646デフォルトの名無しさん
2007/09/10(月) 15:29:45�@ graceful
�A rude
0647デフォルトの名無しさん
2007/09/10(月) 15:58:29例えば下記のようなファイルがあり
あいう
あああ
いいい
ううう
これを「いいい」だけ削除して下記のようにしたいのですが、1行だけ削除するようなやり方がわかりません
あいう
あああ
ううう
やりかたをご教授いただけないでしょうか
0648デフォルトの名無しさん
2007/09/10(月) 15:59:05AAA aaa1 = {0}; とかで構造体を初期化しているのってほとんどみないような。
0649デフォルトの名無しさん
2007/09/10(月) 16:01:45なんで、構造体を初期化する必要があるの?
構造体メンバーを初期化する必要はあると思うが、構造体全体の初期化はあまり意味がないだろう。
0650デフォルトの名無しさん
2007/09/10(月) 16:03:130651デフォルトの名無しさん
2007/09/10(月) 16:04:28CRITICALSECTIONとか、RECTとか。いちいちメンバごとに初期値いれるソースとかみたことないよ。
いったん初期化してから個別に値いれることはあるけど。
0652デフォルトの名無しさん
2007/09/10(月) 16:11:33�A AAA aaa1; memset(&aaa1, 0, sizeof(AAA));
�@=�A FA?
0653デフォルトの名無しさん
2007/09/10(月) 16:18:14memset で全ビットを 0 にする方法では、処理系によっては浮動小数点やポインタが 0.0 や NULL にならない場合がある。
�@≠�A
0654デフォルトの名無しさん
2007/09/10(月) 16:45:34ありがとう。すっきりしました。
0655デフォルトの名無しさん
2007/09/10(月) 17:37:39改行コードで区切って、消す行の後を違う領域に分けた後、消す行のところに繋げる
0656デフォルトの名無しさん
2007/09/10(月) 20:07:43C++のクラスのオブジェクトに対してもそれをやりそう。
0657デフォルトの名無しさん
2007/09/10(月) 20:45:130658デフォルトの名無しさん
2007/09/10(月) 20:49:28うちの連中ならやりそうだw
ところで、>>637のは
AAAA aaa1 = {}; //{0}の0省略
はできないの?C++の本に乗ってたんだけど、Cでも試したら出来てそうなんだけど。
0659デフォルトの名無しさん
2007/09/10(月) 21:05:36エラー E2264 式が必要といわれた
@BCC5.5
0660デフォルトの名無しさん
2007/09/10(月) 21:06:25C++ならできた。CL.EXE
0661デフォルトの名無しさん
2007/09/10(月) 21:09:58ANSI C的には文法違反。
{}の中には少なくとも一つの式がいる。
0662658
2007/09/10(月) 22:42:45gccではc89,c99モードにしてやっても出来るみたいなんだけど、
c99はまだ完全なサポートではないし、ことさら制限する様なことはしないのかも。
jiscのサイトから拾ったC言語の文書では、省略可を表すopt記号が無かったからやはり省略不可みたい。
参考)ttp://www.jisc.go.jp/app/pager?id=123813
0663デフォルトの名無しさん
2007/09/10(月) 22:49:09やっぱり電気屋とかで買うんですかね?
0664デフォルトの名無しさん
2007/09/10(月) 22:50:54どうしてC言語の勉強を始めたの?
0665デフォルトの名無しさん
2007/09/10(月) 22:52:24やっぱり日本とかで買うんですかね?
0667デフォルトの名無しさん
2007/09/10(月) 23:14:07遊ぶのに理由がいるのかい?
0668デフォルトの名無しさん
2007/09/10(月) 23:17:54遊びというのは個人的な理由。ではなぜ C言語を選んだ かの理由は???
0669デフォルトの名無しさん
2007/09/10(月) 23:19:06君、そういうことを言ってしまうと、自分にとって遊びだからという理由で
なぜその遊びを選んだかの理由は関係ないじゃ〜〜んって無責任な人間になってしまうよ?
なぜなら、殺人を遊びに選んだら、なぜ殺人をしたんですか?という質問に対して
君は常に「遊びだから」という身勝手な言い訳をし続けることになるから。
0670デフォルトの名無しさん
2007/09/10(月) 23:19:580671デフォルトの名無しさん
2007/09/10(月) 23:30:07殺人を遊びという理由は身勝手。なんで殺人をしてしまったのか?
という理由が述べられていない。ただの愉快犯なら情状酌量の余地なし。
すぐさま死刑で良いでしょうw
0672デフォルトの名無しさん
2007/09/10(月) 23:31:01要するにお前は理由もなくC言語をやっていたんだ。まぁあれだろ
通っていた学校でやらされた程度で、実は面白くないと?w
0673デフォルトの名無しさん
2007/09/10(月) 23:31:47深読みしてみると質問の趣旨は、なぜ数あるプログラミング言語の中から
Cを選んだのか?ってことなんかな。つか複数使える人のほうが多いと思うがね。
0674デフォルトの名無しさん
2007/09/10(月) 23:34:14単位取得に必要だったからやった
今も後悔はしていない
0675デフォルトの名無しさん
2007/09/10(月) 23:36:050676デフォルトの名無しさん
2007/09/10(月) 23:38:040677デフォルトの名無しさん
2007/09/10(月) 23:39:48環境書かないと分からんだろが!
サンプルソースが欲しいのか
コンパイラが欲しいのか
何が欲しいのかもよく分からん
フリー
コンパイラ
http://www.google.co.jp/
0678デフォルトの名無しさん
2007/09/10(月) 23:42:10>>665
0679デフォルトの名無しさん
2007/09/10(月) 23:43:09きっかけは、情報処理技術者試験のためデス。
学校でFORTRAN習ったけど、当時自宅のMS-DOS環境で開発環境を入手できたのがCだった。
0680デフォルトの名無しさん
2007/09/10(月) 23:52:47最初は高校でやったMS-BASIC(だったか?)によってプログラミングが楽しくなり
学校においてあった8ビットCPUのポケコンをさわり、欲しくなったので先生に頼んで取り寄せ、16ビットCPUのポケコンを購入
インタプリタで動作するCが組み込まれていてBASICより面白いと思う
大学で自分のPCを買えるようになってコンパイラ方式のCをはじめる
0681デフォルトの名無しさん
2007/09/10(月) 23:59:48遊びこそ主観だろ、答えたくないバカは黙ってろよ。歩インポイントでお前を
名指しして質問されているわけじゃないだろ?w お前みたいな基地外にはむしろ聞いてないって。
それから、何が主観かなんてどうでも良いんだよ。理由がいえないなら黙ってろ
0682デフォルトの名無しさん
2007/09/11(火) 00:00:22歩インポイント > お前にピンポイント
0683デフォルトの名無しさん
2007/09/11(火) 00:05:490684デフォルトの名無しさん
2007/09/11(火) 00:08:23全員が全員、遊びでC言語をやっているわけじゃないと思うんだが?
勝手にC言語=遊びみたいなことを言うなよw
お前の場合は遊びに理由がって関係ない話をしているだけ。
お前にとっては遊びで始めたというのが理由であって、C言語は遊びじゃないぞ。
0685デフォルトの名無しさん
2007/09/11(火) 00:23:04どこかに書いておけばいい
0686デフォルトの名無しさん
2007/09/11(火) 00:26:060687デフォルトの名無しさん
2007/09/11(火) 00:26:39のとき、
aはポインタのアドレス
*aはポインタに格納された値
なんですよね?
じゃあ
&aだと何を表すんですか?
0688デフォルトの名無しさん
2007/09/11(火) 00:27:33いいえ
0689デフォルトの名無しさん
2007/09/11(火) 00:28:220690デフォルトの名無しさん
2007/09/11(火) 00:34:50また、&aはaという変数へのポインタ
0691デフォルトの名無しさん
2007/09/11(火) 00:34:520692デフォルトの名無しさん
2007/09/11(火) 01:01:04*aはポインタが指し示すオブジェクト。とでもいった方がよいかな。
値といっても=の左辺になれる事を理解すること。
0693デフォルトの名無しさん
2007/09/11(火) 01:20:04*aはポインタが指し示すオブジェクト。
&aで、int型のポインタ変数aのアドレスを参照できる。
int a = 10;
int *p;
p = &a;
printf("aのアドレスは%p\n", p);
printf("aのアドレスは%p\n", &a);
printf("aの値は%d\n", *p);
printf("aのポインタのアドレスは%p\n", &p);
これであってますか?
0694デフォルトの名無しさん
2007/09/11(火) 01:25:530695デフォルトの名無しさん
2007/09/11(火) 01:27:08*p = 20;
などの操作をして、aの値を確認してみるのも良い。
0697687
2007/09/11(火) 01:39:59ありが�d
0698デフォルトの名無しさん
2007/09/11(火) 02:53:25定義は#include <string,h>って書いてるんですけど他に何か設定しないとダメですか?
0699デフォルトの名無しさん
2007/09/11(火) 02:56:200700デフォルトの名無しさん
2007/09/11(火) 02:57:25○string.h
というオチじゃないだろうな?
0701698
2007/09/11(火) 03:02:51メモに貼り付けてフォント変えたら違いが判った
ありがとう!
0702デフォルトの名無しさん
2007/09/11(火) 06:39:00> 16ビットCPUのポケコンを購入
> インタプリタで動作するCが組み込まれていて
メーカー教えて
0703デフォルトの名無しさん
2007/09/11(火) 06:51:08char *str[]={”山田”、”井之上”、”御手洗”、”鈴木”};
とした場合
配列は
char
str[0][0]="山", str[0][1]="田", str[0][2]="\0", str[0][3]="\0"
str[1][0]="井", str[1][1]="之", str[1][2]="上", str[1][3]="\0"
str[2][0]="御", str[2][1]="手", str[2][2]="洗", str[2][3]="\0"
str[3][0]="鈴", str[3][1]="木", str[3][2]="\0", str[3][3]="\0"
str[4][0]="\0", str[4][1]="\0", str[4][2]="\0", str[3][3]="\0"
と自動で入って各行の配列の先頭のアドレスが*str[1]や*str[2]に入ってるんでしょうか
0704デフォルトの名無しさん
2007/09/11(火) 06:59:570705デフォルトの名無しさん
2007/09/11(火) 07:04:34> char *str[]={”山田”、”井之上”、”御手洗”、”鈴木”};
これはどういう状態でしょう?
0706デフォルトの名無しさん
2007/09/11(火) 07:06:510707デフォルトの名無しさん
2007/09/11(火) 07:10:23ちょっとそのまま書いてみて試してみます
0708デフォルトの名無しさん
2007/09/11(火) 07:12:470709デフォルトの名無しさん
2007/09/11(火) 07:19:55文法ってそっちでしたかorz
これでよろしいですか?
0710デフォルトの名無しさん
2007/09/11(火) 07:55:59山田、井之上、御手洗、鈴木はそれぞれメモリのどこかに書き込んで
*str[0]〜[3]にはメモリのそれぞれの文字列の先頭アドレスが入ってるってことかな
0711デフォルトの名無しさん
2007/09/11(火) 08:18:26str[0]〜[3]にはメモリのそれぞれの文字列の先頭アドレスが入ってるってこと
だと思うよ
0712デフォルトの名無しさん
2007/09/11(火) 08:26:49まだ微妙に疑問点あるけどひとまず寝ます
頭が動いてないorz
ありがとう
0713デフォルトの名無しさん
2007/09/11(火) 13:47:311から100の自然数を”1”から”100”という文字列に変換せよ
って問題ですけど、どんなプログラムになりますか?
0714デフォルトの名無しさん
2007/09/11(火) 13:53:240715デフォルトの名無しさん
2007/09/11(火) 14:16:56{
int i,j = 0;
char *cp[100]={'\0'};
for(i = 0; i < 100; i++)
cp[i] = ( char *)malloc(sizeof(char)*4);
for(j = 0,i = 1; i <= 100; i++,j++)
sprintf(cp[j],"%d",i);
return cp;
}
0716デフォルトの名無しさん
2007/09/11(火) 14:46:080717デフォルトの名無しさん
2007/09/11(火) 14:52:54変数の寿命を…
0718デフォルトの名無しさん
2007/09/11(火) 15:50:26さっきは適当に書いて張りました
以下ソース
char** func(char **cp, size_t n)
{
int i,j = 0;
for(i = 0; i < n; i++)
cp[i] = ( char *)malloc(sizeof(char)*4);
for(j = 0,i = 1; i <= 100; i++,j++)
sprintf(cp[j],"%d ",i);
return cp;
}
0719デフォルトの名無しさん
2007/09/11(火) 15:57:14sprintf(cp[i],"%d ",i+1);
これでいいじゃん
0720デフォルトの名無しさん
2007/09/11(火) 16:08:13nが配列のサイズならループの最大値100にすんな
引数で渡してる奴を戻り値にすんな
0721デフォルトの名無しさん
2007/09/11(火) 16:28:09でも質問者は完全版を求めてるの?
0723デフォルトの名無しさん
2007/09/11(火) 16:39:010724デフォルトの名無しさん
2007/09/11(火) 17:10:170725デフォルトの名無しさん
2007/09/11(火) 17:57:45また難儀な・・・
押入れから引っ張り出してきたよ
あ〜なつかしぃい
CASIO PERSONAL COMPUTER FX-890P 16-bit CPU
(液晶の枠部分に書かれている文字)
しかもこれ専用(?)のフロッピーディスクドライブ&そして(確か)増設メモリまで買ってしまったはず
起動したらまだ動く(リチウム電池は空)
(スレチスマソ)
0726デフォルトの名無しさん
2007/09/11(火) 18:09:21姉妹品?のZ-1ならもってた
捨てちゃったけど
0727デフォルトの名無しさん
2007/09/11(火) 18:17:14これかな?
ttp://www5.plala.or.jp/igjhmc/calc/z-1.html
っていうかキー配列とか同じだ
FX-890Pの文字がZ-1になってるぐらい
0728デフォルトの名無しさん
2007/09/11(火) 19:04:06list1-1.cのように「-」を使ってもいいのでしょうか?
0729デフォルトの名無しさん
2007/09/11(火) 19:06:400730デフォルトの名無しさん
2007/09/11(火) 19:59:08C++のほうがお勧めかな。
理由
C++を勉強すると、Cも勉強できる。
C++を知っているとJavaとかも簡単に理解できる。
0731デフォルトの名無しさん
2007/09/11(火) 20:39:290732デフォルトの名無しさん
2007/09/11(火) 20:44:32皆さんどっち使ってます?
0733デフォルトの名無しさん
2007/09/11(火) 20:48:28用途による
0734デフォルトの名無しさん
2007/09/11(火) 20:50:23使っているのは断然 printf だよ
printf を使うことで処理速度に問題が出るようなコードは書いてないから
0735デフォルトの名無しさん
2007/09/11(火) 20:58:220736デフォルトの名無しさん
2007/09/11(火) 22:44:5943 23
<apple>
100E+02 102E-8 102E-12
<leon>
23E+01 12E-02
<kon>
24 23.3
とかいうファイルからE表記の数値だけを抜き取るにはどうすればいいですかね?
0737736
2007/09/11(火) 22:45:4743 23
<apple>
100E+02 102E-8 102E-12
<leon>
23E+01 12E-02
<kon>
24 23.3
とかかれたファイルからですね。ファイル名はlist.txtとしておきます。
0738デフォルトの名無しさん
2007/09/11(火) 22:52:38// 使用法 a.exe < list.txt
#include<stdio.h>
#include<string.h>
int main(void)
{
char buf[100];
double value;
int pos;
while(scanf("%s", buf)==1)
{
if(strchr(buf, 'E')!=NULL)
if(sscanf(buf, "%le%n", &value, &pos)>=1)
if(buf[pos]=='\0')
printf("%e\n", value);;
}
return 0;
}
0739736
2007/09/11(火) 23:13:380740736
2007/09/11(火) 23:14:440741デフォルトの名無しさん
2007/09/11(火) 23:16:580742デフォルトの名無しさん
2007/09/12(水) 02:40:36#include <stdio.h>
#include <string.h>
int rev (char *);
int main()
{
char str[100];
printf("文字を入力してください\n");
gets_s(str);
rev(str);
printf("逆にしたのはこれです\n");
printf(str);
return 0;
}
int rev (char *str)
{
int i=0;
char str2[100];
size_t len;
len=strlen(str);
while(len>=0){
str2[i]=str[len];
i++;
len--;
}
str=str2;
return 0;
}
0743デフォルトの名無しさん
2007/09/12(水) 02:41:110744デフォルトの名無しさん
2007/09/12(水) 02:49:36>str=str2;
とりあえずこれはまずい
「C言語 スコープ」とかでぐぐれ
0745デフォルトの名無しさん
2007/09/12(水) 02:50:27ちょっと調べてみます
0746問題
2007/09/12(水) 03:04:16char moji[] ="ABCDEF〜XYZ"; /*最大文字26文字*/
char *pc;
pc=moji;
結果
moji:ABCDEF〜XYZ
開始位置==>B
終了位置==>F
表示:BCDEF
moji:ABCEF〜XYZ
開始位置==>D
終了位置==>D
表示:D
moji:ABCDEF〜XYZ
開始位置==>E
終了位置==>B
表示:EF〜XYZAB
0747746の続き
2007/09/12(水) 03:05:46#include <stdlib.h>
#include <string.h>
void print(char* s, char* e)
{
printf("表示:");
for( ; s <= e ; s++ ) putchar(*s);
puts("");
}
int main(void)
{
char moji[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *pc = moji, *pcstart, *pcend, start, end;
while(1) {
printf("moji:%s\n開始位置==>", moji); scanf("%c", &start);
printf("終了位置==>"); scanf("%c", &end);
pcstart = strchr(moji, start);
pcend = strchr(moji, end);
if( pcstart == NULL || pcend == NULL ) break;
if( pcstart <= pcend ) print(pcstart, pcend);
else print(pcend, pcstart);
}
}
この問題でどうしてもエラーが出るんですが何方かわかる方がいましたら教えてください
0748デフォルトの名無しさん
2007/09/12(水) 03:14:23void rev(char *str)
{
int len = strlen(str);
int i;
char temp;
for(i = 0; i<len/2; i++)
{
temp = ary[i];
ary[i] = ary[len -i-1];
ary[len -i-1] = temp;
}
}
0750デフォルトの名無しさん
2007/09/12(水) 03:21:16エラーってどんなエラー?
scanf("%c"〜の挙動を理解してないとかそんなオチ?
0752742
2007/09/12(水) 03:27:42○ary[i]
でしたね
0753746の者です
2007/09/12(水) 03:29:31警告 W8012 07.cpp 8: 符号付き値と符号なし値の比較(関数 MojiSearch(char *,char *) )
警告 W8004 07.cpp 5: 'j' に代入した値は使われていない(関数 MojiSearch(char *,char *) )
↑がエラー内容です
6ヶ月ぶりにCに触れたんですが仕組みを忘れちゃってどう直せばいいのかわからなくなってしまったんですよ^^;
0754デフォルトの名無しさん
2007/09/12(水) 03:31:52>>747にMojiSearchなんて関数ないだろ
0755デフォルトの名無しさん
2007/09/12(水) 03:32:34scanf実行後stdinには'\n'が残っていて
後のscanfが'\n'をとりこんでしまってる。
一応getc(stdin)で取り繕って変更したソース
の一部を載っける
int temp;
while(1) {
printf("moji:%s\n開始位置==>", moji);
scanf("%c", &start);
temp =getc(stdin);
printf("終了位置==>");
scanf("%c", &end);
temp =getc(stdin);
0756デフォルトの名無しさん
2007/09/12(水) 03:40:33それはエラーじゃなくて警告って言うんだよ
0757デフォルトの名無しさん
2007/09/12(水) 04:30:43signedとunsigned比較してんだろ
3つ目の警告は見たまんま
0758742
2007/09/12(水) 05:06:22#include <stdio.h>
#include <string.h>
void rev (char *);
int main()
{
char str[100];
printf("文字を入力してください\n");
gets_s(str);
rev(str);
printf("逆にしたのはこれです\n");
printf(str);
return 0;
}
void rev (char *str)
{
int i=0,len=strlen(str);
char str2;
printf("文字の長さは%dです\n",len);
for(i=0;i<len/2;i++){
str2=str[i];
str[i]=str[len-i-1];
str[len-i-1]=str2;
}
}
ary[i]がまだ謎だけど出来たよ、ありがとう
0759746
2007/09/12(水) 10:35:45レス欄にコピペしたとき、「ああ、strか」と思い
aryの部分をstrに全部書き換えたつもりだったが
中途半端に書き換えちった
というわけ
0760デフォルトの名無しさん
2007/09/12(水) 10:48:010761742
2007/09/12(水) 15:41:36なるほど
あえて自分で考える事が出来たし結果オーライだったw
lenの-1も気づかなかったしなorz
スコープについてはまだ良くわかってないけど・・・
0762デフォルトの名無しさん
2007/09/12(水) 22:46:17str2へのポインタを関数の外で使おうとしてるのかと思った
0763デフォルトの名無しさん
2007/09/12(水) 22:55:141.関数で配列全体を呼び出しもとに帰すにはどう記述すればよいのでしょうか?
例)a[0],a[1],a[2],a[3]といった、算出した値を配列要素としてではなく、配列全体をreturn文で返す
方法がわからずにおります。
2. 1+X+X^15で生成する疑似ランダムデータの作製法がわからずにおります。
どうかご教示願います。
0764デフォルトの名無しさん
2007/09/12(水) 22:58:17マルチポストですか?
ttp://pc11.2ch.net/test/read.cgi/tech/1188748806/278
0765デフォルトの名無しさん
2007/09/12(水) 23:03:43ポインタとかを理解するにはPICを勉強したほうが分かりやすいですか?
0766デフォルトの名無しさん
2007/09/12(水) 23:05:53急いでいるのでマルチポストをしてしまいました。申し訳ございません。
0767デフォルトの名無しさん
2007/09/12(水) 23:07:33問題をやった方が良い
0768デフォルトの名無しさん
2007/09/12(水) 23:31:22大体、関連した話題を扱うスレッドには同じ人が見にきているものだ。
だからマルチポストするとすぐに見つかってしまう。しかも反感を買い回答が得られなくなる。
だから1箇所に投稿し、回答が得られるまで自分でも必死こいて調べるべし。
0769デフォルトの名無しさん
2007/09/12(水) 23:33:34問題をやるのがいいな。
0770デフォルトの名無しさん
2007/09/12(水) 23:56:35ありがとうございます。問題を解くことからはじめます。
0771デフォルトの名無しさん
2007/09/13(木) 02:41:58宿題スレの問題をやってみるとか。
いろんな人が同じ問題を問いて解答も出してくれるので、
自分とここが違う、とか、これはこうやって実現するのか、とか、
いろいろ気づくところがあるかも知れないよ。
0772デフォルトの名無しさん
2007/09/13(木) 02:42:280773デフォルトの名無しさん
2007/09/13(木) 02:49:26システムコールのwriteを使ってみたつもりです。
#include <unistd.h>
int main(void) {
char s[] = "test\n";
write(1, s, sizeof(s));
return 0;
}
Cygwin の gcc 3.3.3 で、-ansi -Wall -pedantic -fno-builtin で
コンパイルできて、期待した動作になりました。
で、glibc-2.6.1の io/write.c を見ると
/*
続く
0774デフォルトの名無しさん
2007/09/13(木) 02:54:40*/
#include <sysdep.h>
#include <errno.h>
#include <unistd.h>
#include <stddef.h>
ssize_t __libc_write (int fd, const void *buf, size_t nbytes)
{
if (nbytes == 0) return 0;
if (fd < 0) {__set_errno (EBADF); return -1;}
if (buf == NULL) {__set_errno (EINVAL); return -1;}
__set_errno (ENOSYS); return -1;
}
libc_hidden_def (__libc_write)
stub_warning (write)
weak_alias (__libc_write, __write)
libc_hidden_weak (__write)
weak_alias (__libc_write, write)
#include <stub-tag.h>
write.c にはこれだけしかないのですが、
fd の値や *buf 内のデータなどは、どこで使われているんでしょうか?
たとえば buf は NULL とだけ比較していますが、
実際に fd に向かって buf を書き込む(?)処理は、どこでやっているんですか?
0775デフォルトの名無しさん
2007/09/13(木) 11:37:00http://www.sixnine.net/cygwin/translation/faq/faq_3.html#SEC88
>Cygwin は glibc を提供しません。
>代わりに、同じ機能の大部分(全てではありません)を提供する newlib を使用します。
>glibc を Cygwin へ移植するのは難しいでしょう。
0776問題
2007/09/13(木) 11:59:26キーボードより表示開始文字と表示終了文字を入力し、開始〜終了までの文字を表示しなさい
char moji[]="ABCDEF〜XYZ"; /*大文字26文字*/
実行画面
moji:ABCDEF〜XYZ
開始位置==>B
終了位置==>F
表示:BCDEF
moji:ABCDEF〜XYZ
開始位置==>D
終了位置==>D
表示:D
moji:ABCDEF〜XYZ
開始位置==>E
終了位置==>B
表示:EF〜XYZAB
0777776の答え
2007/09/13(木) 12:00:14開始位置==>B
終了位置==>F
表示:BCDEF
0778776の答え(777ミスです)
2007/09/13(木) 12:01:06#include <ctype.h>
int main(void)
{
char moji[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /*大文字26文字*/
char start, end, *p;
printf("moji:%s\n", moji);
printf("開始位置==>");
scanf("%c", &start);
fflush(stdin);
printf("終了位置==>");
scanf("%c", &end);
fflush(stdin);
if(!isalpha((int)start) || !isalpha(end)) return 1;
start = (char)toupper(start);
end = (char)toupper(end);
p = moji + start - 'A';
for(;;)
{
putchar(*p);
if(*p == end) break;
if(*(++p) == '\0') p = moji;
}
return 0;
}
0779問題2
2007/09/13(木) 12:04:11実行画面
文字列入力(m1)==>ABCDEFAABCDABC
削除文字==>A
結果文字列(m2):BCDEFBCDBC
0780問題2の答え
2007/09/13(木) 12:05:38#include <string.h>
#define MAX 256
int main(void)
{
char str[MAX],ch;
size_t sz_str,i;
printf("文字配列入力(m1)==>");
fgets(str,sizeof(str)/sizeof(str[0]),stdin);
sz_str=strlen(str);
printf("排除文字==>");
ch=getchar();
for(i=0; i<sz_str; i++) {
if(str[i]!=ch) putchar(str[i]);
}
return 0;
}
0781デフォルトの名無しさん
2007/09/13(木) 12:25:210782デフォルトの名無しさん
2007/09/13(木) 12:34:12バッファサイズを256とか512みたいな16の倍数にしてるコードよく見るけど
そうするとどういう効果があるの?
0783デフォルトの名無しさん
2007/09/13(木) 12:34:490784デフォルトの名無しさん
2007/09/13(木) 13:12:500785デフォルトの名無しさん
2007/09/13(木) 13:17:362の乗数っていうか、2の羃だね。
0786デフォルトの名無しさん
2007/09/13(木) 13:23:03漏れもなんとなくキリがいいから使ってたよw
サソクス
0787デフォルトの名無しさん
2007/09/13(木) 13:33:440788デフォルトの名無しさん
2007/09/13(木) 13:46:380789デフォルトの名無しさん
2007/09/13(木) 13:55:42コマンドインタプリタで該当プログラムの終了ステータスとして利用する。
0790デフォルトの名無しさん
2007/09/13(木) 15:03:30他のプログラムから起動させたとき
0791デフォルトの名無しさん
2007/09/13(木) 16:22:48#!/bin/sh
if ./a.out; then
echo "成功" # main が 0 を返した時
else
echo "失敗..." # main が 1 を返した時
fi
0792デフォルトの名無しさん
2007/09/13(木) 20:54:10を実行すると
123.5
となるのはなぜですか?
123.4になぜなりませんか?
0793デフォルトの名無しさん
2007/09/13(木) 20:57:120794デフォルトの名無しさん
2007/09/13(木) 21:01:27thx
0795デフォルトの名無しさん
2007/09/14(金) 01:02:02ありがとうございます。newlibですか。
ではCygwinはおいといて、>>774はglibcの実装についての質問とさせてください。
glibcのwrite.cで定義されている __libc_write の仮引数の使われ方について
なぜこの引数でfdへ書き込みがおこなわれるのでしょうか?
0796デフォルトの名無しさん
2007/09/14(金) 02:17:33システムコールをどうやって呼ぶかはOSやCPUによって異なるから、それはただのプレースホルダだろう。
ざっとみてみたところ、sysdeps/unix/syscalls.listからmake-syscalls.shで自動生成されるんじゃないかと思った。
でも複雑すぎて追いきれん。
実際に特定のターゲット向けにビルドしてみて、生成されたファイルを見なきゃ判らなさそう。
0797デフォルトの名無しさん
2007/09/14(金) 02:41:12その関数はターゲット用のwrite()が存在しない場合に使われるダミー関数。
writeしても呼ばれない。
0798デフォルトの名無しさん
2007/09/14(金) 08:46:05-1.515 -1.667 -0.151 0.230 -0.024 0.083 0.377 0.665 0.722 -0.195
-2.321 -1.814 -0.133 0.515 1.343 0.000
1: -19.304 -0.162 -1.799 4.184 1.255 -0.393 -0.335 0.469 1.268 -2.177
-2.390 0.198 -0.151 -0.086 0.111 0.100 0.038 1.462 0.937 -0.569
-0.975 -1.590 -0.486 -0.450 0.133 0.000
2: -18.166 -0.254 -0.178 1.909 2.438 6.705 5.126 -4.463 -0.205 2.752
1.499 4.116 -0.151 0.167 -0.024 -0.312 -0.069 1.179 0.724 -0.214
0.460 -0.921 0.742 0.284 -0.377 0.000
こうかかれたファイルから小数点のところだけ
とりだして二次元配列にいれるにはどうすればいいすかね?
小数点のところ26個あるんですけど。
0799デフォルトの名無しさん
2007/09/14(金) 09:33:400800デフォルトの名無しさん
2007/09/14(金) 11:16:37_dos_findfirstを使用して、BCCでコンパイルしたら
> Warning W8053 2007-09-14_1.c 11: '_dos_findfirst(const signed char *,unsigned int,find_t *)'
> is obsolete in function main
という警告が出ました。obsoleteとは「旧式の、廃れた」という意味です。
これに代わるものはありますか?
0801デフォルトの名無しさん
2007/09/14(金) 11:26:11dos.hの_dos_findfirst()か、_dos_xxxは古いわなあ。
io.hの_findfirst()でどうか。
0802デフォルトの名無しさん
2007/09/14(金) 11:32:30なるほど、ありがとうございました。
0803デフォルトの名無しさん
2007/09/14(金) 14:01:30C言語の入門書にそって勉強していたのですがすぐに躓いてしまいました。
hello worldを表示するソースファイルをコンパイルしようとしたのですが下のエラーが出てきてしまいました。
C:\cwork>bcc32 sample.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample.c:
エラー E2209 sample.c 2: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 sample.c 6: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
*** 1 errors in Compile ***
何かと思い検索してみて確認したのですが原因がわかりません。
なにか分かる方いらっしゃればアドバイスよろしくお願いします。
0804デフォルトの名無しさん
2007/09/14(金) 14:18:24C:\borland\bcc55\Include\ の中にファイルはあるか?
インストールはどのファイルをどうやって実行した?
0805デフォルトの名無しさん
2007/09/14(金) 14:24:35http://www.google.co.jp/search?q=bcc32.cfg
0806デフォルトの名無しさん
2007/09/14(金) 14:27:54PATHを通してないんでしょうな、多分。
0807デフォルトの名無しさん
2007/09/14(金) 14:41:490808デフォルトの名無しさん
2007/09/14(金) 14:55:56cfgもデフォルトだろうし、アップデート用のインストーラ使ったんじゃないかと予想。
0809デフォルトの名無しさん
2007/09/14(金) 15:13:25>>804様
C:\borland\bcc55\Includeの中にstdio.hはありました。
インストールはその入門書についてあるCDに収録されていた
freecommandlinetools2.exeというファイルを実行しました。
>>807様
Pathは通したつもりでいます。
入門書に書かれてあることをそのまま行っただけなので間違いないとは言い切れませんが。
0810デフォルトの名無しさん
2007/09/14(金) 15:20:23bcc32.cfg、ilink32.cfg はあるか?
テキストエディタで開いて、以下に設定されているか確認。無ければ以下のをそれぞれ保存
・bcc32.cfg
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"
・ilink32.cfg
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"
0811デフォルトの名無しさん
2007/09/14(金) 15:22:480812803
2007/09/14(金) 15:36:19bcc32.cfg、ilink32.cfg はC:\borland\bcc55\Binにあります。
bcc32.cfg、ilink32.cfg ともに;c:\Borland\Bcc55\lib\PSDK"の部分はありませんでした。
そこで;c:\Borland\Bcc55\lib\PSDK" を追加してみましたがやはりエラーでした。
0813デフォルトの名無しさん
2007/09/14(金) 15:36:28知ったかぶるなら黙ってろ。お前らの頭じゃPATHの意味すらわかってなさそうだから。
0814デフォルトの名無しさん
2007/09/14(金) 15:39:02面倒くさいんでこれ使っちゃいな
ttp://www.vector.co.jp/soft/dl/win95/prog/se141451.html
0815デフォルトの名無しさん
2007/09/14(金) 15:41:25どうしても嫌ならこれで
ttp://www.enri.go.jp/~fks442/K_MUSEN/bcc.htm
0816デフォルトの名無しさん
2007/09/14(金) 15:43:39カレントディレクトリをコンパイラのある場所に移動すりゃ良いんじゃね?
エラーメッセージから推測できるのは、必要なファイルのある場所の
設定がされていないということ。つまり、そういうことだ。
PATHが必要なものに設定されていればどうなるか、分かるよね?
0817デフォルトの名無しさん
2007/09/14(金) 15:43:57おまえ、名指しで何か言うなら知ったかしないほうがいいぞ
PATHの意味を言ってみ?
0818デフォルトの名無しさん
2007/09/14(金) 15:44:54>C:\cwork>bcc32 sample.c
>Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
この2つからPATHが通っているのは明白
0819デフォルトの名無しさん
2007/09/14(金) 15:46:34味方にボールを送る事に決まってんだろうが
0820デフォルトの名無しさん
2007/09/14(金) 15:53:560821デフォルトの名無しさん
2007/09/14(金) 15:56:07アホか
ヤマハの電動アシスト自転車の事だろ
0822803
2007/09/14(金) 15:57:16ありがとうございます。
試してみようと思います。
>>816様
ソースファイルを作成したc:\cworkというディレクトリに移動しているのですが、こういうことでしょうか?
0823803
2007/09/14(金) 16:10:52皆様お忙しいところくだらない質問に時間を割いていただき本当にありがとうございました。
0824デフォルトの名無しさん
2007/09/14(金) 16:13:020825デフォルトの名無しさん
2007/09/14(金) 16:19:23がんばって
0826デフォルトの名無しさん
2007/09/14(金) 16:21:010827デフォルトの名無しさん
2007/09/14(金) 16:36:510828デフォルトの名無しさん
2007/09/14(金) 16:41:00つーか知っててもスルーしてるが
0829デフォルトの名無しさん
2007/09/14(金) 18:49:3411111111 11111111 11111111 1000000になるのかわかりません
特に、80は 0101000では?
0830デフォルトの名無しさん
2007/09/14(金) 18:51:39(0101)2 → (5)10
0831デフォルトの名無しさん
2007/09/14(金) 18:56:10???
間違っているのですか?
0832デフォルトの名無しさん
2007/09/14(金) 18:56:412進だと1000000
10進の80と誤解してると思われ
0833デフォルトの名無しさん
2007/09/14(金) 18:59:020834デフォルトの名無しさん
2007/09/14(金) 19:02:19ん〜どうしてもわかりません
では、2進数の80では、0101000で合っていて
16進数の80では、どうして1000000になるのでしょうか?
0835デフォルトの名無しさん
2007/09/14(金) 19:10:410836デフォルトの名無しさん
2007/09/14(金) 19:12:30(80)10 = (0101000)2
(80)16 = (128)10 = (10000000)2
0837デフォルトの名無しさん
2007/09/14(金) 19:13:0116進数の50 = 10進数の80 = 2進数の10100000
0838デフォルトの名無しさん
2007/09/14(金) 19:16:47計算違くね
(80)10 = (0101 0000)2
0839837
2007/09/14(金) 19:18:050840829
2007/09/14(金) 19:23:39>>16進数の80 = 10進数の128 = 2進数の10000000
16進数の50 = 10進数の80 = 2進数の10100000
では、一旦10進数に置き換えてから、2進ぬするのでしょうか?
どうやれば、16進数の80は10進数の128に、又は16進数の50は10進数の80に
直せるのでしょうか?
0841デフォルトの名無しさん
2007/09/14(金) 19:31:21ググれば解説しているサイトはたくさんある
0842デフォルトの名無しさん
2007/09/14(金) 19:32:1216進から2進の場合、は分割するんよ
FFFFFF80
F=1111 , 8 = 1000 , 0=0
あとはくっつける
1111 1111 1111 1111 1111 1111 1000 0000
FFFFFF80(16)=11111111111111111111111110000000(2)
って感じ
0843デフォルトの名無しさん
2007/09/14(金) 19:34:44失礼、ちょっと訂正
FFFFFF80
F(16)=1111(2) , 8(16)=1000(2) , 0(16)=0000(2) ね
10進に直すより16進→2進 、2進→16進の方が楽(のはず)
0844デフォルトの名無しさん
2007/09/14(金) 19:42:230845デフォルトの名無しさん
2007/09/14(金) 19:44:210846デフォルトの名無しさん
2007/09/14(金) 19:46:330847デフォルトの名無しさん
2007/09/14(金) 20:11:41これで先に進めます
0848デフォルトの名無しさん
2007/09/14(金) 20:49:0816って2^4(二の四乗)の事ですよね。
つまり、2進数表現4ビットの最大値(1111)
が、16進数Fに相当している事もわかりますよね。
したがって、>>840の解説を御借りすると、
FFFFFF80
F=1111 , 8 = 1000 , 0=0
【|】(パイプ)で区切ると
1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1000 | 0000 (2)
F F F F F F 8 0 (10)
となります。
0849デフォルトの名無しさん
2007/09/14(金) 20:50:170850デフォルトの名無しさん
2007/09/14(金) 22:59:14それとも、閉じるときに勝手にやってくれるんでしょうか。
0851デフォルトの名無しさん
2007/09/14(金) 23:03:47閉じるときに勝手にやってくれる。
つか、EOFというデータはないんだけど。
ファイルの最後まで読んだときfreadなどのファイル入出力関数がEOFを返すだけ。
0852デフォルトの名無しさん
2007/09/14(金) 23:24:22てっきり、改行コードみたいにEOFっていう記号があるのかと思いました。。。
0853デフォルトの名無しさん
2007/09/14(金) 23:37:450854デフォルトの名無しさん
2007/09/14(金) 23:59:28超ありがとうございます。
勉強します。
0855デフォルトの名無しさん
2007/09/15(土) 00:25:48EOF=1A じゃなかったかな。昔のテキストファイルには使っていたと聞くよ。
0856852
2007/09/15(土) 00:40:18MS-DOSのテキストファイルにはEOF(1Ah)が書かれていたようですね。
EOF(1Ah)がファイル内に実際にデータとして書かれているものと書かれていないもの
さらに、書かれているもののうちアプリケーションがこのEOF(1Ah)をデータとして
意識すべきものと意識しなくてよいもの
があるようですね。
ファイルのデータをレングスで管理しているファイルシステムはEOFがなくて、
このレングスがないファイルシステムにはEOFがデータとしてある。
ということでしょうか。
0857852
2007/09/15(土) 00:45:30EOFをアプリケーションで書き出す必要があるかないかは、
「ファイルの仕様による」ということです。
Windowsのハードディスクのファイルは書き出す必要はありません。
0858デフォルトの名無しさん
2007/09/15(土) 00:51:53ありがとうございます〜 むっちゃわかりやすかったっす。
0859デフォルトの名無しさん
2007/09/15(土) 01:47:180860デフォルトの名無しさん
2007/09/15(土) 02:08:55お前とかうぜーよ、偉そうに。英語すら理解していないだろ。
ttp://dictionary.goo.ne.jp/search.php?MT=path&kind=ej&mode=0&base=1&row=0
必要なデータやプログラムのある場所へPATHを通しておくことで
どこのディレクトリからでも扱えるようにできるようになることくらい知っているだろ。
っつかお前、DOSとかその他そういった仕組みを持ったシステムを使ったことないだろ?
0861デフォルトの名無しさん
2007/09/15(土) 02:12:21>Windowsのハードディスクのファイルは書き出す必要はありません。
判っていないのならレスしなくてもよろしいのでは?
0862デフォルトの名無しさん
2007/09/15(土) 02:13:29仲のいいことで。
0863デフォルトの名無しさん
2007/09/15(土) 02:17:01そういうレスはいけないと思うよ。
間違っているを指摘すべきだと思う。
0864デフォルトの名無しさん
2007/09/15(土) 02:41:12ということですがBCCではコンパイルが通り、実行しても問題は見られませんでした
char *strではなくchar str[32]なら可とのこと
なぜでしょうか?
もうひとつ
下記のプログラムでprintf("%sの長さは%dです\n",*str,len);
のように%sに対して*strとすると実行時にエラーになりますが
*strなら中身のASCIIコードが入っているはずで問題ないと思うのですが…
ご教示願います。
#include <stdio.h>
#include <string.h>
int main()
{
char *str;
size_t len;
printf("文字列を入力してください。--");
scanf("%s", str);
len = strlen(str);
printf("%sの長さは%dです\n",str,len);
return 0;
}
0865デフォルトの名無しさん
2007/09/15(土) 02:41:52%s→%c
0866デフォルトの名無しさん
2007/09/15(土) 02:43:370867デフォルトの名無しさん
2007/09/15(土) 02:48:22> 猫でもわかるC言語プログラミングP.196によると下記のようなプログラムはだめ
> ということですがBCCではコンパイルが通り、実行しても問題は見られませんでした
> char *strではなくchar str[32]なら可とのこと
問題が無かったのは str の指す先が*偶然*致命的な場所で無かっただけで
予期しない場所が書き換えられています
str が指す先がちゃんと確保されている場合には問題は無いです
0868デフォルトの名無しさん
2007/09/15(土) 03:05:22その本には、なぜダメかってのは書いてないのか。
0869デフォルトの名無しさん
2007/09/15(土) 04:39:200870デフォルトの名無しさん
2007/09/15(土) 04:41:45http://ja.wikipedia.org/wiki/Printf
0871デフォルトの名無しさん
2007/09/15(土) 04:48:43scanf - scan with format
printf - print with format
0872デフォルトの名無しさん
2007/09/15(土) 14:13:040873デフォルトの名無しさん
2007/09/16(日) 00:32:08バカすぎますか?
0874デフォルトの名無しさん
2007/09/16(日) 00:34:360875デフォルトの名無しさん
2007/09/16(日) 00:34:400876デフォルトの名無しさん
2007/09/16(日) 00:38:15実装が楽なので使い捨てコードのときにはそうします
0877デフォルトの名無しさん
2007/09/16(日) 00:42:30一個ごとでも、まったくOK。
データの複数個ずつぶんのメモリを確保しても、ほとんどの場合は、
スピードアップしません。
0878デフォルトの名無しさん
2007/09/16(日) 00:48:010879デフォルトの名無しさん
2007/09/16(日) 01:24:37ここは C のスレですぜ
> vector
ってなに?
0880デフォルトの名無しさん
2007/09/16(日) 01:34:480881デフォルトの名無しさん
2007/09/16(日) 02:19:191+(3+(4-2)+1)*4
のようにすると、1342-+1+4*-という式になってしまいます。
else if(source[i] == ')'){
while( now > 0 && stack[now -1] != '('){
rpn[r++] = stack[--now];
}
--now;
}
原因がわかりません。教えてください。
できれば解決策もm(_ _)m
0882864
2007/09/16(日) 02:45:34>>865
確かに%cとすると一文字だけですが表示されます
JavaをかじってたこともあってString型がCにもあると思い込み,いわゆる文字列がポインタであることを理解していませんでした
pritf("%d",i);のようにカンマの後には変数名を書けばよいと思っていましたが
%sの場合は例外でポインタを書かないといけないのですね
確かにそうすると表記上はすべて変数名のように見えて綺麗ですから、そのためにそのような設計になったのでしょうか…
>>866
31文字以上は入力しないという前提でも不可なのでしょうか?
>>867
char *str ではポインタ(アドレス変数)が確保されただけでその中身については未定義で
さらに、その中身のアドレスの後ろが他のことに使われていないという保証もないから不可で
char str[32]なら31文字分については安全な場所が確保されるからOKという理解で正しいでしょうか
>>869
本文をそのまま引用すると
『strはchar型へのポインタですね。ということはアドレスを格納する変数なのです。これではだめですね。』
とのことです。
しかし、scanfやstrlenについては、渡すべきものはアドレスであり間違えているようには考えられず
printfについても%sにはポインタを渡すのであっているようなので理由が私にはわかりませんでした。
0883デフォルトの名無しさん
2007/09/16(日) 03:18:000884デフォルトの名無しさん
2007/09/16(日) 03:34:24scanfは、渡されたアドレスが示すメモリ領域を書き換えるのだから、適当なアドレスを渡してはいけない。
特に、初期化してないポインタ (どのアドレスを指してるか不定) を渡すなんて、もってのほか。
書き換えられても安全な領域 (char[32]とか) を用意して、そのアドレスを渡す必要がある。
0885881
2007/09/16(日) 04:01:590886デフォルトの名無しさん
2007/09/16(日) 04:12:054 2 - 3 + 1 + 4 * 1 + で合ってますか?
0887デフォルトの名無しさん
2007/09/16(日) 04:22:14その程度の計算なら電卓でできます。
暗算でもできるでしょ?
作る意味無いよ
0888デフォルトの名無しさん
2007/09/16(日) 04:28:51〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ <こいつ最高にアホ
彡、 |∪| /
/ __ ヽノ /
(___) /
0889デフォルトの名無しさん
2007/09/16(日) 04:58:38| ノ ヽ !
/ ● ● | こいつも最高にアホ
| ( _●_) ミ
彡、 |∪| / .\
/ __ ヽノ / \ ...\
(___) / .│ ..│
/ ヽ
l..lUUU
.U
0890デフォルトの名無しさん
2007/09/16(日) 05:19:030891デフォルトの名無しさん
2007/09/16(日) 06:42:361342-+1+4*+ かな。
0892デフォルトの名無しさん
2007/09/16(日) 08:17:49適当に作ってみた。
やっぱり 1342-+1+4*+ になる。
http://sund1.sakura.ne.jp/uploader/source/up11687.c
0893デフォルトの名無しさん
2007/09/16(日) 09:03:321+(2+3) と 2+3+1 が同じだというならそれでも合ってる
0894デフォルトの名無しさん
2007/09/16(日) 12:10:01おれの居る現場の既存のコードでは、
最終的に300〜400MBのメモリを確保するのに、reallocを繰り返して、
延べ 2.5GBぶんコピーを繰り返している事が分かったよ。
DBのテーブルのデータを一度メモリーに全部取り出すんだ...orz
0895デフォルトの名無しさん
2007/09/16(日) 12:12:34それだとDBの意味ががが
元からなさそうな感じではあるけど
0896デフォルトの名無しさん
2007/09/16(日) 12:32:44自分でわざわざ回数まとめてからrealloc()するようなコード書くより、
毎回realloc()する方が速いかもしれないぞw
0897デフォルトの名無しさん
2007/09/16(日) 12:39:000898894
2007/09/16(日) 13:03:07まあ100%無意味って訳じゃないんだけどね。一応SQLの恩恵は受けているから。
でもバッチ系が全部、「始めてプログラムを組んだんじゃないか?」ってレベルなんだ。
>>894のコードも基本的に集計するだけだから、DBの設計さえ良ければ単純なSQLで済むはずなのになー。
ハッ、ここは愚痴スレじゃなかったなスマソ。
0899デフォルトの名無しさん
2007/09/16(日) 13:10:100901デフォルトの名無しさん
2007/09/16(日) 15:00:29毎回やっているかは知らんが
0902デフォルトの名無しさん
2007/09/16(日) 15:06:55元の領域に連続した領域を確保できれば、単純な拡張でよいので、
コピーは省略出来る。
0903デフォルトの名無しさん
2007/09/16(日) 15:09:04#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
void *ptr=NULL, *new_ptr;
int i, count=0;
for(i=1;i<=1000;i++){
new_ptr=realloc(ptr, i*100);
if(ptr!=new_ptr){
fprintf(stderr, "pointer changed. [%d]\n", i);
ptr=new_ptr;
count++;
}
}
printf("change count : %d\n", count);
free(ptr);
return 0;
}
0904デフォルトの名無しさん
2007/09/16(日) 18:10:12void func()
{
static int array[3000] = { 0, .. ,0};
}
的な…
0905デフォルトの名無しさん
2007/09/16(日) 18:20:31っていうかstaticって自動的に0で初期化されなかったっけ?
0906デフォルトの名無しさん
2007/09/16(日) 18:33:310907デフォルトの名無しさん
2007/09/16(日) 18:43:25ローカルな配列は、宣言時に1つ(1要素)でも初期化を行うと残りが全て 0 で初期化される。
int a[3000]; // a[0]〜a[2999] まで全て 0
int b[3000] = {1, 2, 3}; // b[0]=1, b[1]=2, b[2]=3, b[3]〜b[2999]=0
int c[3000] = {1}; // c[0]=1, c[1]〜c[2999]=0
main(){
int d[3000]; // d[0]〜d[2999] まで全て不定値(適当な値)
static int e[3000]; // a と同じ
int f[3000] = {1, 2}; // bとかcと同じ
}
よく、ローカルな配列を 0 で初期化するために array[256] = {0}; とか書くが、
1要素でも初期化すると残りが 0 で初期化されることを利用しているだけ。
array[256] = {1}; と書いて全ての要素が 1 で初期化されると誤解するやつが多い。
任意の値で初期化させたければ、n次元の配列はn重のループを普通に書く。
C++ならalgorithmのfillなんかを使えばいい。
0908デフォルトの名無しさん
2007/09/16(日) 20:37:21staticなら自動的に0で初期化される。
関数内staticにするなら、他の値は難しいな。
呼び出しの都度初期化でいいならmemsetとかでも良いだろうけど。
0909デフォルトの名無しさん
2007/09/16(日) 20:39:250910デフォルトの名無しさん
2007/09/17(月) 01:00:33ヘッダファイルから書き始める
0911デフォルトの名無しさん
2007/09/17(月) 02:30:43既存のファイルに加えるか
新しくファイル作成するか迷うんだけど
どういう基準でやったらいいですか?
0912デフォルトの名無しさん
2007/09/17(月) 10:25:01CUnit使うなら1ファイルに1関数。
0913 ◆7qRx8xrwgo
2007/09/17(月) 11:51:39円記号を表示します。 :\
アポストロフィを表示します。:\
と、出力したくて
#include <stdio.h>
int main(void)
{
printf("円記号を表示します。 :%c\n", '\\');
printf("アポストロフィを表示します。:%c\n", '\'');
return 0;
}
でコンパイルしてみたのですが、
Sample5.c:5:12: warning: unknown escape sequence: '\216'
Sample5.c:6:12: warning: unknown escape sequence: '\216'
とエラーが出たのですが、どうすればエラーが表示されなくなりますか?
0914デフォルトの名無しさん
2007/09/17(月) 11:53:04表示
↓
出力
0915デフォルトの名無しさん
2007/09/17(月) 11:55:230916デフォルトの名無しさん
2007/09/17(月) 11:59:130917デフォルトの名無しさん
2007/09/17(月) 12:03:44文字コード Shift-Jis の時
[表示] = 0x95 0x5C 0x8E 0xA6
0x5C = '\\'
0x8E = 0216 <- 8進数
\216 を解釈しようとして、そんなエスケープシーケンスがないという
*警告*がでているだけ
日本語対応しているコンパイラを使うほうが楽
0918913 ◆7qRx8xrwgo
2007/09/17(月) 12:16:57本に表示と書いてありました
>>915
失礼ながら半信半疑で試したところ、仰るとおり直りました。
>>916
OS:Wndows XP HE SP2
コンパイラ: gcc(Cygwin)
>>917
解説ありがとうございます。今はコンパイラを変えたくないのでこのままでいこうと思います。
もしよろしければ、「表示」のように、気をつけた方がいい単語が他にもありましたら教えてください。
0919デフォルトの名無しさん
2007/09/17(月) 12:22:35―ソЫ�\噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃
0920デフォルトの名無しさん
2007/09/17(月) 12:26:190921デフォルトの名無しさん
2007/09/17(月) 12:32:32MinGW (GCC.EXE (GCC) 3.4.2 (mingw-special)) でもいけたよ
さっそく CFLAGS に追加しておいた
0922918 ◆7qRx8xrwgo
2007/09/17(月) 12:36:56仰るとおりに実行した所エラーが表示されることも無くコンパイルできました。感謝です。
0923デフォルトの名無しさん
2007/09/17(月) 12:41:510924デフォルトの名無しさん
2007/09/17(月) 12:51:000925デフォルトの名無しさん
2007/09/17(月) 12:53:14OSIでデータリンクからセッションぐらいまで
0926デフォルトの名無しさん
2007/09/17(月) 12:55:28あおえすをしいでかいてるのか
すごいなおまえ
0927デフォルトの名無しさん
2007/09/17(月) 13:01:33普段使うのはVC++かJavaかC#
0928デフォルトの名無しさん
2007/09/17(月) 14:43:27去年、一年くらい、10年くらい前に作られたシステムの保守要員やらされて、辟易した。
0929デフォルトの名無しさん
2007/09/17(月) 16:20:360930デフォルトの名無しさん
2007/09/17(月) 16:40:25お客さんとこのシステムの構成が変わったりなんか要望があったら、それにあわせてコードを書き換えたりとか。
新規のお客さんもあったけど、すでにあるコードから必要なコードをコピペして、ちょっといじって
もって行ったりとかするだけ。
0931デフォルトの名無しさん
2007/09/17(月) 16:45:130932デフォルトの名無しさん
2007/09/17(月) 16:57:41基本的にソースコードぐちゃぐちゃだし。
0933デフォルトの名無しさん
2007/09/17(月) 17:06:15基本的にソースぐちゃぐちゃだし。
0934デフォルトの名無しさん
2007/09/17(月) 18:32:30っていうんじゃないんだろうから、迷ったら別ファイルでいいんじゃないでしょうか?
ファイルを分ける弊害って、なにかあるでしょうか?
0935934
2007/09/17(月) 18:35:310936デフォルトの名無しさん
2007/09/17(月) 21:35:29でも、大事な仕事だよ。
今後はC言語でも保守の仕事が増えるんじゃないか!?
COBOLはすでにそうなっている。
しっかりとしたコーディング規約があって、その通りに作られていればいいんだが、
Cでの開発プロジェクトにはコーディング規約がないくて、各自各様のスタイルでコーディング
していることが多い。最近はそうでもないかもしれないけどね。
0937933
2007/09/17(月) 22:09:47>>936
スタイル云々以前の問題でね、多分プログラミング自体の経験が無い人か、
少なくとも、スコープを分かってない人が書いたプログラムで、それが原因のバグとかもある。
おそらくテストもマトモにしてないと思われるよ。orz
>>911
で、「分ける分けない」て話は、スコープとも関わる話なのでスコープを理解すること。
関連性が強い物、似たような機能のものを集めるという分け方もある。
「モジュール強度 結合度 独立性」という言葉を調べると何かわかるかも。
0938デフォルトの名無しさん
2007/09/17(月) 22:18:54「モジュール強度 結合度 独立性」
なつかしい言葉だね
0939デフォルトの名無しさん
2007/09/18(火) 01:53:17自分が持ったいた参考書がこの2つの内容が掲載されてた部分が破けていて分からなくて困っています^^;
0940デフォルトの名無しさん
2007/09/18(火) 02:00:19ポインタ
http://www.geocities.jp/ky_webid/c/028.html
標準関数
http://always-pg.com/c/runtime_rd/
0941デフォルトの名無しさん
2007/09/18(火) 02:05:590942デフォルトの名無しさん
2007/09/18(火) 02:07:38>「&」をアドレス演算子といいます。「&」がアドレスを表すので「"アンド"レス」と覚えておくと分かりやすいかも知れません。
なごんだ(´ー`)
0943デフォルトの名無しさん
2007/09/18(火) 02:10:59OSやドライバを作るなら必要だが、そのレベルに達するまで恐らく5年以上は掛かるだろう
0944デフォルトの名無しさん
2007/09/18(火) 02:13:020945デフォルトの名無しさん
2007/09/18(火) 02:14:400946デフォルトの名無しさん
2007/09/18(火) 02:23:300947デフォルトの名無しさん
2007/09/18(火) 02:58:03こちらの「文字列の文字数を求める」サンプルプログラムですが、
"Cプログラム" の長さは 6 が返るはずなんですが 11 が返ります。
なぜでしょうか? 環境は、linuxで gcc 3.3.6 です。
0948デフォルトの名無しさん
2007/09/18(火) 03:01:060949デフォルトの名無しさん
2007/09/18(火) 03:26:23全角文字は2バイトなのでC標準のstrlenのようにバイト数を返す関数を使用した場合、文字数が得られるとは限らない。
ちゃんとロケールを設定すれば6になるはずだが?一字一句間違えずにコピペした?
0950デフォルトの名無しさん
2007/09/18(火) 03:31:49ダウンロードして展開した wcslen.c というファイルを euc-jp-unix にしてから
そのままコンパイルして実行してます。
0951デフォルトの名無しさん
2007/09/18(火) 03:58:59試してみたが、VC++では 6 が返ってきた。
cygwin gcc 3.4.4 ではコンパイルできなかった。
L"Cプログラム"; の L でパースエラー。
0952デフォルトの名無しさん
2007/09/18(火) 04:14:27C標準に2バイト文字なんて概念あったっけ?
0953デフォルトの名無しさん
2007/09/18(火) 04:22:590954デフォルトの名無しさん
2007/09/18(火) 07:52:09void parse_long_options (int _argc,
char **_argv,
const char *_command_name,
...);
の中の"..."の点三つはどういう意味なのでしょうか?
ご教授宜しくお願い致します。
0955デフォルトの名無しさん
2007/09/18(火) 08:01:23教授じゃなくて教示な
http://www.geocities.jp/ky_webid/c/057.html
0956デフォルトの名無しさん
2007/09/18(火) 08:30:140957デフォルトの名無しさん
2007/09/18(火) 12:59:41--input-charsetと--exec-charsetを指定すればCygwinのgccでもコンパイルできる。
0958デフォルトの名無しさん
2007/09/18(火) 15:16:500959デフォルトの名無しさん
2007/09/18(火) 15:53:07キミがわからないのは
ポインタ変数、scanf関数、数値の大小の比較、数字を表示
のどれ?
0960デフォルトの名無しさん
2007/09/18(火) 15:56:470961デフォルトの名無しさん
2007/09/18(火) 16:00:42*i1 > *i2
0962デフォルトの名無しさん
2007/09/18(火) 16:24:52ポインタ変数を使った比較が判らないのなら、ポインタ変数を使わずに比較すればいいじゃない。
つーか、>958にはポインタ変数を使って比較をせよとは書かれていないのだが。
0963デフォルトの名無しさん
2007/09/18(火) 16:32:58どうも、ありがとうございます!
もう一つご教示いただければ幸いです。
#ifndef _CYGWIN_CONFIG_H
#ifdef __cplusplus
extern "C" {
#endif
#define _CYGWIN_CONFIG_H
の中のextern "C" {
というのはなんなのでしょうか。
どういった意味なのかわけがわかりません。
0964デフォルトの名無しさん
2007/09/18(火) 16:48:27C言語には関係ないので無視していい。
C言語では、__cplusplus はdefineされていないので、コンパイル対象とならない。
0965デフォルトの名無しさん
2007/09/18(火) 21:48:09ほれ!
http://www.med.osaka-u.ac.jp/pub/cl-comp/saito/cppintro/cppintro14.html
CとC++では同じ名前の関数でもリンカーに出力する関数のシンボル名が違ってくるんだよ。
C++の関数名の修飾をやめてCと同じにするのがextern "C"。
Cで作成された関数をC++で使用するときに使う。
だったかな?
0966デフォルトの名無しさん
2007/09/18(火) 22:07:27C++にはオーバーロードがあるから同じ関数名でも区別できる仕組みが必要なんだが、
そのために、Cと互換がなくなる。C++で作った関数をCから呼ぶためにCルールで作る。
0967デフォルトの名無しさん
2007/09/18(火) 22:16:180968963
2007/09/19(水) 08:16:10いや、ありがとうございます!!!
0969デフォルトの名無しさん
2007/09/19(水) 08:20:20それにしてもなんかエロイ響きだな///
0970デフォルトの名無しさん
2007/09/19(水) 17:08:42char moji[2][11]={"あいうえお","かきくけこ"};
とあった場合に、別の変数に代入して表示させることは可能でしょうか?
printf("%s",別の変数);
のような形です。
0971デフォルトの名無しさん
2007/09/19(水) 17:15:07char betu[11];
strcpy(betu, moji[0]);
printf("%s", betu);
strcpy(betu, moji[1]);
printf("%s", betu);
2.
char *betu;
betu = moji[0];
printf("%s", betu);
betu = moji[1];
printf("%s", betu);
0972デフォルトの名無しさん
2007/09/19(水) 18:03:37betu = moji[0];
でおkww
0973デフォルトの名無しさん
2007/09/19(水) 18:05:01コンパイルエラー
C言語でおkww
0974970
2007/09/19(水) 20:25:000975デフォルトの名無しさん
2007/09/19(水) 20:26:310976デフォルトの名無しさん
2007/09/20(木) 01:27:060977デフォルトの名無しさん
2007/09/20(木) 01:46:14でも、入門篇ということなら>>1から覚えていったほうがいい気がする
0978デフォルトの名無しさん
2007/09/20(木) 09:10:50私の説明不足&あっちはまだ次スレが立ってない
の理由でこっちで再び質問させてください。
char c = 'a';
char *pc = &c;
int *pi = &c;
printf("%d\n", (int)*pc);
printf("%d\n", sizeof((int)*pc));
printf("%d\n", *pi);
printf("%d\n", sizeof(*pi));
結果
97
4
-1092947871
4
上のように、pcが指しているデータもpcが指しているデータも
4バイト分のはずなのに、実際には*pcは1バイト分の値しか出力されてません。
これは何故なんでしょうか?
0979デフォルトの名無しさん
2007/09/20(木) 09:36:13何故そう思ったのかは分からないが、次のようにしてみては?
printf("%d\n", *(int*)pc);
0980デフォルトの名無しさん
2007/09/20(木) 09:39:12は、つまり
printf("%d\n", (int)'a');
だから
0981デフォルトの名無しさん
2007/09/20(木) 09:42:15やっと理解できました。ありがとうございました
0982デフォルトの名無しさん
2007/09/20(木) 23:34:38そもそもの問題でC言語でノベルゲームできますか?
VBとかではなくC言語の勉強も兼ねて挑戦してみたいのですが
何から手をつけてよいのかさっぱりなんでおしえてほしいです
0983デフォルトの名無しさん
2007/09/20(木) 23:40:41printf,scanf,ifだけでできるよー!!
0984デフォルトの名無しさん
2007/09/20(木) 23:41:39作れます
書籍を買うのが一番早いです
C言語の本質的な部分だけをやるなら
コンソールだけでおkです
0985デフォルトの名無しさん
2007/09/20(木) 23:42:40字句解析は面倒だけどためになる部分もあると思う。
0986デフォルトの名無しさん
2007/09/20(木) 23:48:48作れるということなのでがんばってみようと思います
絵とかを入れるとなるとやはり難易度があがりますかね?
0987デフォルトの名無しさん
2007/09/20(木) 23:51:35最も難易度が高いのが絵を描くこと
0988デフォルトの名無しさん
2007/09/20(木) 23:54:580989デフォルトの名無しさん
2007/09/20(木) 23:56:20同アングルで撮った写真を2枚入力として、写真の差分の大きい部分に
適当な均一色をアルファブレンドするようなツール
0990デフォルトの名無しさん
2007/09/21(金) 00:11:17printf("\a")で音鳴るよ!!
0991デフォルトの名無しさん
2007/09/21(金) 00:15:380992デフォルトの名無しさん
2007/09/21(金) 00:18:57ゲームブックでいいとおも
0993デフォルトの名無しさん
2007/09/21(金) 00:22:350994デフォルトの名無しさん
2007/09/21(金) 00:33:55自分としては絵まで表示できればいいかな と思ってます
もちろん、ものすごく音を入れたいのはありますが
BASICしかやったことがない初心者ですので
基礎を覚えるので今のところ精一杯かなと
よさげな参考書を書店で探してみようと思います
田舎なので種類が豊富とはいえませんが
0995デフォルトの名無しさん
2007/09/21(金) 00:43:11音を鳴らすだけなら簡単
// winmm.lib をリンクすること
#include<windows.h>
int main(void){
// 再生終了まで待たない(ゲームで使うなら多分こっち)
PlaySound("C:\\windows\\media\\tada.wav", NULL, SND_FILENAME|SND_ASYNC);
// 再生終了まで待つ
PlaySound("C:\\windows\\media\\tada.wav", NULL, SND_FILENAME|SND_SYNC);
return 0;
}
0996デフォルトの名無しさん
2007/09/21(金) 07:19:050997デフォルトの名無しさん
2007/09/21(金) 07:32:08>>996 さんが指摘してくださったWin32apiのことが書かれているようなので
Windowsゲームプログラミング (Game developer) (単行本)
という本を買おうかと思っているのですが
評価はいかほどのものなのでしょうか
Amazonでは一応、高い評価になっています
0998デフォルトの名無しさん
2007/09/21(金) 10:34:450999デフォルトの名無しさん
2007/09/21(金) 10:35:201000小倉優子 ◆en0rG2J.f6
2007/09/21(金) 10:35:5110011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。