C言語なら俺に聞け! Part 110
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/07/06(水) 05:48:01質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
C言語なら俺に聞け! Part 109
http://pc8.2ch.net/test/read.cgi/tech/1119435171/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0002デフォルトの名無しさん
2005/07/06(水) 06:09:46ムマー。
0003デフォルトの名無しさん
2005/07/06(水) 06:42:42クイックソートなのに交換回数がN^2になる並び替えってどんなの
ですかね?
0004デフォルトの名無しさん
2005/07/06(水) 06:46:370005デフォルトの名無しさん
2005/07/06(水) 07:15:43実装時のピボットの選び方による。
ピボットが常に最小値または常に最大値になる場合にO(N^2)になる。
交換回数をE、要素数をNとすると、
E(N) = cN + E(N - 1), N > 1, E(1) = 0 (cは定数)
=> E(N) = cN(N - 1)/2 + E(1) = O(N^2)
ピボットが常にど真ん中の値になる場合が最良でO(N log N)。
E(N) = cN + 2 E(N / 2), N > 1, E(1) = 0 (cは定数)
=> E(N) = N(c log N + E(1)) = O(N log N)
0006デフォルトの名無しさん
2005/07/06(水) 08:52:58ビッ
0007デフォルトの名無しさん
2005/07/06(水) 08:58:390008デフォルトの名無しさん
2005/07/06(水) 09:07:400009デフォルトの名無しさん
2005/07/06(水) 09:08:26誰が立てたの? ただ質問がしたい奴?
0010デフォルトの名無しさん
2005/07/06(水) 09:50:532ちゃんねるではpart 30を超えるスレは自動で立つ様になってるんだ。
わかったらさっさとネギを紫のシールで束ねる仕事に戻るんだ
0011デフォルトの名無しさん
2005/07/06(水) 11:15:22char *tmp;
tmp = 'aiueo';
これはどうなっているのでしょうか?
char型のポインタをtmpにいれるんですよね?
そして、[aiueo]をそのポインタのさきに入れると考えると
6つのcharのスペースがいるわけですよね?
ですが、char *tmp;では、サイズまでは指定していません
オーバーフローとかではないのですか?
0012デフォルトの名無しさん
2005/07/06(水) 11:32:22×: tmp = 'aiueo';
○:tmp = "aiueo";
と仮定して答えさせて貰うと
> 6つのcharのスペースがいるわけですよね?
コンパイラが勝手にその領域を確保して、"aiueo"で初期化している。
その確保した「場所」をtmpに代入しているだけなので無問題。
001311
2005/07/06(水) 11:36:16ありがとうございます
ですが、その場合は初期化できるとしても
引数によって変わる場合等はコンパイラが初期化できないと思うのですがどうなっているのでしょうか?
0014らら
2005/07/06(水) 11:44:04一人一人違うプログラムでなければならないので迷惑かけますがお願いいたします。 】
[1] 授業単元:
データ構造をアルゴリズムでC言語のプログラミング
[2] 問題文(含コード&リンク):
配列のデータ構造を実現するプログラムを作成する。
●データの挿入削除表示が可能であること
●配列に代入するデータは整数型とする
●プログラムの仕様(関数への入出力表示方法など)は各自で決めること
[3] 環境
[3.1] OS:Windows/Linux/等々
Windows
bcpadで授業しています。
[3.2] コンパイラ(バージョン):
Borland c++ Compiler5.5
[3.3] 言語:C/C++/どちらでも可 のいずれか
可。
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか
2005.9.4
[5] その他の制限:どこまで習っているか、等々
特に制限ありません。一人一人違うプログラムを作成する必要があるのでできるかぎり多くのパターンのプログラムがほしいです。 お願いいたします。
0015らら
2005/07/06(水) 11:46:030016デフォルトの名無しさん
2005/07/06(水) 11:51:24コンパイラが出来ませんって言ってくる
001711
2005/07/06(水) 11:53:10なんですけど、 -Wall にしてもワーニングもだしません
今まで数年間実行してきたコードなんですがセグフォもおこしたこともありません
0018デフォルトの名無しさん
2005/07/06(水) 11:56:29って、どういう意味ですか?
自分解釈だと、括弧がおかしいみたいにかんじるのですが
括弧はおかしくないと思います
ですので、私の解釈が間違っていると思うのですがどうなのでしょうか?
0019デフォルトの名無しさん
2005/07/06(水) 11:59:52問題にしたいコードを貼ってくれ。
>11(>12)じゃ、何の問題もあるわけがない。
>>18
自分解釈しないで、ちゃんと英語を理解しろ。ダメなら翻訳サイトへ。
002018
2005/07/06(水) 12:28:50>真実価値として使用される割り当てのまわりの括弧を示唆します。
となりました、
やはり、括弧だとおもうのですが・・・
0021デフォルトの名無しさん
2005/07/06(水) 12:49:14warning:警告
0022デフォルトの名無しさん
2005/07/06(水) 12:51:45> 自分解釈だと、括弧がおかしいみたいにかんじるのですが
ごめん。笑わせてもらた。
たぶん == って書くべきであることが多いところ(ifのカッコなど)で = による代入をしちゃってるけど、
「本当にいいの?カッコでもつけたらどう?」
と提案してくれている。
suggest 提案する
parentheses カッコ(←これだけわかってたみたいねw)
around 〜のまわりに
assignment 代入
used 使われてる
as 〜として
truth value 真や偽の値(trueかfalse)
0023ぼるじょあ ◆yBEncckFOU
2005/07/06(水) 12:52:52gccか?
確かif(a=kansu(b))とかやると出たような。
無視していいよ。
002418
2005/07/06(水) 12:56:45出かける前に解決できて本当によかった、、
while( tmp_1 = *tmp++){
ってやってたのが原因でした
エラーはワーニングも全て埋めたんですけど
これだけどうしても、うまらなかった
でもまあこれは、意図してこうしてる(他にいい方法が思い浮かばない・・・)ので
このワーニングは放っておくとするか・・・
0025デフォルトの名無しさん
2005/07/06(水) 13:01:03って書けば warninng は消えるんでない?
0026ぼるじょあ ◆yBEncckFOU
2005/07/06(水) 13:01:51閉じ括弧が一つ余計
0027デフォルトの名無しさん
2005/07/06(水) 13:13:37コンパイラをコンパイルすると
ぅをーにんぐが日本語になる
しかし、その場合
> 警告: 互換性のない引数3個のポインタを渡しますです
のように、ときどき
英語よりもわかりにくい日本語が出現
002825
2005/07/06(水) 13:15:12正しくは: while((tmp_1 = *tmp++) != 0) {
0029デフォルトの名無しさん
2005/07/06(水) 13:15:36FILE * fp = fopen(...);
if (fp = NULL) {
...;
}
なんて書いてしまったときには大変助かる警告だね。
0030デフォルトの名無しさん
2005/07/06(水) 13:16:27黙らせる目的なら、
while ((tmp_1 = *tmp++)) {
...;
}
でもいい気もする。
0031デフォルトの名無しさん
2005/07/06(水) 13:19:12昔の msc6 だったかは、それでも消えなかった経験があって、いちいち >>28 表記してた。
コンパイラの賢さ次第かもね。
0032デフォルトの名無しさん
2005/07/06(水) 13:32:550033デフォルトの名無しさん
2005/07/06(水) 13:48:43寧ろ、
if (fp = fopen(...) == NULL) ...;
と書いたときに
if ((fp = fopen(...)) == NULL) ...;
としないといけないってことかと。
0034デフォルトの名無しさん
2005/07/06(水) 14:04:47i j data[i][j]
という形式でデータファイルに書き出しました。
そのデータファイルを別のプログラムで読み込ませたい
(新しいプログラムでの2次元配列の初期値として使いたい)のですが、
どうやってデータを読み込めばよいのでしょうか?
fgetsとかsscanfとか検索しましたがよくわかりませんでした。
0035デフォルトの名無しさん
2005/07/06(水) 14:16:38data[i][j] = d;
0036デフォルトの名無しさん
2005/07/06(水) 14:16:53書き出した方法が判らないと読み込みようがない。
0037デフォルトの名無しさん
2005/07/06(水) 14:18:13search(void) の中の、
while(top > 0){
top--;
s = space[top];
を、
for( ; top > front; front++){
/* top--; いらない */
s = space[front];
に修正。
0038デフォルトの名無しさん
2005/07/06(水) 14:30:35これちょっといじったらできましたorz
>>36
書き出した方法というのはどう説明すればいいんでしょうか?
プログラム上では
fprintf(fout, "%d %d %f\n", i, j, data[i][j]);
データファイルは
# i j data[i][j]
0 0 1.20
0 1 2.33
0 2 4.22
1 0 5.33
1 1 3.33
1 2 1.11
・・・って感じで書いてますが。
0040デフォルトの名無しさん
2005/07/06(水) 14:59:41型も書いてないからよく判らんが、
char buf[十分な長さ];
int row;
int col;
double data[適当な列数][適当な桁数];
FILE * fp = fopen("...", "r");
while (fgets(buf, sizeof(buf), fp) != NULL) {
double val;
if (buf[0] != '#') {
continue;
}
sscanf("%d%d%lf", & row, & col, val);
data[row][col] = val;
}
かな。
しかし、冗長なファイルフォーマットだな。
004134
2005/07/06(水) 15:25:40sscanf内で「問題のあるポインタの変換」ってwarning出る上に
すごい値が出てくるんですが。@bcc32
valでも&valでも。
004240
2005/07/06(水) 15:37:04つーか、
sscanf(buf, "%d%d%lf", & row, & col, & val);
だ。
ちっとは調べてくれよぉ。
004334
2005/07/06(水) 15:43:45&valだとwarningはなくなりますけど。
0044デフォルトの名無しさん
2005/07/06(水) 15:51:53ちゃんとコピペしている?
>42は「パーセントエルエフ」だよ。
#あと、double val;ね。
0045デフォルトの名無しさん
2005/07/06(水) 15:56:02なんとなく>>34は
sscanf(buf, ←コレ
をまだ入れ忘れてるんだと思う。
004634
2005/07/06(水) 16:06:07#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char buf[10000];
int row;
int col;
double data[5][5];
FILE * fp;
if ((fp = fopen("aa.dat", "r")) !=NULL) {
while (fgets(buf, sizeof(buf), fp) != NULL) {
double val;
if (buf[0] != '#') continue;
sscanf(buf, "%d %d %lf", &row, &col, &val);
data[row][col] = val;
}
for (row=0; row<5; row++) {
for (col=0; col<5; col++) {
printf("%d %d %f\n", row, col, data[row][col]);
}
}
}
return 0;
}
本題が進まない・・・
0047デフォルトの名無しさん
2005/07/06(水) 16:12:48コンパイラが吐き出すエラーを正確にコピペすりゃ 誰かが答えてくれるかもしれん。
答えてもらえる為に必要な情報を提示する方法を知るのも一興
004834
2005/07/06(水) 16:24:12val の場合
>bcc32 -w d.c
警告 W8013 d.c 16: 'val' は、おそらく値が代入される前に使われている(関数 main )
(16行目がsscanfの行)
>>41のエラーとちがうのはなんでだろ・・・
&val の場合 warningなし
0049デフォルトの名無しさん
2005/07/06(水) 16:26:180050デフォルトの名無しさん
2005/07/06(水) 16:28:28^^?
0051デフォルトの名無しさん
2005/07/06(水) 16:29:13continueしたら次の行いくよ?
005234
2005/07/06(水) 16:37:32あ、でけた・・・
sscanfとdata[][]=をelseではさむのと、ifの中は==ですね。
ご迷惑おかけしました。
>>49
そうなんですか?
0053デフォルトの名無しさん
2005/07/06(水) 16:39:24しない
005440
2005/07/06(水) 16:44:07>>49
printf()系の変換指定子とscanf()系のそれは互換性がありそうでないから要注意。
>>34
いや、単純に
if (buf[0] == '#') {
continue;
}
だけでいい。
0055デフォルトの名無しさん
2005/07/06(水) 16:48:45005634
2005/07/06(水) 16:53:41ただ本当は頭に#ついてたりするので40氏の方法のほうが使えます。
>>40
ifが1行ですんでるから{}いらないかなと思って勝手に省いていました。
やっと本題移れる・・・
005749
2005/07/06(水) 16:58:270059デフォルトの名無しさん
2005/07/06(水) 19:58:08なんでi,jまで必要なんだよ。
0060デフォルトの名無しさん
2005/07/06(水) 20:01:330061デフォルトの名無しさん
2005/07/06(水) 20:36:15ssize_t strlen(const char *s) {
if (!s) return -1; //こういうことはどの程度したほうがいいの?
0062デフォルトの名無しさん
2005/07/06(水) 20:52:440063前スレ989
2005/07/06(水) 21:02:28何卒よろしくお願いいたします
printf( "ファイルの大きさ : %ld\n", FileSt.st_size );
上記で表示される結果(数値)を
char strLine[MAX_PATH];で定義したシンボルに格納したいのですが
どうすればよいでしょうか?
0064デフォルトの名無しさん
2005/07/06(水) 21:04:330065デフォルトの名無しさん
2005/07/06(水) 21:04:53標準出力を読み込んでstrLineに格納するってことですか?
0066デフォルトの名無しさん
2005/07/06(水) 21:05:29sprintf( strLine, "%ld", FileSt.st_size );
0067デフォルトの名無しさん
2005/07/06(水) 21:10:370068前スレ989
2005/07/06(水) 21:12:490069デフォルトの名無しさん
2005/07/06(水) 21:13:440070デフォルトの名無しさん
2005/07/06(水) 21:15:510071デフォルトの名無しさん
2005/07/06(水) 22:39:590072デフォルトの名無しさん
2005/07/06(水) 22:44:57まず、標準偏差を求める式はわかるよな?
0073デフォルトの名無しさん
2005/07/06(水) 22:48:44必要だと思えばやればいい。
0074デフォルトの名無しさん
2005/07/06(水) 22:57:02if( option -> window_grid == 1){ 、や
option -> window_grid_x = value; 、等の
コードが含まれる関数があるとします
それは、"option -> window_grid"等の部分を変えて数百個作っているのですが
増やす際に、コードが莫大におおきくなっていきます
これを、関数の引数から変更することはできないのでしょうか?
上の場合だと
if( hoge == 1){
hogeの部分を、関数の引数によってかえることはできないのでしょうか?
0075デフォルトの名無しさん
2005/07/06(水) 22:59:05見たけどΣとか難しい記号がいっぱいあってよくわかんなかった
0076デフォルトの名無しさん
2005/07/06(水) 23:04:04標準偏差=sqrt(分散)
あとは自分で調べろ
つーかCじゃないし
0077デフォルトの名無しさん
2005/07/06(水) 23:27:28hogeを引数に持つ関数を作ればいいんじゃないの?
007874
2005/07/06(水) 23:36:44どうも、説明と言うものが下手なものですいません
もう少し考え直してみます
0079デフォルトの名無しさん
2005/07/07(木) 02:04:51バイナリファイルに指定長(2バイト)でintを書き込む際に、
例えば数値を255としたときに0xff00ではなく0x00ff、256としたときに0x0100というように
書き込みするにはどうしたらいいでしょうか?
008079
2005/07/07(木) 02:10:16008179
2005/07/07(木) 02:14:09小一時間考えてもわからなかったので教えてください。
0082デフォルトの名無しさん
2005/07/07(木) 02:18:15htons()
0083デフォルトの名無しさん
2005/07/07(木) 02:25:44#include <stdio.h>
#include <limits.h>
int main(void) {
FILE *fp = fopen("test.dat", "wb");
int i;
unsigned int hoge = 255;
unsigned char temp;
for (i = sizeof(unsigned int) - 1; i >= 0; i--) {
temp = (hoge >> i * CHAR_BIT) & 0xff;
fwrite(&temp, 1, 1, fp);
}
fclose(fp);
}
0084デフォルトの名無しさん
2005/07/07(木) 02:28:57#include <stdlib.h>
#include <time.h>
void main() {
int k;
double b[2000];
srand((unsigned int ) time(NULL)*4876465);
for(k=0;k<2000;k++) b[k]=rand();
for(k=0;k<2000;k++) printf("%f",b[k]);
}
配列の一つ一つに異なる乱数を代入したいのですが、
以上のようにやるとすべて同じ値が代入されてしまいます。
for文の中にsrandを入れても同様の結果になってしまいました。
原因を教えていただきたいです・・
0085デフォルトの名無しさん
2005/07/07(木) 02:30:13void writeRev2(FILE * fp, unsigned a)
{
fputc((a >> 8) & 0xff, fp);
fputc((a & 0xff, fp);
}
0086デフォルトの名無しさん
2005/07/07(木) 02:31:39全て同じ値とは?
008884
2005/07/07(木) 02:37:140089デフォルトの名無しさん
2005/07/07(木) 10:37:55http://pc8.2ch.net/test/read.cgi/hp/1112585832/51
を作ってみようと思うんだがどうよ?
0090デフォルトの名無しさん
2005/07/07(木) 12:01:220091デフォルトの名無しさん
2005/07/07(木) 12:19:30スレ違い
009274
2005/07/07(木) 12:24:44#include<stdio.h>
int main(void){
int *mem;
while(1){
malloc(10000);
}
return 0;
}
だと、だめでした
0093デフォルトの名無しさん
2005/07/07(木) 12:26:51> 無限をメモリを喰い続ける
意味不明
0094デフォルトの名無しさん
2005/07/07(木) 12:27:45「どうですか」って何が知りたいんだ?
「だめでした」って、何を期待してるんだ?
0095デフォルトの名無しさん
2005/07/07(木) 12:29:050096デフォルトの名無しさん
2005/07/07(木) 12:31:01int *memはコピーミスです
無限にメモリを悔い続けると言うのは
マシン上のメモリを確保し続けるということです
メモリを使い果たしたらどうなるかと言うてすとがしたいのです
0097デフォルトの名無しさん
2005/07/07(木) 12:37:39まず、日本語を勉強してくれ。
0098デフォルトの名無しさん
2005/07/07(木) 12:43:33>>97
0099>>92
2005/07/07(木) 12:48:53size_t *mem,i=0;
while(1){
mem = (siz_t*)malloc(sizeof(size_t));
*mem = i++;
}
return 0;
}
リソース見ながらこれでも試してみろ。
何が起きても知らんがな。
0100デフォルトの名無しさん
2005/07/07(木) 12:54:10テストすれば良いのではないでしょうか?
0101デフォルトの名無しさん
2005/07/07(木) 12:56:23それをテストするためにコード書いてたんだろ
0102デフォルトの名無しさん
2005/07/07(木) 12:58:37前述のコードでテストできてると思うぞ?
最終的には、malloc()がNULLを返すようになるだけ。
今日びのOSなら、遅くはなってもOSが落ちたりすることはないだろう。
0103デフォルトの名無しさん
2005/07/07(木) 12:59:350104デフォルトの名無しさん
2005/07/07(木) 13:22:44なににならないのか。
0105デフォルトの名無しさん
2005/07/07(木) 14:26:070106デフォルトの名無しさん
2005/07/07(木) 14:36:17便乗質問。
メモリ不足以外の時ってどんな時ですか?
0107デフォルトの名無しさん
2005/07/07(木) 14:40:490108デフォルトの名無しさん
2005/07/07(木) 14:43:52と
work=num[i++];
って同じこと?
0109デフォルトの名無しさん
2005/07/07(木) 14:46:460110デフォルトの名無しさん
2005/07/07(木) 15:15:13その行を見る限り、ほぼ同じ。
0111デフォルトの名無しさん
2005/07/07(木) 15:16:10は
i++; work=num[i];
ってことか
0112デフォルトの名無しさん
2005/07/07(木) 15:17:200113デフォルトの名無しさん
2005/07/07(木) 15:21:47違うだろ。>>108の方がより正しい
0114デフォルトの名無しさん
2005/07/07(木) 15:27:33++i は 加算してから 値を渡す。
num[i++] は num[ 値くれ ]、i++ の値ってなによ? と読めるから 加算前の値になるべ。
int a = 0;
int b = 0;
int a1 = a++;
int b1 = ++b;
とやって違いを見るべし
0115デフォルトの名無しさん
2005/07/07(木) 15:30:44これを1つの関数で要素を変えて実行したいのですがどうすればいいのでしょうか?
typedef struct{
char *a;
int b;
int c;
int d;
} TYPE;
void hoge(){
}
int main(void){
hoge ()
}
と言う感じで、hogeの引数として構造体の要素を渡したいと思うのですが
どういうふうに渡しどういうふうに受け取ればいいのでしょうか?
0116デフォルトの名無しさん
2005/07/07(木) 15:55:16日本語は正しく
typedef struct{
char *a;
int b;
int c;
int d;
} TYPE;
void hoge( TYPE *hoge ){
/* hogeを使ってあれこれ */
}
int main(void){
TYPE foo;
hoge( &foo );
}
こういう事?
0117デフォルトの名無しさん
2005/07/07(木) 15:56:210118デフォルトの名無しさん
2005/07/07(木) 16:03:06やりたいことをちゃんと伝えられるような訓練したほうが良いぞ…
0119デフォルトの名無しさん
2005/07/07(木) 16:11:34理解できたあああああああああああああああああああ
0120デフォルトの名無しさん
2005/07/07(木) 16:18:24hoge_int(int a){
}
int main(){
TYPE a;
hoge_int(a.a);
...
}
のような事をやりたいのか?
0121デフォルトの名無しさん
2005/07/07(木) 16:25:23※ たしかにそういうのが欲しい時もあるけど…
#define IMP_HOGE(a) hage->a = 0;
として
IMP_HOGE( <foo, bar> )
が
hage->foo = 0;
hage->bar = 0;
にプリプロセスされる っていう都合の良いものは C言語の枠組みには無い (よね?
0122デフォルトの名無しさん
2005/07/07(木) 16:25:40メモリの空き容量を取得したいのですが
どのような方法があるでしょうか教えていただけないでしょうか。
よろしくお願い致します。
コンパイラはgccです。
0123デフォルトの名無しさん
2005/07/07(木) 16:36:21つか、スレ違い。
0124デフォルトの名無しさん
2005/07/07(木) 16:49:02すみませんC言語ならいいかと思って。
0125デフォルトの名無しさん
2005/07/07(木) 17:36:25>1くらい読んでから書きましょう。
>>121
既に>118でキーワードが出てるんだから調べてから回答しいや。
0127115
2005/07/07(木) 19:34:45>>116
それだと複数個の関数を用意しなければなりませんよね?
>>120
はい、そのようなことをしたいのですが
それだと、hoge_int内でaが変更されても実際にはa.aは変更されませんよね?
それが変更できるように使いたいです
typedefは >>115のままだとして
void hoge(char temp, int temp_1){
temp = &temp_1;
}
int main(void){
TYPE a;
hoge(a.a, a.b);
hoge(a.a, a.c);
}
のようなことがやりたいのです
hoge内で変更されたないようはa構造体の中身の変更になるようにはできないでしょうか?
0128デフォルトの名無しさん
2005/07/07(木) 19:39:49int main(void){
TYPE a;
a.a = a.b;
a.a, = a.c;
}
でいいじゃねーの?
0129デフォルトの名無しさん
2005/07/07(木) 19:43:56a.b と a.c の型は異なる場合があるってこと?
どっちもintとかなら、hoge(int *b, int *c)
でいいんじゃない?
0130115
2005/07/07(木) 19:56:25例で書いただけですのでhogeの中の実際の処理とは違います
やはり説明が悪いみたいですね
実際のTYPEは数百の要素があり、hoge関数は数百回呼び出されます
ですので、hogeをひとつ書いておき それに渡す引数で計算を変えたいのです
例えば
hoge_1(TYPE *a){
a->a = a->b;
}
hoge_2(TYPE *a){
a->a = a->c;
}
void main(void){
TYPE a;
hoge_1(&a);
hoge_2(&a)
}
これだと、a.aに次々入れると言うだけの単調な処理なのにhoge_iのiが増えるだけコードも関数も増えていきます
0131115
2005/07/07(木) 19:59:36void hoge(char temp, int temp_1){
temp = &temp_1;
}
int main(void){
TYPE a;
hoge(a.a, a.b);
hoge(a.a, a.c);
}
この例えのように、すれば関数の数を増やさなくてもいいと思うのですが
こういうことはできないのでしょうか?
0132デフォルトの名無しさん
2005/07/07(木) 20:03:10言いたいことがさっぱり分からんが
hoge(int *n) { *n = ... }
main() { TYPE a; hoge(&a.a); }
ではだめなのか。
0133デフォルトの名無しさん
2005/07/07(木) 20:06:35それなら
hoge(char* a, char *b) { *a = *b; }
main() { TYPE a; hoge(&a.a, &a.b); hoge(&a.a, &a.c); }
でいいだろ
0134デフォルトの名無しさん
2005/07/07(木) 20:09:18そもそも
>void hoge(char temp, int temp_1){
>temp = &temp_1;
>}
はコンパイルできないぞ。
temp と、&temp_1 は型が違う。
0135デフォルトの名無しさん
2005/07/07(木) 20:21:37たとえだっていってるじゃん
0136デフォルトの名無しさん
2005/07/07(木) 20:23:24これってどういう意味なの?
0137デフォルトの名無しさん
2005/07/07(木) 20:30:550138デフォルトの名無しさん
2005/07/07(木) 20:39:19そもそも、構造体が数百の要素を持つというのが異常な気がするが。
配列で持つことはできないのか?
0139デフォルトの名無しさん
2005/07/07(木) 20:45:43禿同。
事業主に似たようなケースのソースを修正してくれと頼まれたことがある。
「ソースのバイト量で見積もりが高かった頃の名残ですね」
と言ったら苦笑してたよ。
0140デフォルトの名無しさん
2005/07/07(木) 21:02:590141デフォルトの名無しさん
2005/07/07(木) 21:13:50みたいになってるhogeのi1〜iNに対して同じ関数を適用したい、みたいな話だなぁ。
配列を展開しておきました、みたいな。
0142デフォルトの名無しさん
2005/07/07(木) 22:28:00あえてマジレス。
構造体の「要素」を配列でもつ、だ。>141 なら struct hoge { int i[4]; }; みたいな感じ。
文字通り構造体を配列でもつなら struct hoge boke[4]; なだけだが。
0143デフォルトの名無しさん
2005/07/07(木) 22:38:380144デフォルトの名無しさん
2005/07/07(木) 22:41:51>>143
0145デフォルトの名無しさん
2005/07/07(木) 23:16:10今、問題になっているソースを晒した方がいいと思われ。
0146デフォルトの名無しさん
2005/07/07(木) 23:18:020147115
2005/07/08(金) 00:02:43もう少し自分で考えてみるとします
どうも本当にすいませんでした
0148デフォルトの名無しさん
2005/07/08(金) 00:28:49>>118 だろ?
行数が多いって怒られちゃったよ...orz
/* C FAQ 2.14, 2.15 */
#include <stddef.h>
#include <stdio.h>
#ifndef offsetof
#define offsetof(type, mem) ((size_t) \
((char *)&((type *)0)->mem - (char *)(type *)0))
#endif /* !offsetof */
typedef struct TYPE {
char *a;
int b;
int c;
int d;
} TYPE;
void hoge(TYPE* type, size_t offset) {
type->a = ((char*)type) + offset;
}
int main() {
TYPE a = { NULL, 3, 2, 1 };
hoge(&a, offsetof(TYPE, b));
printf("%d\n", (int)*a.a);
hoge(&a, offsetof(TYPE, c));
printf("%d\n", (int)*a.a);
hoge(&a, offsetof(TYPE, d));
printf("%d\n", (int)*a.a);
}
0149デフォルトの名無しさん
2005/07/08(金) 00:33:18offsetof って無いこともあるの?
0150148
2005/07/08(金) 00:35:58C FAQ には無いこともある、と書いてある。
調べて >> 149
0152デフォルトの名無しさん
2005/07/08(金) 00:52:350153デフォルトの名無しさん
2005/07/08(金) 00:53:18C99には、規格として規定されている。しかしながら、C89しか考慮して
いない、またはC99の新機能の一部しか考慮していない処理系が大部分を
占めると考えられる現状においては、ない可能性が十分にある。
0154デフォルトの名無しさん
2005/07/08(金) 03:44:48つまり、C89準拠なら確実にあるんだよ。
FAQで「ない場合」というのは、俗に言うK&R時代のCのこと。
(プロトタイプやvoidの無いやつ)
だから、>>153は、1行目の前半以外は大嘘。
誰でも安心して使って良いし、再defineなどは絶対にしてはならない。
(これは、同2.14の最後に触れているように、0番地のキャスト、及びそのアドレスを取ることを
認めないコンパイラというのも規格上存在する可能性があり、
その場合にはコンパイラが内部機能としてoffsetofの計算を行っているため)
0155デフォルトの名無しさん
2005/07/08(金) 10:39:40int a;
int b;
int c;
} TEST;
という、構造体を初期化するときはどうするのでしょうか?
typedef struct{
int a=0;
int b=0;
int c=0;
} TEST;
とかくのでしょうか?
0156デフォルトの名無しさん
2005/07/08(金) 10:52:00頼むから余りに初歩的な質問は初心者スレへ行ってくれ。
で、初期化は実体を定義するときに行なう。
つまり、
typedef struct {...} TEST;
のときではなく、
TEST foo = {0, 0, 0};
というように。
どうせあんたのレベルだといろいろ判っていないだろうから、
これに頼らず初心者向けの資料でちゃんと調べておくといい。
0157デフォルトの名無しさん
2005/07/08(金) 10:54:250158デフォルトの名無しさん
2005/07/08(金) 11:06:59'定義'じゃなくて'宣言'ね。
0159デフォルトの名無しさん
2005/07/08(金) 11:09:55気にくわないならスルーすれないいじゃん
あほなの?
0160デフォルトの名無しさん
2005/07/08(金) 11:10:560161デフォルトの名無しさん
2005/07/08(金) 11:11:260162デフォルトの名無しさん
2005/07/08(金) 11:15:57そういう風に言語ができてるから。
>>159
スルーできない人が言える事じゃない。
0163デフォルトの名無しさん
2005/07/08(金) 11:17:42できるし
0164デフォルトの名無しさん
2005/07/08(金) 11:19:20不便だという人がいる事を念頭においておけばいつかそれが役に立つかもしれないじゃない
0165デフォルトの名無しさん
2005/07/08(金) 11:19:26ってか、おっきめの構造体を0で初期化しようとおもったら
TEST hoge = {0, 0, 0, 0, 0, ....}
って、百個ちかく書かなくちゃいけないね
0166デフォルトの名無しさん
2005/07/08(金) 11:20:10できないでしょ
0167デフォルトの名無しさん
2005/07/08(金) 11:20:170168デフォルトの名無しさん
2005/07/08(金) 11:27:40TEST hoge = {0};
でいいじゃん・・・。
0170デフォルトの名無しさん
2005/07/08(金) 12:25:44それだとポインタがはいってたらできないでしょ
0171デフォルトの名無しさん
2005/07/08(金) 12:31:13だ か ら 「0なら」だと言っとるだろうが。
誰もNULLとは言ってない。
殆ど0なら、0で埋めてから任意に初期化すればいい。
0172デフォルトの名無しさん
2005/07/08(金) 12:34:18ポインタならNULL、浮動小数点数なら0.0に初期化されるはずだが?
0173デフォルトの名無しさん
2005/07/08(金) 12:34:400174デフォルトの名無しさん
2005/07/08(金) 12:38:04どっちも保証はされてない。
少なくとも、普及してるパソコン上ではそうなるけどね。
組込みだとそうはいかんってだけ。
0175デフォルトの名無しさん
2005/07/08(金) 12:38:550176デフォルトの名無しさん
2005/07/08(金) 12:39:340177デフォルトの名無しさん
2005/07/08(金) 12:39:45できる
0178デフォルトの名無しさん
2005/07/08(金) 12:39:480179デフォルトの名無しさん
2005/07/08(金) 12:59:30されてるだろ。
calloc や memset で 0 埋めしても 0 で初期化したことにはならないけど。
0180デフォルトの名無しさん
2005/07/08(金) 13:03:24とはどういう意味ですか?
0181デフォルトの名無しさん
2005/07/08(金) 13:05:56エキサイト便利だね
0182デフォルトの名無しさん
2005/07/08(金) 13:09:40組込みなら保証されないよ。
char unko[256]={0};
とやったときに残りを0埋めするのは「自分」ですから。
市販ライブラリをぶち込む分には大丈夫だと思うけど。
0183デフォルトの名無しさん
2005/07/08(金) 13:16:31組込みの話なんか誰もしてないから
0184デフォルトの名無しさん
2005/07/08(金) 13:29:280185デフォルトの名無しさん
2005/07/08(金) 13:31:360186デフォルトの名無しさん
2005/07/08(金) 13:33:32>>174でしてる
0187デフォルトの名無しさん
2005/07/08(金) 13:36:49保証されてる云々の話とは違う。
C++ではNULLは0であると保証されているが、
C言語では保証されていない(これは勘違い野郎が多い)。
C言語ではNULLが偽のなることだけが保証されている。
それにC言語の浮動小数点はIEEE754にするなどと規定していないし、
0-fillした時に0.0になるなどとも規定していない。
ただ、実用上はそのような前提にしても問題なかろう、という話だ。
以上。
0188180
2005/07/08(金) 13:38:140189デフォルトの名無しさん
2005/07/08(金) 13:48:23statという構造体
0190デフォルトの名無しさん
2005/07/08(金) 13:51:320-fillとかそういう話でなくて、
初期化子のない静的変数や初期化子の足りない構造体、配列は
0で初期化されるが、この場合0で初期化するというのは、
ポインタならNULL、浮動小数点数なら0.0で初期化される
ということが保証されてるのかどうかって話。
0191180
2005/07/08(金) 13:52:290192デフォルトの名無しさん
2005/07/08(金) 13:52:5810進数(0〜15)に直すにはどうしたらよいのですか?
簡単な質問で申し訳ないですが、よろしくお願いします。
0193デフォルトの名無しさん
2005/07/08(金) 13:55:080194デフォルトの名無しさん
2005/07/08(金) 13:55:13ヒント:どうもしない
0195デフォルトの名無しさん
2005/07/08(金) 13:56:47>>188
statというタグ名のついた構造体。
sys/stat.hを見るなりman statするなりして調べましょう。
0196デフォルトの名無しさん
2005/07/08(金) 13:57:32printf("%d", c);
0197192
2005/07/08(金) 14:07:21大変申し訳ないんですが、質問を微妙に間違えてしまいました。
unsigned char には16進数としてではなく、文字列として0〜fまで入ってます。
unsigned char c = 'f';のように。
スレ違いでしたら、初心者歓迎のスレを見つけたので、そこで聞いてみます。。。
0198デフォルトの名無しさん
2005/07/08(金) 14:12:360-fなら16進数でしょ
どこかにかきだしたいんならprintfでいいじゃん
0199デフォルトの名無しさん
2005/07/08(金) 14:14:16Cのソース上で「0」と書かれたものが、
ポインタとして解釈される場合、それはNULLポインタを意味する。
これはCの仕様。
ただし、NULLポインタのビットパターンがAll0である保証がないだけ。
0200198
2005/07/08(金) 14:14:24俺が読み違えてた
頭使ってちょっと考えてみ
きみがいいたいのは fなら15にしたいとかでしょ?
例えば ffだとすると1515こんなもんにしてどうするの?
ffと1515の意味はまったく違うよ?
0201デフォルトの名無しさん
2005/07/08(金) 14:16:260202デフォルトの名無しさん
2005/07/08(金) 14:20:53取り敢えず、これでどうだろう。
unsigned char foo = 'f';
printf("%d\n", foo >= '0' && foo <= '9' ? foo - '0' : foo >= 'a' && foo <= 'f' ? foo - 'a' + 10 : -1);
0203192
2005/07/08(金) 14:21:37自分がしたいのは、
4つの文字列を16ビットの数字に変換したいのです。
00ffときたら、0000 0000 1111 1111
というふうに。
この場合ですと、256ですね。
0〜fまでの文字列を0〜15に変換できれば
あとはビット演算で計算しようと思ってたのです。
0204デフォルトの名無しさん
2005/07/08(金) 14:22:07そんなことしなくても
man printfみたらもっと便利な方法があると思うよ
0205デフォルトの名無しさん
2005/07/08(金) 14:23:040206デフォルトの名無しさん
2005/07/08(金) 14:23:24それなら、これでいいっしょ。
unsigned char foo[] = "00ff";
printf("%d\n", strtol(foo, NULL, 16));
0207デフォルトの名無しさん
2005/07/08(金) 14:23:42int x;
char str[] = "deadbeef";
sscanf(str, "%x", &x);
sprintf(str, "%d", x);
0208デフォルトの名無しさん
2005/07/08(金) 14:24:14まったくもってなにがしたいのかがわからない
0209デフォルトの名無しさん
2005/07/08(金) 14:29:57struct stat hoge;
って不便だな
なんでstat型をつくらないんだろう
0210デフォルトの名無しさん
2005/07/08(金) 14:31:35なんでだろうね
構造体を自分で宣言するときは必ずtypedefしてるけど
0211デフォルトの名無しさん
2005/07/08(金) 14:33:51俺もしてる
その方が楽っていうかやりやすいし
わかりやすいと思うのに
0212デフォルトの名無しさん
2005/07/08(金) 14:35:27C++のように、struct stat {...};でstat foo;と書けるようにするとparseが面倒でしょ。
0213デフォルトの名無しさん
2005/07/08(金) 14:41:26「エキスパートCプログラミング」の著者が
構造体をtypedefすると構造体であることがわかりにくいからすんなって主張してた。
わかりにくくて困ることが何かあるのか?って思った。
0214デフォルトの名無しさん
2005/07/08(金) 14:43:23ああ、なるほど
確かにそれはあるかもね。
いや、無いか。いまさら。
0215デフォルトの名無しさん
2005/07/08(金) 14:49:48モジュール内部でしか使わない構造体はstructのままにしてる。
FILEのように、使う側が構造体メンバにアクセスする必要が無いなら
typedefしてもいいんじゃないかな。
0216デフォルトの名無しさん
2005/07/08(金) 15:07:070217デフォルトの名無しさん
2005/07/08(金) 15:20:11なぜ、mallocはキャストしなければならないのでしょうか?
0218デフォルトの名無しさん
2005/07/08(金) 15:23:05C++では型を合わせるために必要になる。
int *ip;
char *cp = ip;
こういううっかりバグを防ぐために。
0219デフォルトの名無しさん
2005/07/08(金) 15:27:22あれは確認の意味を込めて見たいな感じ?
0220デフォルトの名無しさん
2005/07/08(金) 15:30:490221デフォルトの名無しさん
2005/07/08(金) 15:51:42キャストする必要があるの?
0222デフォルトの名無しさん
2005/07/08(金) 16:27:52void *「から」のキャストは、C++では必要
Cでは、両方不要
もちろん、データのポインタ型に限る
0223デフォルトの名無しさん
2005/07/08(金) 16:32:14コンパイラによってはデフォルトでエラーになるから悲しい。
特にSGI(IRIX)のとかね。
0224デフォルトの名無しさん
2005/07/08(金) 16:43:02lintを黙らせる為に使うことはある
0225デフォルトの名無しさん
2005/07/08(金) 16:56:23ポインタで入力した文字列をその配列の中で逆転するのはどうやったら
いいんですか??
問題が、課題2において、文字列へのポインタstr1を
入力し、その文字列を逆順にしたものを改めて
str1が指す文字列に格納する関数reverse_str_2を
作成したうえでプログラムJuly17.cに追加し、これを
完成させなさい。
なんです。
プログラムuly17.cが
#include<stdio.h>
/* プロトタイプ宣言は考えること・・・ヒント:呼び出し部分を見ればわかる */
main(){
char string[100]; /* 入力する文字列(99文字までOK(なぜ99文字なのか考えること) */
printf("文字列を入力してください:");
gets(string); /* 文字列を入力 */
reverse_str2(string); /* 文字列を逆に並べる */
printf("\n\n"); /* 少しあける */
printf("逆にしたら: %s\n", string);
}
/* この下に関数 reverse_str2 を書いてください */
なんです。 おねがいします(><)
0226デフォルトの名無しさん
2005/07/08(金) 16:59:57宿題は宿題スレへ。
0227デフォルトの名無しさん
2005/07/08(金) 17:03:17おもしろいことにC++を作ったBjarneはユーザ定義型の差別だとD&Eに書いた。
0228デフォルトの名無しさん
2005/07/08(金) 19:45:10char* reverse_str2(char *string) {
static int i,j;
char geriunko = string[i];
if ( string[i++] )
reverse_str2( string ), string[j] = geriunko, j++;
else
string[--i] = '\0';
return string;
}
0229デフォルトの名無しさん
2005/07/08(金) 20:24:19int j;
if(x<y){
for(j=x;j>0;J--){
if(x % j ==0){
k=j;
if(y %k ==0){
printf("%d\n",k);
j=0;
}
}}}
if(x>y){
for(j=y;j>0;J--){
if(y % j ==0){
k=j;
if(y %k ==0){
printf("%d\n",k);
j=0;
}
}}}
}
を再帰で書くとどうなりますか?
0230デフォルトの名無しさん
2005/07/08(金) 20:28:01名前ちゃんと付けてこいや
0231デフォルトの名無しさん
2005/07/08(金) 20:28:44Jってなんだ?
0232デフォルトの名無しさん
2005/07/08(金) 20:32:100233デフォルトの名無しさん
2005/07/08(金) 20:33:500234デフォルトの名無しさん
2005/07/08(金) 20:38:27int j;
if(x<y){
for(j=x;j>0;j--){
if(x % j ==0){
if(y %j ==0){
printf("%d\n",j);
j=0;
break;
}
}}}
if(x>y){
for(j=y;j>0;j--){
if(y % j ==0){
if(x % j ==0){
printf("%d\n",j);
j=0;
}
}}}
}
少しだけ簡潔にしましたが、動きませんorz
0235デフォルトの名無しさん
2005/07/08(金) 20:41:01それに動かないものを再帰にさせようとしているのか?
再起不能。
0236デフォルトの名無しさん
2005/07/08(金) 20:43:10今度は、二つのifブロックの中身がまったく同じになったぞ。
0237デフォルトの名無しさん
2005/07/08(金) 20:43:320238デフォルトの名無しさん
2005/07/08(金) 20:44:12ただし「まともな」日本語を229==234が書けることを前提とする。
0239デフォルトの名無しさん
2005/07/08(金) 20:44:150240デフォルトの名無しさん
2005/07/08(金) 20:44:190241デフォルトの名無しさん
2005/07/08(金) 20:47:320242デフォルトの名無しさん
2005/07/08(金) 20:54:00#include <stdio.h>
//ロジックの整理
void m(int x,int y){
int j;
if(x<y){
for(j=x;j>0;j--){
if(x % j ==0 && y %j ==0){
printf("%d\n",j);
break;
}
}
}
if(x>y){
for(j=y;j>0;j--){
if(y % j ==0 && x % j ==0)
{
printf("%d\n",j);
break;
}
}
}
}
0243デフォルトの名無しさん
2005/07/08(金) 20:54:16void r(int x,int y,int j)
{
if( j == 0 ) return;
if( y % j || x % j) r(x,y,--j);
else printf("%d\n", j);
}
void m2(int x, int y)
{
if( x == y ) return;
if( x < y ) r( x, y, x);
else r( x, y, y);
}
//動作確認
int main()
{
int x = 111, y = 99;
m(x,y);
m2(x,y);
return 0;
}
0244デフォルトの名無しさん
2005/07/08(金) 21:04:250245デフォルトの名無しさん
2005/07/08(金) 21:05:090246デフォルトの名無しさん
2005/07/08(金) 21:08:390247デフォルトの名無しさん
2005/07/08(金) 21:08:51それはCの問題じゃない。
0248デフォルトの名無しさん
2005/07/08(金) 21:09:490249デフォルトの名無しさん
2005/07/08(金) 21:13:42で、出来るるんですけど、それと同じこと出来ませんか?
0250デフォルトの名無しさん
2005/07/08(金) 21:15:380251デフォルトの名無しさん
2005/07/08(金) 21:18:070252デフォルトの名無しさん
2005/07/08(金) 21:18:12もっと基本的な所から勉強しろ。
0253デフォルトの名無しさん
2005/07/08(金) 21:20:22format c:/
0254デフォルトの名無しさん
2005/07/08(金) 21:20:240255デフォルトの名無しさん
2005/07/08(金) 21:21:14それで?
0256デフォルトの名無しさん
2005/07/08(金) 21:21:400257デフォルトの名無しさん
2005/07/08(金) 21:22:43http://kaitori.pasocomclub.co.jp/
0258デフォルトの名無しさん
2005/07/08(金) 21:29:070259デフォルトの名無しさん
2005/07/08(金) 21:31:220260デフォルトの名無しさん
2005/07/08(金) 21:34:22使ってる人間に馬鹿にされていることをわからないと
0261デフォルトの名無しさん
2005/07/08(金) 21:37:060262デフォルトの名無しさん
2005/07/08(金) 21:39:08回線切って首吊って寝ろ。 600秒くらい。
それで十分だろ。
0263デフォルトの名無しさん
2005/07/08(金) 21:39:330264デフォルトの名無しさん
2005/07/08(金) 21:49:01F3は普段使いませんよね? (・∀・)ニヤニヤ
0265デフォルトの名無しさん
2005/07/08(金) 21:49:490266デフォルトの名無しさん
2005/07/08(金) 21:50:59デフォルトでは。(w
0267デフォルトの名無しさん
2005/07/08(金) 21:53:12ありがとう
0268デフォルトの名無しさん
2005/07/08(金) 21:54:310269デフォルトの名無しさん
2005/07/08(金) 21:56:13お前が一番だがな
0271デフォルトの名無しさん
2005/07/08(金) 21:57:57>265はパンチラか?
0272デフォルトの名無しさん
2005/07/08(金) 21:59:56それはこっちに言え。
ttp://pc8.2ch.net/test/read.cgi/tech/1120153520/226-241
0273たすけて
2005/07/09(土) 01:28:090274デフォルトの名無しさん
2005/07/09(土) 01:30:33世の中に流通してるほぼ全てのバイナリはバグ0だネ
0275デフォルトの名無しさん
2005/07/09(土) 01:31:42プログラムのコードに問題があるから。
"コンパイルできればエラーがない"ということにはならないよ。
0276デフォルトの名無しさん
2005/07/09(土) 01:33:08コンパイルできたというのは
そのソースコードがシンタクス的に正しい
というそれだけのことです
コンパイラはプログラムの意味や処理が正しいか、なんてことは判断できませんし
しません
あなたのプログラムがメモリを壊そうがHDDを初期化しようが
全世界に向けてラブレターを振りまこうが、知ったことではないのです
0277デフォルトの名無しさん
2005/07/09(土) 01:40:27ソレダッ!!
0278デフォルトの名無しさん
2005/07/09(土) 02:01:36今書いてるコード制作期間は2週間なのに
なぜかセグフォる、デバッグにもう10日はかけてる
しにたくなってくるな
0279デフォルトの名無しさん
2005/07/09(土) 04:40:04これって、確実に関係ないメモリ破壊してるよね
メッセージが出るってことは、=被害大きいってことなの?
0280デフォルトの名無しさん
2005/07/09(土) 08:18:480281デフォルトの名無しさん
2005/07/09(土) 11:18:19ごめん。
0282デフォルトの名無しさん
2005/07/09(土) 11:28:110283デフォルトの名無しさん
2005/07/09(土) 14:26:04ってC言語でも書けるの?
0284デフォルトの名無しさん
2005/07/09(土) 14:28:17C99から可
0285デフォルトの名無しさん
2005/07/09(土) 14:38:20ファイル分割の勉強を始めたのですが、エラーが出てしまって動きません。
エラー:未解決の外部シンボル_maxが関数_mainで参照されました
本見ながらだから間違えてはないはずなんですけど・・・
0286デフォルトの名無しさん
2005/07/09(土) 14:41:51説明が見当たりません
わかるかたいましたら説明していただけないでしょうか?
0287デフォルトの名無しさん
2005/07/09(土) 14:44:350288285
2005/07/09(土) 15:14:350289デフォルトの名無しさん
2005/07/09(土) 15:15:140290日本道路公団
2005/07/09(土) 15:15:22LSI C-86 v3.30c 試食版を使ってます。この説明書みたいのには
載ってませんでした。
0291デフォルトの名無しさん
2005/07/09(土) 15:25:16makeの使い方でも見れ
0292日本道路公団
2005/07/09(土) 15:32:030293デフォルトの名無しさん
2005/07/09(土) 15:33:44説明書読め
0294日本道路公団
2005/07/09(土) 15:40:270295デフォルトの名無しさん
2005/07/09(土) 15:46:06はいはい。こちらでどーぞ
http://pc8.2ch.net/test/read.cgi/tech/1119793525/l50
0296デフォルトの名無しさん
2005/07/09(土) 15:47:440297日本道路公団
2005/07/09(土) 15:48:480298286
2005/07/09(土) 15:49:230299デフォルトの名無しさん
2005/07/09(土) 15:50:07ちゃんとLSIC86.MANに書かれてある
0300デフォルトの名無しさん
2005/07/09(土) 15:50:08そこでふたたび聞けってことじゃないの?
0301デフォルトの名無しさん
2005/07/09(土) 15:50:590302デフォルトの名無しさん
2005/07/09(土) 15:51:430303デフォルトの名無しさん
2005/07/09(土) 15:51:54lcc a.c b.cでできないのか?
0304デフォルトの名無しさん
2005/07/09(土) 15:52:46してたらこんな質問してないよ。
まー釣られて楽しもうでは内科医。
0306デフォルトの名無しさん
2005/07/09(土) 15:57:59断る
0307日本道路公団
2005/07/09(土) 16:00:170308デフォルトの名無しさん
2005/07/09(土) 16:00:41strndupで探してみろ
0309デフォルトの名無しさん
2005/07/09(土) 16:01:42こちらは十分情報を与えた
意地悪なんてしていない
0310デフォルトの名無しさん
2005/07/09(土) 16:02:19そもそも単一ファイルでもコンパイルできてねーだろ。
0311日本道路公団
2005/07/09(土) 16:02:260312デフォルトの名無しさん
2005/07/09(土) 16:02:58ここでしつもんするのはスレちがいだから、いかのスレッドでしつもんしてね
http://pc8.2ch.net/test/read.cgi/tech/1119793525/l50
0313日本道路公団
2005/07/09(土) 16:06:55Sample1.h・・・関数プロトタイプ宣言
Sample2.c・・・関数の定義
Sample3.c・・・プログラム本体
だったら
lcc Sample1.Sample3 Sample2.Sample3 ってこと?
0314デフォルトの名無しさん
2005/07/09(土) 16:09:46lcc Sample2.c Sample3.c
0315デフォルトの名無しさん
2005/07/09(土) 16:11:570316デフォルトの名無しさん
2005/07/09(土) 16:14:19ソースファイルに
#include <con.h>
#include <nul.h>
が必要
0317日本道路公団
2005/07/09(土) 16:15:21今からポインタです。ここがやっかいと聞きました。
ここでつまづいたら煮るなり焼くなりしてください。
0318デフォルトの名無しさん
2005/07/09(土) 16:22:140319デフォルトの名無しさん
2005/07/09(土) 16:32:46#include <stdlib.h>
#include <string.h>
main()
{
int test = 9;
char a[256], b[256];
itoa( test, b, 10 );
if ( test < 10 )sprintf( a, "0%s" ,b );// 1
else strcpy( a, b );//
( test < 10 ) ? sprintf( a, "0%s" ,b ):// 2 (※)
strcpy( a, b );//
printf( a );
}
2 の部分でエラーが出るのはどうしてですか?
ほぼ同じ処理をしているはずだと思っていたのですが。
戻り値の問題かなぁ、と思って、strcpy( a, b ),0; としてみても、結果は同じでした。
コンパイラはVC6.0です。
0320デフォルトの名無しさん
2005/07/09(土) 16:33:13もう来なくていいよ。
0321デフォルトの名無しさん
2005/07/09(土) 16:34:36> エラーが出る
ならエラーメッセージくらい貼れ。
0322デフォルトの名無しさん
2005/07/09(土) 16:35:51sprintf( a, "%02d", test );
0323デフォルトの名無しさん
2005/07/09(土) 16:39:56やべっ・・・この時間馬鹿しかいないみたい・・・問題はそこじゃねーだろが
一応エラーメッセージは張っとくけどさ・・・
つchar *' 型から 'int' 型への変換ができません。
0324デフォルトの名無しさん
2005/07/09(土) 16:41:000325デフォルトの名無しさん
2005/07/09(土) 16:42:220326デフォルトの名無しさん
2005/07/09(土) 16:43:33中黒の発音がポイントって聞いたんですが…?
0327デフォルトの名無しさん
2005/07/09(土) 16:43:37ヒント:char *strcpy( char *, const char * );
0328デフォルトの名無しさん
2005/07/09(土) 16:44:58正直、何をしたいのかわからない。
0329デフォルトの名無しさん
2005/07/09(土) 16:45:04はい。そのとおりです。
0330デフォルトの名無しさん
2005/07/09(土) 16:45:32正しくはストゥディオ・ドット・エッチだ
0331デフォルトの名無しさん
2005/07/09(土) 16:45:46釣り餌ですからねw
0332デフォルトの名無しさん
2005/07/09(土) 16:46:17reallocでメモリ割り当てサイズを縮小した場合、割り当てエリアの再配置(移動)が発生しないという保障はありますか?
0333デフォルトの名無しさん
2005/07/09(土) 16:46:40ない
0334デフォルトの名無しさん
2005/07/09(土) 16:46:52else sprintf( a, "%2d", test );
こうしとけと言いたいんだろうけど、俺が聞きたいのはそこじゃないっすよ。
>>319
これで読み取れないんなら邪魔なレスしてんじゃねぇよw
0335デフォルトの名無しさん
2005/07/09(土) 16:46:560336デフォルトの名無しさん
2005/07/09(土) 16:47:25そうですか。ありがとうございました。
0337デフォルトの名無しさん
2005/07/09(土) 16:48:040338デフォルトの名無しさん
2005/07/09(土) 16:49:040339デフォルトの名無しさん
2005/07/09(土) 16:49:190340デフォルトの名無しさん
2005/07/09(土) 16:50:04これで読み取れないんなら邪魔なレスしてんじゃねぇよw
0341デフォルトの名無しさん
2005/07/09(土) 16:50:050342デフォルトの名無しさん
2005/07/09(土) 16:50:40いや、コードとかの問題じゃなくてさ、
俺が聞きたいなんでの部分に答えれているやつはいないみたいだけど?
ほんっっっと失敗した^^
最近煽るだけのやつが多いのな
0343デフォルトの名無しさん
2005/07/09(土) 16:51:26あなたあおりながら、画面の前でハテナが浮かんでますよ
0344デフォルトの名無しさん
2005/07/09(土) 16:52:24思っただけだったのでキニスンナw
0345デフォルトの名無しさん
2005/07/09(土) 16:52:37そんな横暴な聞き方じゃ答えてもらえないっすよ
必死になるだけ無駄
0346デフォルトの名無しさん
2005/07/09(土) 16:54:01>>319 >>323 >>334 >>339 >>340 >>342 >>343
こんなアンカーならべる暇人にまともな回答期待しちゃいねぇよw
もうここで正解きくの諦めてる状態だから^^
0347デフォルトの名無しさん
2005/07/09(土) 16:55:44てこと?
0348デフォルトの名無しさん
2005/07/09(土) 16:55:48ぼくはもとから回答する気はありませんよ
ただ他の良心的な方々からも答えてもらえませんよ?ってこと
0349デフォルトの名無しさん
2005/07/09(土) 16:58:57( test < 10 ) ? sprintf( a, "0%s" ,b ) : 0,strcpy( a, b );
0350デフォルトの名無しさん
2005/07/09(土) 16:59:49どうして三項演算子について調べようとしない?
0351デフォルトの名無しさん
2005/07/09(土) 17:00:16うほっ
0352デフォルトの名無しさん
2005/07/09(土) 17:01:32このスレアホの巣窟だな
0353デフォルトの名無しさん
2005/07/09(土) 17:02:04? : の条件演算子は真のときと偽のときとで式の型が一致している必要がある。
なぜならを条件演算子は演算子だから結果を出す必要があるため。
たとえばこんなこともできる。
int n;
n = test < 10 ? 0 : 10;
sprintfはint、strcpyはchar *を返すので型を合わせようにも変換できないのでエラーになる。
0354デフォルトの名無しさん
2005/07/09(土) 17:02:310355デフォルトの名無しさん
2005/07/09(土) 17:03:41>>331
0356日本道路公団
2005/07/09(土) 17:04:360357デフォルトの名無しさん
2005/07/09(土) 17:04:390358デフォルトの名無しさん
2005/07/09(土) 17:05:41お前はいちいち学習内容を報告しに来る気かw
0359デフォルトの名無しさん
2005/07/09(土) 17:08:49>>320
0360デフォルトの名無しさん
2005/07/09(土) 17:11:05ちょっとレベル低すぎ。
0361日本道路公団
2005/07/09(土) 17:11:300362デフォルトの名無しさん
2005/07/09(土) 17:12:050363デフォルトの名無しさん
2005/07/09(土) 17:16:28> 戻り値の問題かなぁ、と思って、strcpy( a, b ),0; としてみても、結果は同じでした。
?: と , の優先順位。
0364デフォルトの名無しさん
2005/07/09(土) 17:20:34これな〜んだ?
0365デフォルトの名無しさん
2005/07/09(土) 17:22:140366デフォルトの名無しさん
2005/07/09(土) 17:24:0730万行書いてもヘボいやつはヘボいぞ。
漏れや藻前みたいにな。
0367デフォルトの名無しさん
2005/07/09(土) 17:26:05test < 10 ? (void)sprintf(a, "0%s", b) : (void)strcpy(a, b);
0368デフォルトの名無しさん
2005/07/09(土) 17:26:080369デフォルトの名無しさん
2005/07/09(土) 17:26:350370デフォルトの名無しさん
2005/07/09(土) 17:28:120371日本道路公団
2005/07/09(土) 17:30:130372デフォルトの名無しさん
2005/07/09(土) 17:31:34i = (i==0) ? printf("1:%d\n",i),printf("2:%d\n",i): printf("dummy");
printf("3:%d",i);
これの printf("2:%d\n",i) が 4 にならないのはどうしてですか?
faq ですか?
0373デフォルトの名無しさん
2005/07/09(土) 17:32:23人月が?
0374デフォルトの名無しさん
2005/07/09(土) 17:35:58環境は?
0375デフォルトの名無しさん
2005/07/09(土) 17:36:03なんで4になると思ったの?
0376デフォルトの名無しさん
2005/07/09(土) 17:41:49>>367
>>>353
ありがとうございました
0377デフォルトの名無しさん
2005/07/09(土) 17:45:06どのヘッダに入っているのでしょうか?
string.h にもなかったです
0378デフォルトの名無しさん
2005/07/09(土) 17:48:510379デフォルトの名無しさん
2005/07/09(土) 17:53:09自分で作った方が早いですね
お手数をお掛けしました
0380デフォルトの名無しさん
2005/07/09(土) 18:11:410381日本道路公団
2005/07/09(土) 18:46:200382デフォルトの名無しさん
2005/07/09(土) 19:37:14Cのポインタがいろいろと面倒なだけ。
0383デフォルトの名無しさん
2005/07/09(土) 19:58:28という事なのですが、実行できたものの削除したと出たのに
実際削除されませんでした。★で囲まれてる場所があやしいので
もしよろしければ、ご教授お願いします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct list{
char name[100];
struct list *next;//自己参照構造体
}NODE;
void list_out(NODE *);
void add_list(NODE);//リストの登録
NODE *del_list(NODE);//リストの削除
NODE *head;//先頭ポインタ
void main(void)
{
NODE adddata;
NODE deldata,*p;
printf("***文字列の昇順に登録***\n");
printf("文字列入力 (CTRL+Zで終了)\n");
0384デフォルトの名無しさん
2005/07/09(土) 19:59:05と言う変数があるのですが
これを違う関数にわたし、その関数で変更したら元の関数でも変更されているように渡したいのですが
どういうふうに渡したらいいのでしょうか?
違う関数での受け方も教えていただけるとうれしいです
0385デフォルトの名無しさん
2005/07/09(土) 19:59:30while(printf("->"),gets(adddata.name) !=NULL){
add_list(adddata);
}
printf("***リストの削除***\n");
list_out(head);
printf("\n*** リストの削除 ***\n");
printf("削除文字列入力\n");
while(printf("->"),gets(deldata.name) !=NULL){
if((★p=del_list(deldata)★) ==NULL)
printf("未発見\n");
else
printf("%p番地のノードを削除\n",p);
}
printf("***リストの内容***\n");
list_out(head);
}
void list_out(NODE *p)
{
while(p != NULL){
printf("%p番地:%s\n",p,p->name);
p=p->next;
0386デフォルトの名無しさん
2005/07/09(土) 19:59:56/*ポイントのつなぎ替え*/
new->next= p;
back->next=new;
}
}
NODE *del_list(NODE deldata)
{
NODE *p,*back;
if★(head == NULL)★return NULL;//リストが空なら、NULLを戻す
if★(strcmp(deldata.name,head->name)){★//リストの先頭なら
/*ポインタのつなぎ換え*/
back = head;
★head = head->next;★
return ★head;★
}
else{
p=head;//削除するノードを探す
while(★p != NULL && strcmp(deldata.name,p->name) >= 0★){
back=p;
p=p->next;
}
/*pポインタの繋ぎ換え*/
if(p != NULL)★head->next= p;★
return p;
}
}
0387デフォルトの名無しさん
2005/07/09(土) 20:19:44sleep(10);
kill(pid[i], SIGTERM);
waitpid(pid[i], &status, 0);
}
これだと10秒毎にpid[i]が終了されるのですが,
10秒でpid[1]からpid[5]を一度に終わらせるにはどうすればいいのでしょうか?
vine linuxで gccです
0388デフォルトの名無しさん
2005/07/09(土) 20:20:44ある本には最初にmain関数がありその下にint date(int x)とありますが、ある本には
int date(int x)の下にmain関数があります。プログラムは答えが出れば正解らしいですが
一般的にはmain関数は上にあるのでしょうか、下にあるのでしょうか。
0389デフォルトの名無しさん
2005/07/09(土) 20:21:19for(i = 1; i <= 5; i++){
kill(pid[i], SIGTERM);
waitpid(pid[i], &status, 0);
}
0390デフォルトの名無しさん
2005/07/09(土) 20:23:06下じゃないとプロトタイプ宣言がひつよう
上に書く場合でもプロトタイプ宣言がその上に必要
0391デフォルトの名無しさん
2005/07/09(土) 20:24:40ベテランは下に書く。
0392デフォルトの名無しさん
2005/07/09(土) 20:25:45関数を書く順番は任意。好きにすればいい。
ただし、関数を呼び出すためにはその関数のプロトタイプを知る必要がある。
関数コールするよりも前(上)に関数定義があれば、その定義から関数仕様は明確になるが、
関数コールよりも後(下)に関数定義がある場合、その関数が見えていないので、引数や戻り値の方が不明になる。
こういう場合は、関数コールする位置よりも前にプロトタイプ宣言を書けば、コールできる。
0393デフォルトの名無しさん
2005/07/09(土) 20:27:530394384
2005/07/09(土) 20:31:030395デフォルトの名無しさん
2005/07/09(土) 20:32:140396デフォルトの名無しさん
2005/07/09(土) 20:32:58Cではできない。
0397デフォルトの名無しさん
2005/07/09(土) 20:40:42ちょっと変えるだけでよかったんですねorz
ありがとうございました。
0399デフォルトの名無しさん
2005/07/09(土) 21:03:45Display *display の指している先の構造体かなんかの中身を書き換えることは出来るが、
displayの値そのものを書き換えることは出来ない。
0400デフォルトの名無しさん
2005/07/09(土) 21:04:50ポインタのポインタじゃだめ?
0401デフォルトの名無しさん
2005/07/09(土) 21:10:48(すみません。もっと勉強します。)にベテランじゃないので上書くことにしておきます。
!!!
愛用の本である解きながら学ぶC言語という本はベテラン志向でした。。
まあ両方ともやってみますね。本当にありがとうございました。
0402デフォルトの名無しさん
2005/07/09(土) 21:12:390403384
2005/07/09(土) 21:16:56Display型はWindowのポインタを入れる型です
void hoge(Display *display){
display = XOpenDisplay( NULL);
}
main(){
Display *display;
hoge( display);
}
だと、hogeで格納してもmainにかえってきたときに変更されていません
0404デフォルトの名無しさん
2005/07/09(土) 21:20:56素直に
Display *hoge() {
return XOpenDisplay(NULL);
}
main() {
Display *display = hoge();
}
じゃ駄目なんか?
0405デフォルトの名無しさん
2005/07/09(土) 21:22:290407デフォルトの名無しさん
2005/07/09(土) 21:24:14Display *hoge() {
//他の処理いろいろ
return XOpenDisplay(NULL);
}
main() {
Display *display = hoge();
}
0408デフォルトの名無しさん
2005/07/09(土) 21:25:17Display *hoge() {
Display * pDsp = XOpenDisplay(NULL);
//他の処理いろいろ
return pDsp;
}
main() {
Display *display = hoge();
}
0409デフォルトの名無しさん
2005/07/09(土) 21:26:32Display *d = *display;
// いろいろ処理
}
main() {
Display *display;
hoge(&display);
}
0410409
2005/07/09(土) 21:27:45void hoge(Display **display) {
Display *d = *display;
d = XOpenDisplay(NULL);
// いろいろ処理
}
main() {
Display *display;
hoge(&display);
}
0411デフォルトの名無しさん
2005/07/09(土) 21:30:55ローカル変数いらないジャン
0412デフォルトの名無しさん
2005/07/09(土) 21:39:240413デフォルトの名無しさん
2005/07/09(土) 21:49:25>>410
* display = XOpenDisplay(NULL);
0414デフォルトの名無しさん
2005/07/09(土) 21:50:01char hoge[256];
while(gets(hoge) !=NULL); が無限ループになっちゃうのは自分の環境の所為nano?
0415デフォルトの名無しさん
2005/07/09(土) 21:51:38にしとけ
0416デフォルトの名無しさん
2005/07/09(土) 21:51:470417デフォルトの名無しさん
2005/07/09(土) 21:52:05だった
0418デフォルトの名無しさん
2005/07/09(土) 21:54:40無限ループになったと判断した根拠は?
ただ単に、入力を終えたつもりになっているだけなら以下の点について調べよ。
・リダイレクトでファイルを入力しても無限ループになるか。
・端末エミュレータで入力のクローズは行なえているのか。
#一般的にUnixなら^D、DOS系なら^Z
0419384
2005/07/09(土) 21:57:09どれをやってもうまくいかないです・・・
0420414
2005/07/09(土) 22:04:16レベル低い自分はスルーで、以下何事もなかったかのように(ry
↓
0421デフォルトの名無しさん
2005/07/09(土) 22:33:07void f(Display **);
f(&display);
こうでもだめか?
0422デフォルトの名無しさん
2005/07/09(土) 22:36:24他のとこでミスってるとか、ミスってると思い込んでいるとか。
0423デフォルトの名無しさん
2005/07/09(土) 22:38:420424デフォルトの名無しさん
2005/07/09(土) 22:38:570425384
2005/07/09(土) 22:39:41printf("%p\n", display);
display = XOpenDisplay( NULL);
printf("%p\n", display);
}
main(){
Display *display;
printf("%p\n", display);
hoge( display);
printf("%p\n", display);
}
とこのようにして、中身を確認しているのですが
display = XOpenDisplay( NULL);
の、後と前では変わるのですが hoge( display);の後ではまたもどっています
今まで教えていただいた方法を使ってやってみたのですが
変わるものはありませんでした
>>421
すいませんが、それをどうすればいいかがわかりません
どうすればいいのでしょうか?
0426デフォルトの名無しさん
2005/07/09(土) 22:40:06すでに質問されたからイイよ
0427デフォルトの名無しさん
2005/07/09(土) 22:41:42引数で渡さなくて、戻り値で返せばいい。
0428デフォルトの名無しさん
2005/07/09(土) 22:43:19「C/C++ Users Journal」って年間購読とは別に一冊買えるようなとこってないんですかね?
0429デフォルトの名無しさん
2005/07/09(土) 22:45:45ない
あきらめれ
0430デフォルトの名無しさん
2005/07/09(土) 22:46:47どうもです。
0432デフォルトの名無しさん
2005/07/09(土) 22:48:26これで確認できたよ(>>421の方法)
--------------------------------------
struct Display{
int x;
};
void f(Display** display)
{
*display = new Display;
(*display)->x = 10;
}
int main(int argc, char* argv[])
{
Display* display = NULL;
f(&display);
if(display){
printf("D:%d\n",display->x);
}
return 0;
}
0433デフォルトの名無しさん
2005/07/09(土) 22:49:55Display* hoge(void){
Display *pDisp;
printf("%p\n", display);
pDisp = XOpenDisplay( NULL);
printf("%p\n", display);
return pDisp;
}
main(){
Display *display;
printf("%p\n", display);
display = hoge();
printf("%p\n", display);
}
0434デフォルトの名無しさん
2005/07/09(土) 22:52:51intをDisplay *に読み替えれば425のコードと同じようなもんだ。
void f(int n)
{
n = 10;
}
int main()
{
int n = 0;
f(n);
printf("%d", n);
return 0;
}
0435デフォルトの名無しさん
2005/07/09(土) 22:54:120436デフォルトの名無しさん
2005/07/09(土) 23:26:20何だよ負け犬(w
0437デフォルトの名無しさん
2005/07/09(土) 23:32:20これな〜んだ?
0438デフォルトの名無しさん
2005/07/09(土) 23:51:280439デフォルトの名無しさん
2005/07/10(日) 01:08:570440デフォルトの名無しさん
2005/07/10(日) 01:32:180441384
2005/07/10(日) 01:36:33returnで返す方法以外はありませんでしょうか?
別の値を返すのにreturnは使っているのでできれば使いたくありません
0442デフォルトの名無しさん
2005/07/10(日) 01:44:41関数内でポインタに入れればよくね?
0443デフォルトの名無しさん
2005/07/10(日) 01:47:39って何個か前のは読めなかったのか?
0444デフォルトの名無しさん
2005/07/10(日) 02:14:07氏ね、バカ。
>>432がわざわざコードにまで起こしてくれてるだろうが。
自分で考える能力が無いならせめてレスくらいちゃんと確認しろ。
0445デフォルトの名無しさん
2005/07/10(日) 02:38:58最初からそういえよ。情報小出しはこっとも嫌われると言うことを理解したら、もううくるな。
0446デフォルトの名無しさん
2005/07/10(日) 02:41:37#define NINZU 10
#define KAMOKU 5
struct student
{
char name[8];
int en,ma,la,sc,so;
int sum,mean,max;
};
sub_sum(int n,struct student d[])
{
int i;
for(i=0;i<n;i++){
d[i].sum=d[i].en+d[i].ma+d[i].la+d[i].sc+d[i].so;
d[i].mean=d[i].sum/KAMOKU;
d[i].max=d[i].en;
if(d[i].max<d[i].ma) d[i].max=d[i].ma;
if(d[i].max<d[i].la) d[i].max=d[i].la;
if(d[i].max<d[i].sc) d[i].max=d[i].sc;
if(d[i].max<d[i].so) d[i].max=d[i].so;
}
}
0447デフォルトの名無しさん
2005/07/10(日) 02:41:56main()
{
int i;
struct student data[NINZU];
FILE *fp;
fp=fopen("seiseki.txt","r");
for(i=0;i<NINZU;i++)
fscanf(fp,"%s %d %d %d %d %d",
&data[i].name,&data[i].en,&data[i].ma,&data[i].la,&data[i].sc,&data
[i].so);
fclose(fp);
sub_sum(NINZU,data);
for(i=0;i<NINZU;i++)
printf("(%d) %-3s 総点:%d 平均点:%d 最高点:%d\n",
i,data[i].name,data[i].sum,data[i].mean,data[i].max);
}
上記のプログラムを、科目ごとの総点・平均点・最高点も
求めれるように改造したいのですが、どうしたら良いでしょうか?
0448デフォルトの名無しさん
2005/07/10(日) 02:42:22ちなみに「seiseki.txt」の中身は下記の通り。
A 70 56 66 45 88
B 66 85 68 55 73
C 55 65 53 67 55
D 85 72 76 58 65
E 92 70 45 73 55
F 56 57 52 62 82
G 72 62 33 85 95
H 46 95 48 72 34
I 83 42 88 92 56
J 68 65 91 82 66
0449デフォルトの名無しさん
2005/07/10(日) 02:46:480450384
2005/07/10(日) 02:52:140451384
2005/07/10(日) 02:52:50気にくわないんだったらお前が来るな
0452デフォルトの名無しさん
2005/07/10(日) 03:04:29一生小出しでふんばってろ教えて君。
0453デフォルトの名無しさん
2005/07/10(日) 03:07:240454デフォルトの名無しさん
2005/07/10(日) 04:47:14Cで数値計算をしているのですが、2台のパソコンで
同じプログラムを走らせたところ
パソコンA:最後まで計算できるが、gdbである変数を
printコマンドで見ようとするとセグメントエラー
パソコンB:特定の場所でセグメントエラー、挙動もおかしい
その場所は、ある関数内で、
{
計算
printf("計算結果");
printf("バグ取り");
}
このprintとfprintfの間でセグメントエラーを吐きます。
しかも「計算結果」を表示した後、2秒位たって、「バグ取り」を
表示せずに落ちてしまいます。
まったく原因が分からず困っています。よろしくお願いします。
0455デフォルトの名無しさん
2005/07/10(日) 04:51:20ここはそういう質問をするスレじゃないんだ
0456デフォルトの名無しさん
2005/07/10(日) 04:56:54近い将来は大人まで・・・
0457デフォルトの名無しさん
2005/07/10(日) 05:45:21とりあえずどっかのメモリを破壊してる可能性が高い。
0458デフォルトの名無しさん
2005/07/10(日) 06:03:390459デフォルトの名無しさん
2005/07/10(日) 06:05:490460デフォルトの名無しさん
2005/07/10(日) 06:11:410462デフォルトの名無しさん
2005/07/10(日) 12:40:430464デフォルトの名無しさん
2005/07/10(日) 13:06:21#include <stdio.h>
void main()
{
int val;
val = 5;
printf( "今、変数の中身は、%dです\n", val );
val = val + 1;
printf( "今、変数の中身は、%dです\n", val );
val ++;
printf( "今、変数の中身は、%dです\n", val );
}
というプログラムを組んでコンパイルしたのですが、
エラー E2048 test_3.c 1: 認識できないプリプロセッサ指令: 'inclube'
警告 W8065 test_3.c 9: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
警告 W8065 test_3.c 13: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
警告 W8065 test_3.c 17: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
*** 1 errors in Compile ***
というエラーが出ます、どこがおかしいのでしょうか?
0465デフォルトの名無しさん
2005/07/10(日) 13:08:44printf( "今、変数の中身は、%dです\n", val );
val = val + 1;
printf( "今、変数の中身は、%dです\n", val );
0466デフォルトの名無しさん
2005/07/10(日) 13:11:27>エラー E2048 test_3.c 1: 認識できないプリプロセッサ指令: 'inclube'
(・3・) エェー
0467デフォルトの名無しさん
2005/07/10(日) 13:11:36inclube
0468464
2005/07/10(日) 13:15:08すいませんでした。
0469デフォルトの名無しさん
2005/07/10(日) 13:15:190470デフォルトの名無しさん
2005/07/10(日) 13:16:51煽ってんじゃねえよクソッタレ!
0471デフォルトの名無しさん
2005/07/10(日) 13:21:050472デフォルトの名無しさん
2005/07/10(日) 14:03:210473デフォルトの名無しさん
2005/07/10(日) 14:25:27くせぇな
屁こいてんじゃねえぞコラ!
0474デフォルトの名無しさん
2005/07/10(日) 16:01:491秒ごとにsleepでカウントしていって、
count1とcount2が両方10になったら終了する。という
ソースを作りたいのですが、
for( count1=1; ; count1++){
for( count2=1; ★;count2++){
sleep( 1 );
printf("count1=%d\n", count1);
printf("count2=%d\n", count2);
}
if( count1==10 && count2==10){
break;
}
という風に、for2重ループで作ってみたのですが、
この場合は★になんと宣言したらいいでしょうか?
forループの2重目は毎回脱出する…という風にしたいのです。
よろしくお願いします。
0475デフォルトの名無しさん
2005/07/10(日) 16:03:530476デフォルトの名無しさん
2005/07/10(日) 16:13:30毎回抜けたいなら、0 を書くといい
0477474
2005/07/10(日) 16:17:38ありがとうございます!
毎回脱出は0なんですね…知らなかった…
0478デフォルトの名無しさん
2005/07/10(日) 16:35:08ねぇねぇ、おかしいと思わない?
0479デフォルトの名無しさん
2005/07/10(日) 16:39:040480デフォルトの名無しさん
2005/07/10(日) 16:40:34叙述トリック
0481デフォルトの名無しさん
2005/07/10(日) 16:55:15よろしくお願いします。
0482デフォルトの名無しさん
2005/07/10(日) 17:01:30ちゃんとその本読んで、明解に解けるようにせれ。
そうでもなければ冥界送り。
というか、そんな本持ってる人限定で質問する時点で冥界だ。
0483デフォルトの名無しさん
2005/07/10(日) 20:01:13for (int i=0 ; i<strlen(str) ; i++ )
文字列 str の長さを変えない処理;
という書き方は、一般的には毎回 strlen を呼ぶので遅いが、
どこぞの処理系では一度しか呼ばないように最適化する、という
話があったようななかったような気がするんですが、どなたか
ご存知でしょうか。
0484デフォルトの名無しさん
2005/07/10(日) 20:08:560485デフォルトの名無しさん
2005/07/10(日) 20:10:120486デフォルトの名無しさん
2005/07/10(日) 20:12:08今手元のgcc(3.3.3 cygwin special)で試したら、strが固定長であることが明らかなときのみstrlen()が省略された。
つまり、
int main()
{
int i;
char str[] = "Whee!";
for (i = 0; i < strlen(str); ++i) {
printf("%c", str[i]);
}
return 0;
}
のような場合。
しかし、char *str = argv[0]; としたら毎回strlen()を呼び出していた。
0487デフォルトの名無しさん
2005/07/10(日) 20:14:06このスレッドの名前を読んでみ
「忘れた会話を思い出すための質問スレッド」
ってかいてあっか?
0488デフォルトの名無しさん
2005/07/10(日) 20:15:370489483
2005/07/10(日) 20:19:01「忘れた会話を思い出すための質問スレッド」
を立ててからにしろ。な?
>>486
ありがとう。さらに調べてみたら、gcc-3.3.3 で -O つければ
argv でも strlen は呼ばず、自前で 0 かどうかの比較だけやってた。
-fno-builtin を付けたら strlen 呼んでくれたよ。
gcc がそういう処理系だったんだね。
0490デフォルトの名無しさん
2005/07/10(日) 20:20:400491デフォルトの名無しさん
2005/07/10(日) 20:22:29現実じゃ、ものすっごい下手でさ
そんなやつでもこんな発言んができるって恐いね
0492483
2005/07/10(日) 20:25:23今度来るときは句点打てるようになってるんだぞ。
0493デフォルトの名無しさん
2005/07/10(日) 20:26:10それくらいの寛大さと融通は効いても毒ではないだろう。
逆に噛み付いて荒れるよりは遥かにいい。
0494デフォルトの名無しさん
2005/07/10(日) 20:26:520495デフォルトの名無しさん
2005/07/10(日) 20:27:390496デフォルトの名無しさん
2005/07/10(日) 20:28:21日本語を指摘を捨て台詞にする奴はい
やな奴にしか見えない。
0497デフォルトの名無しさん
2005/07/10(日) 20:28:36帰るのは君では?
0498デフォルトの名無しさん
2005/07/10(日) 20:29:53たいした技術の話も出来ないくせに、やたらと「日本語大丈夫〜?」
とか言って新人君に苦笑されている奴。
0499デフォルトの名無しさん
2005/07/10(日) 20:31:54放っといてあげなさい
0500デフォルトの名無しさん
2005/07/10(日) 20:31:59とりあえずドキュメント読め。
0501デフォルトの名無しさん
2005/07/10(日) 20:35:05以前の会話で出てきた処理系がgccであるとは限らないと思うのだが。
0502デフォルトの名無しさん
2005/07/10(日) 20:35:34こういう必死君は今に暴れ出すぞ
0504デフォルトの名無しさん
2005/07/10(日) 21:39:14void main(void)
{
typedef struct {
char str1;
int digit1;
double dot1;
} TEST1;
typedef union {
char str2;
int digit2;
double dot2;
} TEST2;
TEST1 s;
TEST2 u;
char str;
int digit;
double dot;
printf("ref:%d\nstruct:%d\nunion:%d\n",sizeof(str)+sizeof(digit)+sizeof(dot),sizeof(s),sizeof(u));
0505デフォルトの名無しさん
2005/07/10(日) 21:44:100506デフォルトの名無しさん
2005/07/10(日) 21:44:54structには境界調整を合わせるための隙間が入っている。
合っていないとメモリアクセスに余計な時間がかかったり、下手すると落ちる環境も存在する。
あと、sizeofには括弧でくくれば型名も直接指定できる。
0507デフォルトの名無しさん
2005/07/10(日) 21:57:15すいません。
検索が下手なので有用な情報が得られませんでした。
>>506
ありがとうございます。納得しました。
sizeofの使い方についても勉強になりました。
0508デフォルトの名無しさん
2005/07/10(日) 22:09:110509デフォルトの名無しさん
2005/07/10(日) 22:15:50あまりにも痛々しくて可哀想だからだまってたのに
0510デフォルトの名無しさん
2005/07/10(日) 22:22:392chで「通りすがり」って言ってる時点で以下略
0511デフォルトの名無しさん
2005/07/10(日) 22:52:520512デフォルトの名無しさん
2005/07/10(日) 23:07:550513デフォルトの名無しさん
2005/07/10(日) 23:13:380514デフォルトの名無しさん
2005/07/10(日) 23:15:40激しくワロタ
0515デフォルトの名無しさん
2005/07/11(月) 00:31:05そうだよね。はやくID制にならないかな。
0516デフォルトの名無しさん
2005/07/11(月) 00:36:17たまにある自作自演は2ch名物みたいなもんだし。
0517デフォルトの名無しさん
2005/07/11(月) 00:38:23下手にID制になって自作自演が見れなくなるのもさびしいしな。
0518デフォルトの名無しさん
2005/07/11(月) 00:38:40ID制賛成だな。
0519デフォルトの名無しさん
2005/07/11(月) 01:07:46今まで、まじめに答えてたのに...
0520デフォルトの名無しさん
2005/07/11(月) 02:03:33puts("その数は0です。");
else if(no > 0)
puts("その数は正です。");
else
puts("その数は負です。");
これの最後のelse を else if( no < 0)にしても大丈夫ですか?
0521デフォルトの名無しさん
2005/07/11(月) 02:09:28どうぞ。
0522デフォルトで名無しさん
NGNGお勧めなのあったらおせーて
0523デフォルトの名無しさん
2005/07/11(月) 02:33:37char *file;
load(file);
}
load(char *file){
file = malloc(file_status.st_size);
fp = fopen( file_name, "r");
fread( file_data, file_status.st_size, 1, fp);
}
と言う処理では、load関数が終わった時点で中身がおかしくなっています(Segmentation fault (core dumped))
ファイルネームとファイルステータスの処理は割愛しています
mallocの処理が問題だと思うのですがどのようにしたら対処できるでしょうか?
0524デフォルトの名無しさん
2005/07/11(月) 02:34:35おまえが本屋にいって適当に何冊か見てみて
これだったら最後迄ようめそうだと思った本
0525デフォルトで名無しさん
NGNGそっか
了解>524
0526デフォルトの名無しさん
2005/07/11(月) 02:44:50fopenに失敗しているかもしれない。
mallocに失敗してるかもしれない。
いきなり出てきたfile_dataってなに?
mallocで確保した領域はmainでは使えないけどいいの?
0527デフォルトの名無しさん
2005/07/11(月) 02:51:46どうぞって大丈夫って意味ですか?
0528523
2005/07/11(月) 02:57:36file_dataはfileの間違いです
割愛していますが、fopenとmallocのエラー処理はしています
>mallocで確保した領域はmainでは使えないけどいいの?
これがどうしてもわからないのですが、どうしてなのでしょうか?
実際には、mainで使えるようにしたいです
すいませんが教えていただけると助かります
0529デフォルトの名無しさん
2005/07/11(月) 02:57:54>>521 じゃないけど、大丈夫ってことだよ。
ちょっと特殊な場合では大丈夫じゃないかもしれないけど。
ちなみに、なんでそうしたいの?
0530デフォルトの名無しさん
2005/07/11(月) 02:58:43どうしてそんな無駄なことをしたがるの?
0531527
2005/07/11(月) 03:04:20高校数学の影響ですかね・・・
0532デフォルトの名無しさん
2005/07/11(月) 03:06:22算数で止まってるひとなら「やっとかないとまずくない?」って思うかもしれないけど
0533デフォルトの名無しさん
2005/07/11(月) 03:06:54その他どんな場合があるというんだ?
0534デフォルトの名無しさん
2005/07/11(月) 03:07:23場合分けなら、正か負かそれ以外でしょ
0535デフォルトの名無しさん
2005/07/11(月) 03:08:22んなこと忘れたよ
0536デフォルトの名無しさん
2005/07/11(月) 03:08:240537デフォルトの名無しさん
2005/07/11(月) 03:12:09noって型は何?
独自定義w
0538デフォルトの名無しさん
2005/07/11(月) 03:12:39load(char** file)
詳細はこのスレか前スレでdisplayがどうとかいう議論があったと思うのでそれ参照。
0539デフォルトの名無しさん
2005/07/11(月) 03:13:54煽るようで悪いけど、基本がわかって無いと思われ
変数の有効範囲と関数の戻り値に付いて調べてみたら?
この辺きちっと押さえておかないと、なんとなく動くようになっても
メモリリークしまくるようなプログラムにしかならないと思う
0540デフォルトの名無しさん
2005/07/11(月) 03:18:21それだと呼んでる方と呼ばれたほうで型違いになるでしょ
0541デフォルトの名無しさん
2005/07/11(月) 03:36:53----
#include <stdio.h>
#define SIZE 123 /* 適当 */
#define file_name "hoge.txt" /* 適当 */
extern char* load(void);
int main(void) {
char* file = load();
/* Segmentation fault の在った位置 */
return 0;
}
char* load(void) {
char* file = malloc(SIZE);
FILE* fp = fopen(file_name, "r");
fread(file, SIZE, 1, fp);
return file;
}
0542541
2005/07/11(月) 03:38:420543デフォルトの名無しさん
2005/07/11(月) 03:43:41変数宣言と関数の呼出と受取でどうにかすべし
returnで値を渡すなんて言語道断
0544デフォルトの名無しさん
2005/07/11(月) 03:47:09割愛してるっていってるんだから実際はもっと処理をしてるんだろ
それを根本的に作りなおさせるのはどうかと
0545デフォルトの名無しさん
2005/07/11(月) 03:48:22こうするといくらかマシな気分になったりする?
if(no == 0) {
puts("その数は0です。");
}
else {
if(no > 0) {
puts("その数は正です。");
}
else {
puts("その数は負です。");
}
}
ちなみにこのケースだと、ゼロの時には判定が一回、それ以外は二回になるわけだ。
もしあらかじめ no の取る値が、ゼロと正負で確率的に偏ることがわかっているならば、最も高い確率の値の判定の時に
一回で済むように構成すると、ちょっぴり処理効率がいいよ。
0547デフォルトの名無しさん
2005/07/11(月) 04:12:37三項演算子使いたくなってくる
0548デフォルトの名無しさん
2005/07/11(月) 04:14:230549デフォルトの名無しさん
2005/07/11(月) 04:21:390550デフォルトの名無しさん
2005/07/11(月) 04:36:25おれは
else /* if(no<0) */
的なことを書くことがある。「その他の場合」と「つまりno<0なら」を両方言いたいとき。
こんなのは文芸の世界だと思うけどね。
必要なことしか書いてない無口なプログラムのほうがかっこいいんだけど
ついついよけいなことを言いたくなる。
0551デフォルトの名無しさん
2005/07/11(月) 04:44:49無駄なif文増やすな。
>>550
無駄なコメント書くな。
0552デフォルトの名無しさん
2005/07/11(月) 04:57:00俺も以前はそうだったが、最近は if-else if-else の行数を短くして、
コメントしないようにしている。
後は、保守する側の責任ってことで。
>>551
理由も書かんと、分からんがな。
0553デフォルトの名無しさん
2005/07/11(月) 09:38:35そのくらいは自明だけど、とり得る値が x==a , x==bの限定的な場合だったら、
if(x==a){
} else /*if(x==b)*/{
}
ってやるよ。整数の範囲という普遍性のあるものではなくて、
人為的な条件だからこうした方が後々無難。条件が増える
場合もあるし、コーディングを増設するときのガイドにもなって
作業効率が上がる
0554デフォルトの名無しさん
2005/07/11(月) 09:42:59>もしあらかじめ no の取る値が、ゼロと正負で確率的に偏ることがわかっているならば、
最近はガイドオプティマイズというのもあるね。
テストプレーしなきゃいけないのが面倒だが、手作業では
とても無理な大量の条件の偏りを調べて判定順序を入れ
替えてくれる。
マジで性能アップするよ>VS2005のPGO最適化
0555デフォルトの名無しさん
2005/07/11(月) 09:55:28その場合に限って言うなら、
switch (x) {
case a:
...;
break;
case b:
default:
...;
break;
}
とでもしておく方が保守性は高いんジャマイカ。
0556デフォルトの名無しさん
2005/07/11(月) 10:20:04例が簡略すぎたか
条件が==とは限らない。strcmpだったり範囲c<=x<dだったり
と、caseでは対応できないケースも多々あり
0557527
2005/07/11(月) 10:21:000558デフォルトの名無しさん
2005/07/11(月) 10:22:07ビットシフトはなんの役に立つのでしょうか?
0559デフォルトの名無しさん
2005/07/11(月) 10:32:33符号を拡張するのに使う。たとえば、
符号付12ビット数とかが必要なときに
signed int に取り合えずぶちこんで
a << 20 >> 20 とかやると符号が復活
0560デフォルトの名無しさん
2005/07/11(月) 10:37:36書き方は2ch的っつーかあれだけど、決して難しいことは書いてない。
今の527さんのレベルだとmallocは早いんじゃないか? おそらく
ポインタやメモリの概念も理解して無い感じだし。
まず大き目の固定バッファに読み込んで、処理内容を自分の
思い通りに書ける様になってから、その過程で固定バッファ
では限界だと自然に思うようになったら、メモリ動的確保を勉強
すればいいと思う。
それまでには変数スコープや戻り値に関しても身に付いてると思われ。
0561デフォルトの名無しさん
2005/07/11(月) 10:42:06もっと簡単な例だと、
2倍4倍8倍16倍したいとき
1/2倍1/4倍1/8倍1/16倍したいとき
というか、この機能があるから何かに使いたい、は逆。
これこれこうしたいけど、どういう機能を組み合わせるのか、でしょ。
それともテストの問題か? ビットシフトの用例を上げよ、みたいな
0562デフォルトの名無しさん
2005/07/11(月) 10:45:16漏れの場合は
if(x==a){
} else if(x==b) {
} else {
assert(0);
}
ってするな。
前提条件が成立してることは信用しない。
0563デフォルトの名無しさん
2005/07/11(月) 10:51:05否定はせんけど、パフォーマンスを重視したい場合もある
0564デフォルトの名無しさん
2005/07/11(月) 10:58:01assert絡みは最適化スイッチをONにすると
消えるから、最適化かかってパフォーマンスも
>>553とまったく同じになるということは期待しても
問題ないレベルだと思う
0565デフォルトの名無しさん
2005/07/11(月) 11:18:12} else if(x==b) {
があっても?
0566デフォルトの名無しさん
2005/07/11(月) 11:30:33パフォーマンスを考えるなら、
} else {
assert(x==b); ...
0567デフォルトの名無しさん
2005/07/11(月) 11:50:53int *p;
p = new int;
p[3]=???
0568デフォルトの名無しさん
2005/07/11(月) 11:53:27了解。
でも、前提条件が成立してることは信用できないケースだと、
リリースビルドでその判定を取っちゃってもいいのかな?
話がそれてきたけどw
0569デフォルトの名無しさん
2005/07/11(月) 11:54:24その書き方だと吹き飛ぶ
0570デフォルトの名無しさん
2005/07/11(月) 11:56:47いらないことしてすまんかった。
どうすれば吹き飛ばない?
0571デフォルトの名無しさん
2005/07/11(月) 12:01:240572デフォルトの名無しさん
2005/07/11(月) 12:02:15> p[3]
*(p+3)と同義
0573デフォルトの名無しさん
2005/07/11(月) 12:08:12参考までに。
char str[] = "abc"
str[0] == *(str + 0) == *(0 + str) == 0[str] == 'a'
0574デフォルトの名無しさん
2005/07/11(月) 12:08:53即時的な解決なら
p = new int[4];
p[3]=???
で済むけど、どうしてこうなるのかは理解した方がいいと思うよ。
質問からは、アドレスやメモリの概念がつかめて無い感じを受ける
0575デフォルトの名無しさん
2005/07/11(月) 12:21:15>572の答えが知りたかったです。助かった。
0576デフォルトの名無しさん
2005/07/11(月) 12:21:380577デフォルトの名無しさん
2005/07/11(月) 12:25:08解決したようだけど一応指摘
>ポインタの指すメモリからの配列になるんじゃないっけ?
ポインタの指す先のことなど考えずに配列としてアクセスする、が正確
先がNULLだったり領域外だったら当然吹き飛ぶよ
0578デフォルトの名無しさん
2005/07/11(月) 12:32:01int x[3];
int *p;
p = x; /* p[1] == x[1] */
ってこと?
0579デフォルトの名無しさん
2005/07/11(月) 12:42:24それだと負数を2の補数で表現し、なおかつ算術シフトする処理系じゃないと復活しない。
a | -1U << 12
の方が確実
0580デフォルトの名無しさん
2005/07/11(月) 12:46:43その場合はxが有効な期間内なら問題ないです
0581デフォルトの名無しさん
2005/07/11(月) 12:49:40よく検証したわけじゃないんだけど、それだとaが+でも上が
埋められないか?
0582デフォルトの名無しさん
2005/07/11(月) 12:57:13> p = x; /* p[1] == x[1] */
違う。
p= x; /* p = &(x[0]);*/
0583デフォルトの名無しさん
2005/07/11(月) 12:59:45それが>>578の望んでる答えかぁ?
0584デフォルトの名無しさん
2005/07/11(月) 12:59:47入門編の本のまだ最初の部分ですorz
0585デフォルトの名無しさん
2005/07/11(月) 13:06:15学生?
ガンガレ
今のうちにいじり倒してプログラムが何たるものか肌で理解しとくといいよ
入門編の本のとおりにやったら動くと思うから、どうしてそう書かないと
いけないのか考えてみるといい。で、自分の動かないプログラムと
どこが違うのか検討汁
0587デフォルトの名無しさん
2005/07/11(月) 13:22:58うん
0588デフォルトの名無しさん
2005/07/11(月) 13:28:56信用できないなら取っちゃだめだと思う。
「信用できない」がプログラマの勘違いなら、コンパイラが最適化して取ってくれると思う。
ま、>>562でも同じことがいえそうだけど。
0589デフォルトの名無しさん
2005/07/11(月) 14:18:29?
書かれた有意なコードをコンパイラは取らないでしょ。人間が見て
不要と思われるものもコンパイラには判断付かないから
0590デフォルトの名無しさん
2005/07/11(月) 14:21:10横から首突っ込むけど、
assert はりリースビルドの時に取り除かれるから、
それに繋がる if も最適化されて消滅する、っていう話ではなかったの?
0591デフォルトの名無しさん
2005/07/11(月) 14:27:44たぶん>>562の場合は最後のelse節は消えるけど、} else if(x==b) {
は消えない。結論は>>566で出ているけど、すでに話は違っている模様
0592デフォルトの名無しさん
2005/07/11(月) 14:38:11「人間が見て不要と思われるもの」の指してるものが曖昧で良くわからんが、
翻訳単位全体を見た上で論理的に明らかに不要なものを消すぐらいのことは今の技術で十分可能。
可能だからって実際に実装してるとは限らんが、そういうのもあるんじゃないの?
と、微妙にトーンダウンするおれガイル。
0593デフォルトの名無しさん
2005/07/11(月) 14:55:15確かにトーンダウン(^^;)
目の前で話したらまた違うだろうけど、あまり有意な話でも
無くなりつつあるし、この辺で御開きに
0594デフォルトの名無しさん
2005/07/11(月) 14:55:37信用できる値が渡されるかどうかまでコンパイラはチェックできないんじゃ?
0595523
2005/07/11(月) 15:06:590596デフォルトの名無しさん
2005/07/11(月) 15:10:410597デフォルトの名無しさん
2005/07/11(月) 15:16:41まったくもってこれの意味がわからないんですけど解説していただけませんか?
0598デフォルトの名無しさん
2005/07/11(月) 15:20:38コンパイラが(性能上の問題でなく)原理的にチェックできないようなケースでは
assertを消すのもまずいんじゃない?
0599デフォルトの名無しさん
2005/07/11(月) 15:30:49pf is array[0..9] of pointer to function(int, pointer to function(pointer to char) returning void) returning int.
0600デフォルトの名無しさん
2005/07/11(月) 15:30:59pfは、「引数が2つ(※)で戻り値がint型の関数」へのポインタで、配列宣言されている。
(※)2つの引数
・int型
・引数char*型で、戻り値無しの関数へのポインタ
0601デフォルトの名無しさん
2005/07/11(月) 16:01:24まず、関数はわかるか?そりゃわかるか。
関数ポインタはわかるか?
#include <stdio.h>
int main(void) {
int (*f)(const char *, ...) = printf;
f("Hello World.\n");
return 0;
}
なんてポインタ変数を使って関数を呼び出したりできる。
あとは自分で考えるなり調べるなりすれば、わかると思う。
0602デフォルトの名無しさん
2005/07/11(月) 16:13:04俺にもわかるように説明しろよ
0603デフォルトの名無しさん
2005/07/11(月) 16:27:20仕方ないな。みんな答えないみたいだから、オレが。
ファイルを"r"で開いてるだろ。それをfreadで読んだら
ファイルのサイズより若干多く読み込まれることがある。
(改行を変換して読み込むから)
mallocは正味のサイズしか確保されていないから、増えた分で
バッファオーバー起こして吹き飛んでんじゃねーの?
0604デフォルトの名無しさん
2005/07/11(月) 16:28:29終了を宣言するまで繰り返し実行させたい場合は、どうしたらいいんでしょうか。
一応5回繰り返すことになってるんですが。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int i,m,e,w[3]={0},j;
char h[][9] = {"グー","チョキ","パー","勝ち","負け","あいこ"};
srand((unsigned)time(0));
for(i=0;i<5;i++){
printf("%s:0 %s:1 %s:2\n",h,h+1,h+2);scanf("%d",&m);
++w[j=(m==(e=(double)rand()/RAND_MAX*3)?2:(m+1)%3==e?0:1)];
printf("YOU:%s,PC:%s,%s\n\n",h+m,h+e,h+j+3);
}
printf("%s:%d,%s:%d,%s:%d,勝率:%d%%",h+3,*w,h+4,w[1],h+5,w[2],*w*100/5);
}
0605デフォルトの名無しさん
2005/07/11(月) 16:34:09自分で作ったの?
0606デフォルトの名無しさん
2005/07/11(月) 16:35:22for(i=0;i<5;i++) → for(;;)
にしてみな。無限回繰り返すから。
あとは終了条件でbreakすればいい。
0607デフォルトの名無しさん
2005/07/11(月) 17:20:32入力した数字(最大8行)を、「*」を用いて花文字で表示するプログラム
(例)数字を入力してください:56
***** *****
* *
***** *****
* * *
***** *****
0608デフォルトの名無しさん
2005/07/11(月) 17:21:280609デフォルトの名無しさん
2005/07/11(月) 17:25:08何がわからないのか、具体的に。
# 全部はなしだぞ。
0610デフォルトの名無しさん
2005/07/11(月) 17:25:44> ファイルを"r"で開いてるだろ。それをfreadで読んだら
> ファイルのサイズより若干多く読み込まれることがある。
もしかして、本気でそう思ってる?
0611デフォルトの名無しさん
2005/07/11(月) 17:44:02ちがうのか? それ以外の理由があったらご教示お願い
0612デフォルトの名無しさん
2005/07/11(月) 17:49:47Cでは改行の内部表現は常に'\n'1文字。
どうやっても外部表現だってそれより短くはできないだろ。
0613デフォルトの名無しさん
2005/07/11(月) 17:50:45fread()の件に関しては、ファイルサイズより若干余計に*読むことができる*が、
決してパラメータで渡したよりも余計に*読み込む*訳ではない。
>523は別の原因だろ。
0614デフォルトの名無しさん
2005/07/11(月) 17:52:390615デフォルトの名無しさん
2005/07/11(月) 17:53:240616デフォルトの名無しさん
2005/07/11(月) 17:54:47読み込みの改行変換でサイズが増える環境は現存しない。
>>523に対して解決策が示されていないのは、挙げてあるコード
だけでは情報量が少なくてどこが間違っているのかわからないから。
0617デフォルトの名無しさん
2005/07/11(月) 17:56:00了解、俺の間違いスマソ
0618デフォルトの名無しさん
2005/07/11(月) 17:59:410619デフォルトの名無しさん
2005/07/11(月) 18:00:38http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/698.txt
0620デフォルトの名無しさん
2005/07/11(月) 18:05:120621デフォルトの名無しさん
2005/07/11(月) 18:28:27出力先っつーかまあ大体はターミナルがそう変換してる
だから\r\nとかきちんと書かないとダメなパターンも
それなりにある
0622607
2005/07/11(月) 18:42:450623デフォルトの名無しさん
2005/07/11(月) 18:44:090624デフォルトの名無しさん
2005/07/11(月) 18:44:16おまえのきれいなコードとやらを書いてくれよ
0625デフォルトの名無しさん
2005/07/11(月) 18:44:49スレ違い
0626デフォルトの名無しさん
2005/07/11(月) 18:48:160627デフォルトの名無しさん
2005/07/11(月) 19:39:160628デフォルトの名無しさん
2005/07/11(月) 21:25:50FILE *fp;
fp=fopen("c:/data.txt","w");
if(fp==NULL){
printf("open error");
exit(0);
}
ここの部分でたとえばファイル名をdata1.txt/data2.txt/data3.txt・・・と自動で変化させることはできますか?
0629デフォルトの名無しさん
2005/07/11(月) 21:26:51できる。
文字列定数じゃなくて、文字列配列で、sprintfとかつかえばよろし。
0630628
2005/07/11(月) 21:29:41もしよろしければ文例など教えてもらえませんか?
0631デフォルトの名無しさん
2005/07/11(月) 21:33:58直書きだが。
char filename[64];
FILE *fp;
int i;
for (i = 0; i < 10; i++) {
sprintf(filename, "c:\\data%d.txt", i);
fp = fopen(filename, "w");
....
}
0632628
2005/07/11(月) 21:40:14後だしで申し訳ないんですが、実行毎に名前が変わってほしいのが目的なんですがぁ・・・
>>631
だとファイル呼び出しの度に・・・ってことだと理解したんですが
なんていうか
1回目実行・・・ファイル作成した・・・終了
数値ちょっと変えてリビルドして実行・・・ファイル作成・・・終了
の時に毎回違うファイル名になるようにってことなんですが
すいませんわけわかんなくて
0633デフォルトの名無しさん
2005/07/11(月) 21:42:14それをmakefileに組み込めばできる。
けど、それを細かく説明する気は起きない。
すまんな。
0634デフォルトの名無しさん
2005/07/11(月) 21:44:24それを元に+1した数値を使えばいいんかな。
ビルド毎だとめんどいと思う。
0635デフォルトの名無しさん
2005/07/11(月) 21:44:34sprintf(filename, "c:\\data%d.txt", rand());
0636628
2005/07/11(月) 21:44:50実行・終了・ファイル作成
手動でファイル名変えておく
また実行・・・・ファイル作成
としたほうが面倒じゃないということですね
ありがとうございました
0637デフォルトの名無しさん
2005/07/11(月) 21:54:43001が存在すれば002、
002が存在すれば003
っていう風に変化させればいいじゃん。
fopenでは読み取りで開こうとしたときにファイルが存在しなければ失敗するからファイルがあるか判定できる。
0638デフォルトの名無しさん
2005/07/11(月) 21:59:470639628
2005/07/11(月) 22:00:47>>635
を少し変えて
sprintf(filename, "c:\\data%d.txt",time(NULL));
にすれば毎度違うファイルが出来るのに気づきました
0640デフォルトの名無しさん
2005/07/11(月) 22:09:24strcmpを使うようなのですが。
0641デフォルトの名無しさん
2005/07/11(月) 22:11:25宿題なら宿題スレへ
0642デフォルトの名無しさん
2005/07/11(月) 22:13:16まず、キーボードから英文を読む
この時点で英文かどうかのチェックを済ませておいたほうがいいな
つぎに、英文を単語に分割する
スペースかなんかで区切ればいいな
再利用なんか考えずに元英文は破壊してもいいよな
区切ったらポインタの配列に放り込んでいこう
その後、最初の単語から順に異なってないか調べる
もし一致してたら面倒だからその単語はぬるぽしとこう
最後に、集計結果を表示だ
0643デフォルトの名無しさん
2005/07/11(月) 23:24:120644デフォルトの名無しさん
2005/07/11(月) 23:27:400645デフォルトの名無しさん
2005/07/11(月) 23:29:560646日本道路公団
2005/07/11(月) 23:31:110647デフォルトの名無しさん
2005/07/11(月) 23:31:34C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin
0648デフォルトの名無しさん
2005/07/11(月) 23:31:44そこらへん
0649デフォルトの名無しさん
2005/07/11(月) 23:47:23へー。VCバージョン7って名前ついてんだ
0650デフォルトの名無しさん
2005/07/12(火) 00:32:020651デフォルトの名無しさん
2005/07/12(火) 00:55:00プログラムは間違っていないんですが。
0652デフォルトの名無しさん
2005/07/12(火) 00:56:32PCの修理をすれば直る。
0653デフォルトの名無しさん
2005/07/12(火) 00:56:590654651
2005/07/12(火) 01:01:080655デフォルトの名無しさん
2005/07/12(火) 01:01:32前にそのコード書いて
「OSの時刻戻されたらどうすんだよ。」と言う上司と
1時間もめたことがあるw
0656デフォルトの名無しさん
2005/07/12(火) 01:09:12プログラムが正しいと判断した理由教えて
0657デフォルトの名無しさん
2005/07/12(火) 01:10:49もちろん上司が正しかったわけだよな?
0658デフォルトの名無しさん
2005/07/12(火) 01:44:57例えば、
static double f[10][100][1000]; とか書くときです。
0659デフォルトの名無しさん
2005/07/12(火) 01:48:150660デフォルトの名無しさん
2005/07/12(火) 01:52:110661デフォルトの名無しさん
2005/07/12(火) 02:02:220662デフォルトの名無しさん
2005/07/12(火) 02:04:140663デフォルトの名無しさん
2005/07/12(火) 02:06:12{
static double f[10][100][1000];
puts("succ");
}
で文字が出たら成功でなかったら失敗。
0664デフォルトの名無しさん
2005/07/12(火) 02:06:310665デフォルトの名無しさん
2005/07/12(火) 02:08:02本当に確保できるかどうかは実行時にしかわからないだろ。
OS側の問題。
0666デフォルトの名無しさん
2005/07/12(火) 02:10:510667デフォルトの名無しさん
2005/07/12(火) 02:12:09ありがとうございます。試してみます。
>>664
コンパイラが自動でチェックしてくれるということですか?
0668デフォルトの名無しさん
2005/07/12(火) 02:14:01ごめん、>>665の言うとおり。
実行するごとに結果は変わる可能性があるよ
0669667
2005/07/12(火) 02:15:070670デフォルトの名無しさん
2005/07/12(火) 02:17:08グローバル変数とかなら、コンパイルした実行ファイルが起動できれば確保は成功してると思っていいと思う。
こういう変数の領域は、プログラム起動時からメモリ中に居座るから、もし確保できなければプログラムが起動しない。
だから、コードでそれを検出する必要は無い。
スタック上に取る auto な変数なら、その関数に入った段階でメモリ(スタック)が足りなくなれば、stack overflow で落ちる。
コードでそれを検出することはできない。
malloc 等で確保するならば、確保が失敗したら NULL が返ってくるから、それで判断できる。
ただし環境によっては、広大なメモリ領域をリクエストした段階では確保に成功したかのごとく返ってきて(アドレス空間だけ
確保する)、実際にメモリを使っていくと突然メモリが足りなくなって意図しないことが起こる、なんてこともある(Linux の
楽観的メモリ配置)。
これはコードで検出できるのかな?
0671デフォルトの名無しさん
2005/07/12(火) 02:23:34じゃあstaticしてるから検出必要なし?
0672670
2005/07/12(火) 02:25:56うん。
書き忘れたけど、static な変数もグローバルな変数と同じで、起動時に確保されちゃう(はず)。
だから、プログラムが起動できるかできないかのいづれしかないから、コードで検出する必要は無い。
0673デフォルトの名無しさん
2005/07/12(火) 02:49:070674デフォルトの名無しさん
2005/07/12(火) 02:52:250675デフォルトの名無しさん
2005/07/12(火) 03:09:20#include <limits.h>
int main(void)
{
int i = 1;
while(i < INT_MAX) {
printf("%d\n", i);
i *= 2;
}
return 0;
}
これを実行すると0がずっと表示されるのですが何故でしょうか
(i < 1073741824)までは正常に表示されるのですが
gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
0676デフォルトの名無しさん
2005/07/12(火) 03:10:33printf("%d\n", i);
に順番変えて実行してみなー
0677デフォルトの名無しさん
2005/07/12(火) 03:11:580678デフォルトの名無しさん
2005/07/12(火) 03:21:29コードで書けばいいじゃん
CPUにとってはやってるステップ数さほどかわらんよ
0679デフォルトの名無しさん
2005/07/12(火) 03:36:34calloc()使えば?
実際には実メモリ以上のメモリを確保したときに、calloc()は不利なわけだが。
0680デフォルトの名無しさん
2005/07/12(火) 03:51:21int が 32bit な環境だと、INT_MAX は 0x7fffffff = 2145483647 になる。
i*=2 を繰り返していくと、いずれ i は 0x40000000 = 1073741824 になる。
この状態でさらに i*=2 をすると、i は 0x80000000 になるが、これは符号付整数では -2147483648 になってしまう。
だから while の i < INT_MAX で終了できない。
さらに i*=2 をすると、i は 0x100000000 になり、32bit の範囲を超えてしまい、結果の下 32bit = 0x00000000 = 0 が
残り、以降 i = 0 のままループを繰り返す。
0681デフォルトの名無しさん
2005/07/12(火) 04:16:090682デフォルトの名無しさん
2005/07/12(火) 07:19:00詳しい説明ありがとうございました。
符号付整数は多分こんな感じになっているのですね。
0xffffffff = -1
0xc0000000 = -1073741824
0x80000000 = -2147483648
0x7fffffff = 2145483647
0x40000000 = 1073741824
0x00000000 = 0
それで0x80000000の2倍は0x1(00000000)で
この括弧の部分が32bit分なので0になるってことなのかな。
勉強になりました。ほかの人たちもありがとう。
0683デフォルトの名無しさん
2005/07/12(火) 10:46:41#include <stdlib.h>
#include <time.h>
double a_init(double a) {
int i;
srand(time(NULL));
a = rand();
return a;
}
double a_rms(double a) {
double s = 0.0;
s += a + a;
return (s);
}
int main() {
double x, y;
printf("X = %lf\n", a_rms(a_init(x)));
printf("Y = %lf\n", a_rms(a_init(y)));
return 0;
}
これで実行しても、同じ秒数の間に実行されちゃって、XとYの値が同じになっちゃいますよね?
どう変えたらXとYに別々の乱数を読み込めますか?
0684デフォルトの名無しさん
2005/07/12(火) 10:57:170685デフォルトの名無しさん
2005/07/12(火) 11:59:49エラー行は「void main()」です
どうしたらよいでしょうか?
0686デフォルトの名無しさん
2005/07/12(火) 12:09:460687デフォルトの名無しさん
2005/07/12(火) 12:10:570688デフォルトの名無しさん
2005/07/12(火) 12:12:03で、宣言すると なんで
warning: first argument of `main' should be `int'
って怒られんの?
引数の数なんてcharでも足りるでしょ
ちゃんとした理由知ってるひといます?
0689デフォルトの名無しさん
2005/07/12(火) 12:13:400690デフォルトの名無しさん
2005/07/12(火) 12:27:11呼ぶ側の事も考えれ
0691デフォルトの名無しさん
2005/07/12(火) 12:30:31じゃあ昔の人は何で初期化したんだよ
0692デフォルトの名無しさん
2005/07/12(火) 12:32:320693デフォルトの名無しさん
2005/07/12(火) 12:33:08マルチすなや。
0694デフォルトの名無しさん
2005/07/12(火) 12:36:31フレームカウンタとか、ユーザからの入力とか。
0695デフォルトの名無しさん
2005/07/12(火) 12:37:590696デフォルトの名無しさん
2005/07/12(火) 12:39:100697デフォルトの名無しさん
2005/07/12(火) 12:39:391. 手っ取り早い
2. よく使われている例を丸写ししただけ
3. 他の方法を考えるのが面倒
こんな感じでは?
0698デフォルトの名無しさん
2005/07/12(火) 12:45:120699デフォルトの名無しさん
2005/07/12(火) 12:46:000700デフォルトの名無しさん
2005/07/12(火) 12:46:480701683
2005/07/12(火) 13:03:42int main()
srand(time(NULL));
・
・
ってことですか?
コンパイルするとここでは宣言できないって言われるですが
0702デフォルトの名無しさん
2005/07/12(火) 13:05:43コンパイラが古いんじゃないかと。
0703684じゃないけど
2005/07/12(火) 13:06:43int main()
{
srand(time(NULL));
:
}
ただ、main の頭でやるというか、他で rand を使うに先立って一度だけ srand をすればいい。
だから別に main でやらなくてもいいよ。
0704デフォルトの名無しさん
2005/07/12(火) 13:16:29「mainの頭」と言われて、srandを変数宣言よりも前に置いたのかw
愉快な奴だなw
0706683
2005/07/12(火) 13:19:56それ早くいってくれよorz
0707デフォルトの名無しさん
2005/07/12(火) 13:27:01言わなくても分かれよ。
基本だろ?
0708デフォルトの名無しさん
2005/07/12(火) 13:31:230709デフォルトの名無しさん
2005/07/12(火) 13:34:20srand(time(NULL));
int main
とかするよりもマシだろう。
# ソースを「実行」しようとした奴もいたし...Cはスクリプトじゃねーよ
0710デフォルトの名無しさん
2005/07/12(火) 13:34:53いくらなんでも関数本体のブロックに入る前じゃダメだろ
0711デフォルトの名無しさん
2005/07/12(火) 15:15:300712デフォルトの名無しさん
2005/07/12(火) 15:36:018/(1×3)+8/(5×7)+ ‥‥ +8/{(4n-3)×(4n-1)}
ただし,nは1以上とする
#include<stdio.h>
void main()
{
int i,n,kou,wa=0;
printf("1以上の整数nは?\n");
scanf("%lf",&n);
for (i = 1;i <= n; i++) {
wa += kou;
kou = (double) 8 / (4 * i - 3) * ( 4 * i - 1);
}
printf("和=%lf\n",wa);
}
すいません・・・ずっと考えているんですがどこが違っているのか
わかりません。どなたか教えてください。
0713デフォルトの名無しさん
2005/07/12(火) 15:43:22int は整数の型ってことに注意。
少数を扱いたいなら float か double。
ソースを見たところ i と n は int で構わないだろうけど、それ以外は少数なんでないかい?
0714デフォルトの名無しさん
2005/07/12(火) 15:45:34kou
が逆だろ。ゆとりありすぎ
0715デフォルトの名無しさん
2005/07/12(火) 15:50:14浮動小数点型においてたくさんの数値を足し込むときには、値の小さいものから足していくと誤差が少なくなるよ。
とどのつまり上記問題では、i を 1 から n に向かってループさせるのではなく、n から 1 に向かってループさせると
精度が良くなるってこと。
これは C固有のテクニックではないけどね。
0716712
2005/07/12(火) 15:52:230717デフォルトの名無しさん
2005/07/12(火) 15:53:21>713の注意と、scanf()の型指定子にも注意。
それと、>714の言いたいことはwaに加算する順序が違うだろうと言うことだな。
0718デフォルトの名無しさん
2005/07/12(火) 16:49:26<kou = (double) 8 / (4 * i - 3) * ( 4 * i - 1);
>kou = (double) 8 / ((4 * i - 3) * ( 4 * i - 1));
0719デフォルトの名無しさん
2005/07/12(火) 16:53:06括弧より、お前の知識が足りない。小学校からやり直せ
0720718
2005/07/12(火) 17:05:430721デフォルトの名無しさん
2005/07/12(火) 17:06:340722デフォルトの名無しさん
2005/07/12(火) 17:07:12>>719
解説よろ
0723デフォルトの名無しさん
2005/07/12(火) 17:33:17だが気のせいだ。何を気にしているのか知らんが。
0724デフォルトの名無しさん
2005/07/12(火) 17:34:070725デフォルトの名無しさん
2005/07/12(火) 17:37:480726724!=712
2005/07/12(火) 17:45:19for(;;){
printf("1以上の整数nは?\n");
if(scanf("%d",&n)==1 && n>=1) break;
*ここで行末まで読み捨てる。
}
0727デフォルトの名無しさん
2005/07/12(火) 17:46:42素直に読み捨てろ。
0728デフォルトの名無しさん
2005/07/12(火) 17:47:270729デフォルトの名無しさん
2005/07/12(火) 17:48:210730デフォルトの名無しさん
2005/07/12(火) 17:49:36scanf()を捨てろ。
0731デフォルトの名無しさん
2005/07/12(火) 17:59:580732デフォルトの名無しさん
2005/07/12(火) 18:08:200733726
2005/07/12(火) 18:14:51なるほど。
でもEOFも検出しないと無限ループだからこんな感じか。ショッペー
for(;;){ int c = getchar(); if(c==EOF) return 0; if(c=='\n') break; }
0734デフォルトの名無しさん
2005/07/12(火) 18:16:270735デフォルトの名無しさん
2005/07/12(火) 18:25:47いったいどういう仕組みなんだろう、何で括弧入らないんだ?
割り算が先に評価されると思うのだが
0736デフォルトの名無しさん
2005/07/12(火) 18:27:38サンプルソース
int i=1;
printf("%f\n", (double)8 / (4*i-3)*(4*i-1));
printf("%f\n", (double)8 / ((4*i-3)*(4*i-1)));
実行結果
24.000000
2.666667
どっちが正しいの?
0737デフォルトの名無しさん
2005/07/12(火) 18:30:440738デフォルトの名無しさん
2005/07/12(火) 18:32:150739デフォルトの名無しさん
2005/07/12(火) 18:35:080740デフォルトの名無しさん
2005/07/12(火) 18:35:19フラッシュする代わりに読み捨てちゃダメなの…?
0742デフォルトの名無しさん
2005/07/12(火) 18:41:460743デフォルトの名無しさん
2005/07/12(火) 18:47:07どういうこと、つながってないとは、一連の問題文に読めるが?
0744デフォルトの名無しさん
2005/07/12(火) 18:48:10{
return (n<1) ? 0 : f(n-1) + (8.0 / ((4*n-3) * (4*n-1)));
}
0745デフォルトの名無しさん
2005/07/12(火) 18:48:42最近C言語の解説本、増えてるよね? 流行ってんじゃねーの
0746デフォルトの名無しさん
2005/07/12(火) 18:49:48括弧あるじゃん
0747デフォルトの名無しさん
2005/07/12(火) 18:50:54>>738→>>739 orz
0748デフォルトの名無しさん
2005/07/12(火) 18:52:31>8/(1×3)+8/(5×7)+ ‥‥ +8/{(4n-3)×(4n-1)}
これさ
>8/(1×3)+8/(5×7)
>8/{(4n-3)×(4n-1)}
おかしくね?
0749デフォルトの名無しさん
2005/07/12(火) 18:53:190750デフォルトの名無しさん
2005/07/12(火) 18:59:05さすがにそれは違う
8/(1×3)+8/(5×7)
これはn=1 , n=2を連続して書いてるだけだ。代入してみなよ
0751デフォルトの名無しさん
2005/07/12(火) 18:59:39ごめん。おれの読み間違いみたいだ。
小学校に入って女友達作ってくる
0752デフォルトの名無しさん
2005/07/12(火) 18:59:57ありがとう。早とちりした。
0753デフォルトの名無しさん
2005/07/12(火) 19:00:16だから何で括弧が要らないのか教えてくれ。気になって仕事に戻れんw
0754デフォルトの名無しさん
2005/07/12(火) 19:03:31/は分数
だから8/(4n-3)×(4n-1)は
8
−−−−−−
(4n-3)×(4n-1)
なんだよ。小学校から出直せ。
0755デフォルトの名無しさん
2005/07/12(火) 19:05:470756デフォルトの名無しさん
2005/07/12(火) 19:07:22なんだネタかツマラン
0757デフォルトの名無しさん
2005/07/12(火) 19:07:32a/b*c+d って書いたらどうなるんだい?
a
−−−−
b * c + d
とか言っちゃう?
0758デフォルトの名無しさん
2005/07/12(火) 19:18:280759デフォルトの名無しさん
2005/07/12(火) 19:23:55こういう2次元配列用のポインタって宣言出来ましたっけ?
0760デフォルトの名無しさん
2005/07/12(火) 19:29:360761デフォルトの名無しさん
2005/07/12(火) 19:29:380763デフォルトの名無しさん
2005/07/12(火) 19:48:45FF�[→アセンブラ言語」
0764デフォルトの名無しさん
2005/07/12(火) 20:38:18bufp is pointer to array[0..639] of char.
結びつきの強いものから順に。英語で読む。
bufpはcharの配列[0..639]へのポインタ
0765デフォルトの名無しさん
2005/07/12(火) 21:38:07自力で組めるようになった?
おれは自力で行ったのはマージソート。そのあと基数ソートにたどり着い
ちゃってクイックソートイラネ
0766デフォルトの名無しさん
2005/07/12(火) 22:10:17int is_prime(int n)
{
int i;
if (n < 2)
return 0;
for (i = 2; i < n; i++)
if ((n % i) == 0)
return 0;
return 1;
}
int main(void)
{
int i;
for (i = 2; i < 500; i++) {
if (is_prime(i) && is_prime(1000-i))
printf("%d %d\n", i, 1000-i);
}
return 0;
}
このプログラムで各々が何をしているのかわかりません。
教えてくれないでしょうか?
0767デフォルトの名無しさん
2005/07/12(火) 22:16:460768デフォルトの名無しさん
2005/07/12(火) 22:18:54素数かどうかチェックする関数だろ。
0769デフォルトの名無しさん
2005/07/12(火) 22:25:35is_primeは素数判定で、printfは標準出力への文字列表示です。
0770デフォルトの名無しさん
2005/07/12(火) 22:42:58マジレスすると
http://pc8.2ch.net/test/read.cgi/tech/1087648569/104
の答えw
0771デフォルトの名無しさん
2005/07/12(火) 22:55:03fopenではファイル名にこういうのを入れられない。
フルパスに展開する関数とかあるんでしょうか。
0772デフォルトの名無しさん
2005/07/12(火) 22:56:41いずれにせよ、環境依存のコードになるだろうな。
0773デフォルトの名無しさん
2005/07/12(火) 23:04:490774デフォルトの名無しさん
2005/07/12(火) 23:08:59可
0775デフォルトの名無しさん
2005/07/12(火) 23:09:42Winなら GetFullPathName とかなかったっけ? ~ ならUNIX系か
>>773
Winなら使えた記憶がある
0776デフォルトの名無しさん
2005/07/12(火) 23:11:480777デフォルトの名無しさん
2005/07/12(火) 23:12:21int main(void)
{
int i, j;
int ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
int mb[3][2] = { {1, 5}, {5, 3}, {8, 1} };
for (i = 1; i < 2; i++)
for (j = 1; j < 2; j++)
mc[1][1] = ma[i][j]*mb[i][j] + ma[i+1][j]*mb[i][j+1] + ma[i+2][j]*mb[i][j+2];
mc[1][2] = ma[i][j]*mb[i+1][j] + ma[i+1][j]*mb[i+1][j+1] + ma[i+2][j]*mb[i+1][j+2];
mc[2][1] = ma[i+1][j]*mb[i][j] + ma[i+1][j+1]*mb[i][j+1] + ma[i+1][j+2]*mb[i][j+2];
mc[2][2] = ma[i+1][j]*mb[i+1][j] + ma[i+1][j+1]*mb[i+1][j+1] + ma[i+1][j+2]*mb[i+1][j+2];
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
printf("%3d", mc[i][j]);
putchar('\n');
}
return (0);
}
2行3列と3行2列の積をもとめるプログラムなんですが
mcを求める演算を簡単にするにはどうしたらいいのでしょうか。
しかもこれさえまともに動かない・・orz
0778デフォルトの名無しさん
2005/07/12(火) 23:13:49まともに動かないのは、forの括弧が抜けてるから
0779778
2005/07/12(火) 23:15:100780デフォルトの名無しさん
2005/07/12(火) 23:18:100781デフォルトの名無しさん
2005/07/12(火) 23:20:56かなり強引につくったんですが
0782デフォルトの名無しさん
2005/07/13(水) 00:08:37つhttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/711.txt
0783デフォルトの名無しさん
2005/07/13(水) 00:23:02a = 0.509;
b = 1.501;
c = a ^ b;
↑こんな感じで書くとビルドエラーになるんですが、小数同士の
Xorを取るにはどうすればいいんでしょう?
"^"の左右オペランドが間違いとか言われます。
0784デフォルトの名無しさん
2005/07/13(水) 00:28:350785デフォルトの名無しさん
2005/07/13(水) 00:33:12C のビット演算は整数専用なんだけど。
0786デフォルトの名無しさん
2005/07/13(水) 00:36:43論理演算が使えるのは。
0787デフォルトの名無しさん
2005/07/13(水) 00:54:410788デフォルトの名無しさん
2005/07/13(水) 00:56:56何に使うんだろう
0789デフォルトの名無しさん
2005/07/13(水) 01:03:38参考になりました。ありがとうございます
0790デフォルトの名無しさん
2005/07/13(水) 01:10:150791デフォルトの名無しさん
2005/07/13(水) 01:11:17なんだとー!
0792ガラハド
2005/07/13(水) 02:10:480793デフォルトの名無しさん
2005/07/13(水) 02:17:13腐りきったロマサガネタなんぞ書くなバカモノ。
0794ぬるぽ
2005/07/13(水) 02:50:570795ルート
2005/07/13(水) 03:19:48ダウンロードしたファイルからインストールするものとかあるんでしょうか?
あと、Borland C++コンパイラの命令コマンドって何ですか?
0796デフォルトの名無しさん
2005/07/13(水) 03:28:370797デフォルトの名無しさん
2005/07/13(水) 05:22:51int sub(int x,int *y)
{
x = x + *y;
*y= x + *y;
}
main()
{
int a,b;
a = 3;
b = 2;
printf("a=%d b=%d",sub(a,b));
return 0;
}
0798デフォルトの名無しさん
2005/07/13(水) 05:29:17追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。
という警告が出ます
仮引数xは値呼出し、yは参照呼出しにしたいんですけど。。
すいませんが、詳しい方、ちょっと手伝って下さい
0799デフォルトの名無しさん
2005/07/13(水) 05:31:52そか。がんがれ。
0800デフォルトの名無しさん
2005/07/13(水) 05:43:08printf("a=%d b=%d",sub(a,&b));
に、変更したのですが まだうまくいきません
最終的に、a = 3, b = 7 にしたいのですが
0801デフォルトの名無しさん
2005/07/13(水) 05:49:020802デフォルトの名無しさん
2005/07/13(水) 05:49:27できました
sub(a,&b);
printf("a=%d b=%d",a,b);
有難うございました
0803デフォルトの名無しさん
2005/07/13(水) 05:49:37俺もやりたい。
0804デフォルトの名無しさん
2005/07/13(水) 05:50:400805デフォルトの名無しさん
2005/07/13(水) 07:11:56例えば最上位ビットを切り捨てれば絶対値が取れるのは割りと有名
最上位だけ1でxorしたら符号反転したことになる
もっとも>>783の質問の意図はわからん。そういうことがしたいのかな?
0806デフォルトの名無しさん
2005/07/13(水) 09:36:51double サイズ分、char に見立てて xor かければいいだけだろ?
0807東海大学前
2005/07/13(水) 10:11:42その人数を表示し、60以上の数字を合格者として、その人数を表示する。」という問題が教科書にあったのですが、まだ始めたばかりなのでよく分からないのでよかったら教えてください。
0808デフォルトの名無しさん
2005/07/13(水) 10:14:14ぼるじょあがC/C++の宿題を片づけますYO! 47代目
http://pc8.2ch.net/test/read.cgi/tech/1120522752/
0809デフォルトの名無しさん
2005/07/13(水) 12:00:51最上位ビットを反転すると符号反転になる?
int でそれやるとぜんぜん違う値になるんだけど、浮動小数点ってそうなの?
0810デフォルトの名無しさん
2005/07/13(水) 12:03:04そう、なる。だから浮動小数にはマイナスゼロ(0x800000…)がある。
0811デフォルトの名無しさん
2005/07/13(水) 12:06:470812デフォルトの名無しさん
2005/07/13(水) 12:12:47符号反転なら浮動小数命令が使われる場合もある(not a number例外がほしいなど)
絶対値だとCに演算子が無いんだな、これが
0814デフォルトの名無しさん
2005/07/13(水) 12:21:52そっか絶対値か。なるほど。
0815デフォルトの名無しさん
2005/07/13(水) 12:26:57なるほどおもしろいな。
たしかに浮動少数は、固定長の値みたいに2の補数表記にしたからといって演算上のメリットは乏しいもんな。
0816デフォルトの名無しさん
2005/07/13(水) 12:31:33ビットフィールドとの共用体を定義して、最上位に代入する形で
実現できる。これもよくやる手だよ
union{
float f;
struct{
int s:1;
int e:8;
int n:23;
};
};
sを消せばfの絶対値が取れる
0817デフォルトの名無しさん
2005/07/13(水) 12:33:17データとしてはあり得るが、値としてはないんじゃないか。
IEEE754では-0.0は+0.0にされちゃうんじゃなかったっけ?
0818デフォルトの名無しさん
2005/07/13(水) 12:35:25処理系依存だし・・・普通にfabs使えよ・・・。
0819デフォルトの名無しさん
2005/07/13(水) 12:36:11突っ込んでもおかしくならない。
0820デフォルトの名無しさん
2005/07/13(水) 12:39:29float f;
if(f<0)f=-f;
と書くと fabs使ってくれるコンパイラと処理系もあるかもしれん。
まあ、Cでやるならビットフィールド使うにしても、もう一枚マクロ着せるか
0821デフォルトの名無しさん
2005/07/13(水) 12:43:11fabsは浮動小数ASM命令の方ね
0822デフォルトの名無しさん
2005/07/13(水) 12:45:43でも memcpy とか memset とかは、扱うサイズが小さい場合は関数呼出にもかかわらず最適化されて
インライン展開(というかストレートライン展開?)されることもあるよ。
そういったことも全て処理系依存なんだから、極力見やすいコードを書く方がいいと思われ。
# テクニックとして知っていることはいいことだけど
0823デフォルトの名無しさん
2005/07/13(水) 12:49:210824デフォルトの名無しさん
2005/07/13(水) 16:17:12負整数の表現方法は3つ規定されている。
・2の補数
・1の補数
・符号と絶対値
最後の方法を採ってる処理系なら符号反転するが、そんな処理系は滅多にない。
浮動小数は普通は上位から順に符号ビット、指数ビット(列)、仮数ビット(列)となってるから
最上位を反転させれば符号が逆になる。
0825デフォルトの名無しさん
2005/07/13(水) 18:34:10va_list ptr;
va_start( ptr, limit ); // 間違ってるかも
test2( 2, ??? );
}
void test2( int limit, ... ) {
// 4. 5 と表示
}
main() {
test( 2, 4, 5 );
}
意味だけ汲み取っていただけると幸いです。
こんな感じで可変長引数を宣言したとして、test1 の 可変長引数を test2
に引き継ぐにはどうすればいいのでしょうか?
0826デフォルトの名無しさん
2005/07/13(水) 18:38:21CFAQへ。
0827デフォルトの名無しさん
2005/07/13(水) 18:38:46できるのか?
インラインアセンブラ使ってjmpするくらいしか思いつかん。
例えばprintfなら展開された後の配列を受け取るvsprintfみたいなのに
処理を引き渡すけど、そういうんじゃ駄目なのかな?
0828デフォルトの名無しさん
2005/07/13(水) 18:43:42ビットシフトはなんの役に立つのでしょうか?
0829デフォルトの名無しさん
2005/07/13(水) 18:47:39友達いないの?そんなにさびしい人生おくってるの?
氏ねば?
0830デフォルトの名無しさん
2005/07/13(水) 18:51:38よっぽどストレスのたまる人生をおくってるようで。
0831デフォルトの名無しさん
2005/07/13(水) 18:52:020832デフォルトの名無しさん
2005/07/13(水) 19:39:02画面イメージをビットパターンで持っているとき
横スクロールに使える
0833デフォルトの名無しさん
2005/07/13(水) 19:59:5015.10:
よって va_arg(argp, float);と書くのは常に誤りである。
かわりに va_arg(argp, float)と常に書かなければならない。
ってあったけど、どう違うの??
0834デフォルトの名無しさん
2005/07/13(水) 20:10:320835デフォルトの名無しさん
2005/07/13(水) 20:11:47誤植
http://www.eskimo.com/~scs/C-faq/q15.10.html
0836デフォルトの名無しさん
2005/07/13(水) 20:43:28可変長引数にfloatは無い。
値はdoubleに成り上がってスタックに取り付くのだよ。
0837デフォルトの名無しさん
2005/07/13(水) 23:12:58http://hobby8.2ch.net/test/read.cgi/watch/1121261135/l50
0838デフォルトの名無しさん
2005/07/14(木) 01:30:23bが入力されると2がしゅ(ry
これはどうやればいいのかご伝授願います
0839デフォルトの名無しさん
2005/07/14(木) 01:34:52main() { int c; while((c = getchar()) != EOF) putchar(c - 'a' + '1'); }
0840デフォルトの名無しさん
2005/07/14(木) 01:47:09即レスthxです
aが入力されるとプログラム上ではc=1と入力されてるはずですが
if (c==1) printf ("てst");
これを付け加えてみた所、正しく表示されませんでした
また、aを入力すると 1レ と表示されましたがこれでよろしいのでしょうか?
0841デフォルトの名無しさん
2005/07/14(木) 01:49:18あれじゃ所詮数文字しか出せないからな。
0842デフォルトの名無しさん
2005/07/14(木) 02:51:28レは多分LFが化けたんだろう
a->1という仕様は>>839で満たされている。
他に要求があるんならもっと仕様をはっきりさせろ。
0843デフォルトの名無しさん
2005/07/14(木) 02:59:070844デフォルトの名無しさん
2005/07/14(木) 08:35:15? そうなのか? c=='a'じゃないの?
0845デフォルトの名無しさん
2005/07/14(木) 18:38:12スタック構造を使って逆ボーランド記法をプログラムして、プッシュとポップを
それぞれ関数で書くのは、どうやってやったらいいですか?
教えてください〜
0846デフォルトの名無しさん
2005/07/14(木) 18:41:23何がわからないのか、もっと具体的に。
と言うか、他の言語ならわかるのか?と小一時間(ry
0847デフォルトの名無しさん
2005/07/14(木) 18:45:160848デフォルトの名無しさん
2005/07/14(木) 19:37:28マルチ乙。宿題スレで回答があるようだぞ。
0849デフォルトの名無しさん
2005/07/14(木) 20:41:07.r-‐i'''''''''''i''''‐-、
o| o! .o i o !o
.|\__|`‐´`‐/|__/|
|_, ─''''''''''''─ ,、 /
、-' u -、
/ U 0 \
/ / i
| ● ,,. .,, ● |
__ . ! (_人__) ノ
/´ ̄ `!. 丶_ u U ノ
| `にこ匸'_ノ . '-、、,,,,,,_______,,,,,,、、-'
ノ u { _.. -―| :{ ,/ / \
. / l | __ / ̄ ̄`>'´ ノ' ´ {、 \
/ |/ {'´ `ヽ. " ̄\ U `ヽ. __,,.. -‐丶 u ヽ
| / ヾ、.. } u' 〉、 } `ー''´ /´ ̄ `ヽ '" ̄\
! :} )「` ノ、 ノ l\"´_,,ニ=-― <´ ヽ{ ノ( `、 |
l 、_,/j `ー一''" }, ノ , '''''"" \ ヽ ⌒ヾ v |
ヽ _ / } {. { l ┌n‐く ヽ/ ``\ ノ
`¨´ `¨¨¨¨´ ̄`{ 0 `'^┴'ー┘|ヾ }、 u' ` --‐r'′ キングヤッタス!!
0850デフォルトの名無しさん
2005/07/15(金) 00:21:53ふつうに二つ関数を定義するのと、引数とかによって条件分岐させて一つの関数ですませた方がいいのか、
分からないので教えてください。もしかして、好みとか気分の問題になってくるんでしょうかね?
0851デフォルトの名無しさん
2005/07/15(金) 00:28:11状況による
0852デフォルトの名無しさん
2005/07/15(金) 00:37:54・
・
・
return 0; ←の意味を教えてください
}
0を返す、というのは分かるんですが、
返すことでどうなるのか、そこが気になるのです
0853デフォルトの名無しさん
2005/07/15(金) 00:42:190854デフォルトの名無しさん
2005/07/15(金) 00:44:40そのCで作ったアプリ・ツールを呼び出す側で使う。
0なら正常終了でエラーがでたら1, 2, 3と数字を増やして返すのが一般的。
0855デフォルトの名無しさん
2005/07/15(金) 00:54:23実装上の都合で考えるのではなく、その関数を利用する立場で考えるのがいいかと。
例えば利用する側が双方を交互に呼ぶようなら一つの関数で引き数で分けるのがいいし、
同一対象を片方は読み片方は書くなど利用する目的が異なるなら関数を分けるべき。
前者は例えばstrtok()、後者はfread()/fwrite()など。
0856デフォルトの名無しさん
2005/07/15(金) 01:10:01引数の個数が違うなら素直に分ければいいし
int foo(int flag, BOOL use_flag); // みたいに無理にまとめるのはバカっぽい。
個数が同じならモードや引数の解釈に関する引数をもう一つ追加するのもあり。
どっちでもいいと思えるなら処理が同じということでまとめてしまってもいいか。
0857デフォルトの名無しさん
2005/07/15(金) 01:15:410858856
2005/07/15(金) 01:25:01856はC++のoverloadか分割か程度の判断基準。
さすがにfread/fwriteみたいなのをまとめるかで迷ってはいないだろ。
0859デフォルトの名無しさん
2005/07/15(金) 02:15:01引数で処理を分ける関数と、それを呼び出す入り口関数を用意するって方法もあるよ。
/* 関数の実装 mode によって処理を分ける */
int FuncImpl(int arg1, int arg2, int mode)
{
:
}
/* 関数の入り口A */
int FuncA(int arg1, int arg2)
{
return FuncImpl(arg1, arg2, 0); /* mode=0 で処理本体を呼出 */
}
/* 関数の入り口B */
int FuncB(int arg1, int arg2)
{
return FuncImpl(arg1, arg2, 1); /* mode=1 で処理本体を呼出 */
}
入り口関数の代わりにマクロを定義してもいいと思うけど、共通ではない処理の一部を入り口関数に追い出すことにより
FuncImpl の実装が完結になったりするから、状況に応じて検討すればいい。
0860デフォルトの名無しさん
2005/07/15(金) 03:13:11使う側の都合による
a.ある場所からそれぞれ使う
b.まったく別の場所から呼び出す
a.ならパラメータにより1関数内部で分岐
b.なら別関数
0861デフォルトの名無しさん
2005/07/15(金) 03:24:510862デフォルトの名無しさん
2005/07/15(金) 03:59:120863デフォルトの名無しさん
2005/07/15(金) 09:22:23char型の一次元配列の内容をコピーして二次元配列に格納したいんですけども
char toranp[13] = {"A","2","3","4","5","6","7",
"8","9","10","J","Q","K"};
char toranp[13][4] = {{"A","2","3","4","5","6","7",
"8","9","10","J","Q","K"},{}};
0864デフォルトの名無しさん
2005/07/15(金) 09:27:090865デフォルトの名無しさん
2005/07/15(金) 09:39:160〜nまで、順番に選んだカードをランダムに選んだカードと交換していく。
これが完全シャッフルになるという証明もどっかにあった希ガス。
for (i = 0; i < n; i++) {
swap_card(&card[i], &card[rand()%n]);
}
0866デフォルトの名無しさん
2005/07/15(金) 09:45:32それは値を入れてからの話しで、>>864が訊きたいこととは違うンで無いかい?
0867デフォルトの名無しさん
2005/07/15(金) 09:48:46投稿してから気づいたよ。
むしゃくしゃしてやった。
いまは反省してる。
0868デフォルトの名無しさん
2005/07/15(金) 10:54:20エラーE2209 インクルードファイル'stdio.h'をオープンできない
どなたか対処法お願い致します。
0869デフォルトの名無しさん
2005/07/15(金) 10:54:57関数をそれぞれ作って、共通部分だけを別関数にする。
と言う方法もある。
0870デフォルトの名無しさん
2005/07/15(金) 10:57:10メモ帳で stdio.h というファイルを作れば
そのエラーは解決
0871デフォルトの名無しさん
2005/07/15(金) 11:01:54コンパイラのインストールに失敗してるんだろ。
ちゃんと環境設定しろ。
0872デフォルトの名無しさん
2005/07/15(金) 11:06:50サンクス!
0873デフォルトの名無しさん
2005/07/15(金) 11:13:350874デフォルトの名無しさん
2005/07/15(金) 11:34:51半年ROMってからレスしような。
0875デフォルトの名無しさん
2005/07/15(金) 12:03:332から100までの階乗を計算するプログラムを作れと言われました。
ヒントとして、
「1桁ずつ配列にして考える。
100!でも、高々200桁なので、配列を200個用意して考える。」
というのが与えられている。
ヒントの意味がわかる人は解説してください。
0876デフォルトの名無しさん
2005/07/15(金) 12:07:29宿題は宿題スレへ。
つーか、ヒントの意味が判らないんだったらプログラミング止めたら?
0877デフォルトの名無しさん
2005/07/15(金) 13:17:27http://pc8.2ch.net/test/read.cgi/tech/1120522752/287-288
0878デフォルトの名無しさん
2005/07/15(金) 15:41:30×完全シャッフル
○ランダムシャッフル
完全シャッフルは↓
{0,1,2,3,4,5,6,7,8,9} ---> {0,5,1,6,2,7,3,8,4,9}
0879デフォルトの名無しさん
2005/07/15(金) 16:43:06>配列を200個
0880デフォルトの名無しさん
2005/07/15(金) 16:57:030881デフォルトの名無しさん
2005/07/15(金) 16:59:05なんにも出来ない無能だっているんだからな
0882デフォルトの名無しさん
2005/07/15(金) 17:31:08関数内でstaticで宣言した変数を使ってるのですが、
その再帰関数が一度結果を出した後、別の機会に再び使うと
前回呼ばれた回数+今回呼ばれた回数になってしまいます
今回の回数だけを知るために
staticで宣言した関数を再び初期化するにはどうしたらよいのでしょうか?
0883デフォルトの名無しさん
2005/07/15(金) 17:33:390884デフォルトの名無しさん
2005/07/15(金) 17:34:52関数内static な再帰カウンタを関数外staticに追い出す & カウンタ初期化関数つくる
0885デフォルトの名無しさん
2005/07/15(金) 17:39:44関数内でクリアしようとすると毎回クリアされてしまう気がするのですが?
と思ったんですがif文使えばできそうな気も。
試してみます。
>>884
ありがとうございます。関数外で宣言すればいいんですね。ちょっとやってみます。
ひょっとしてものすごく馬鹿な質問しましたか?orz
0886884
2005/07/15(金) 17:41:59だったら >>883 でいいんでねーの?
入り口で ++ しといて 出口で -- すりゃ 自分自身の再帰のネストが ?段目か判断できるっしょ
# 再帰関数の引数にネスト値ぶっこむのも手か?
# foo(int nest) {
# ....
# foo(nest+1);
# }
0887デフォルトの名無しさん
2005/07/15(金) 17:42:47こういうこと?
#include <stdio.h>
#include <stdlib.h>
int fact(int x) {
static int level = 0;
int ans;
++ level;
printf("--> %d\n", level); /* 確認用 */
if (x <= 0) {
-- level;
return 1;
} else {
ans = x * fact(x - 1);
-- level;
printf("<-- %d\n", level); /* 確認用 */
return ans;
}
}
int main() {
printf("%d\n", fact(10));
printf("%d\n", fact(10));
}
0888デフォルトの名無しさん
2005/07/15(金) 18:18:420889デフォルトの名無しさん
2005/07/15(金) 18:45:23どう解決したのか詳しく。
0890デフォルトの名無しさん
2005/07/15(金) 18:53:14BoyoのC++本に練習問題で載ってた。解答ページに
「この問題が解けなかった人は本書を読む資格がありません」
て書いてあって、俺は解けたけどむかついた。
0891デフォルトの名無しさん
2005/07/15(金) 21:57:38その淵を取るようなコードはどうやって書けばいいんでしょうか?
言葉では伝わりにくいのですが、点が大量にあって、
その点の輪郭を取るのです・・・
輪郭の凹凸は不明です。
どうぞよろしくお願いします。
0892デフォルトの名無しさん
2005/07/15(金) 22:07:42最もy座標の大きい点(P0)を通り、x軸と平行な直線を求める。
直線をP0で固定して、この直縁の傾きを増加させていくと直線がどこか別の点(P1)に触れる。
これで外周の2点が取得できたことになる。
こんどはP1で直線を固定して、さらに傾きを増やしていくと、別の点P3に触れるので、これを次の支点とする。
これを繰り返して、P0まで一周すれば、すべての外周点が取得できるはず。
0893デフォルトの名無しさん
2005/07/15(金) 22:09:17例えば100012344343443
みたいなのです。
簡単な質問ですいません
0894893
2005/07/15(金) 22:10:200895デフォルトの名無しさん
2005/07/15(金) 22:11:540896デフォルトの名無しさん
2005/07/15(金) 22:20:175進数でインクリメントしながら隣接する桁をチェックして該当するものをストックしていく。
0897デフォルトの名無しさん
2005/07/15(金) 22:23:460898デフォルトの名無しさん
2005/07/15(金) 22:26:16すばやい回答ありがとうです。
それだと凹凸に対応しきれないと思います・・
傾きの増加を正と負にわけてやった場合も、PiのxがPi+1のxと大きい場合と小さい場合で区別がつかなくなるかと・・・
一回やってみます。
0899デフォルトの名無しさん
2005/07/15(金) 22:35:410〜4が輪になっていると考え、それが、そのまま、右、左の3命令で数列を動いて行く。
これをSim。すればよい。
0900デフォルトの名無しさん
2005/07/15(金) 22:53:32例えば与えられた点が
p1(0,0) p2(0,2) p3(2,2) p4(2,0) p5(1,1) だとすると、
p1-p2-p3-p4-p1
p1-p2-p3-p4-p5-p1
p1-p2-p3-p5-p4-p1
p1-p2-p5-p3-p4-p1
p1-p5-p2-p3-p4-p1
の何れも答えになりうる。条件を追加しなければ解答不能だと思われ。
0901デフォルトの名無しさん
2005/07/15(金) 23:03:46点の集合を全て含む面積最小の直線で出来た図形でどうじゃ。
0902デフォルトの名無しさん
2005/07/15(金) 23:07:36簡単な入門書から難しい技術書まで、
C言語関係の本は腐るほどたくさん読んできたが、
なぜかK&Rだけは読んだことがない。
C言語厨のあいつに怒られたよ・・・
0903デフォルトの名無しさん
2005/07/15(金) 23:08:20凹の形を含めると一意に決まらないんじゃね?
0904デフォルトの名無しさん
2005/07/15(金) 23:09:51読んだ方が良い。読まなくてもよい。
K&R は ANSI な内容だから
規格書を読んだ方が得るものが多いかも
0905デフォルトの名無しさん
2005/07/15(金) 23:11:26>C言語関係の本は腐るほどたくさん読んできた
なら別に読まなくてもいいだろ
そいつに借りてよめばいいんじゃまいか
0906デフォルトの名無しさん
2005/07/15(金) 23:11:40>>900
すいません・・・条件の加え方がわかりません・・・
補足で与えられる点は1万点以上で、できあがる輪郭は一個のみです。
>>901
考えてみます。よさげです
0907デフォルトの名無しさん
2005/07/15(金) 23:15:45#include <stdio.h>
#define LEN 30
#define NUMMAX 4
void r(int *a, int index, int end)
{
int i;
if( index == end )
{
for(i = 0; i != end; ++i) printf("%d",a[i]);
putchar('\n');
}
else
{
int left = a[index-1];
for(i = 0; i < NUMMAX+1; ++i)
{
if( index != 0 && 1 < (left > i ? left - i : i - left)) continue;
a[index] = i;
r(a, index+1, end);
}
}
}
int main()
{
int a[LEN] ={0};
r(a,0,LEN);
return 0;
}
0908デフォルトの名無しさん
2005/07/15(金) 23:18:51>>903
人目にみて、形を作れるので、できないことはないと思うのですが・・・
ちょっと困惑してます、すいません。。。
0909デフォルトの名無しさん
2005/07/15(金) 23:19:34これからも読まない方がいいかと思われ
0910907
2005/07/15(金) 23:20:4515桁で、約100万件
でした、30桁だと何件になるんだ? まだ終わらん。
0911デフォルトの名無しさん
2005/07/15(金) 23:25:26輪郭だよな?
・ ・
・
・ ・
これに対しては
┌─┐
| ・ |
└─┘
と
┌─┐
| <
└─┘
のどっちも会になるんじゃないか?
さらに回転したものも解になるよな?
0912デフォルトの名無しさん
2005/07/15(金) 23:27:46輪郭の「へこませ方」はいくらでも増えていく。
0913デフォルトの名無しさん
2005/07/15(金) 23:28:31×
だけですが?
0914デフォルトの名無しさん
2005/07/15(金) 23:29:52輪 郭 !
0915デフォルトの名無しさん
2005/07/15(金) 23:32:17×
だけですが?
0916デフォルトの名無しさん
2005/07/15(金) 23:34:39すべての点を結んだときの線分の長さの合計が最小になるものを求めよ。
なら、それだね。
0917デフォルトの名無しさん
2005/07/15(金) 23:36:281. 適当な三点を選んで三角形を作って三角形の集合に入れる。
2. 三角形の集合と頂点の集合から、「一番近い」三角形と頂点の組を求める。
3. 求めた三角形と頂点から新しい三角形を作って三角形の集合に入れる。
全ての頂点を使い切るまで、2-3を繰り返す。
0918デフォルトの名無しさん
2005/07/15(金) 23:37:060919デフォルトの名無しさん
2005/07/15(金) 23:51:05それの解は上かと・・・
もっと点があるもので考える方向でして・・・
>>912
意味がよくわかりません。点を増やせばパターンはしぼれませんか?
・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
・・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
・・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・・ ・ ・
・ ・ ・ ・ ・・・・
・ ・ ・ ・ ・
・ ・ ・
・
なら解はでませんか?
>>917
思考します・・
0920デフォルトの名無しさん
2005/07/15(金) 23:52:27面積が最小の方法も募集中・・・
0921デフォルトの名無しさん
2005/07/15(金) 23:56:51お前の文章からは何が解なのか理解できない。
0922デフォルトの名無しさん
2005/07/15(金) 23:58:18数学板にでも行ってくれ
はっきりいって迷惑だ
0923デフォルトの名無しさん
2005/07/15(金) 23:59:150924デフォルトの名無しさん
2005/07/16(土) 00:01:12何故上なのだ?
じゃぁ、☆を構成する10の点が与えられたときは、
外周の五角形が解なのか?
それとも星形が解なのか?
こういう単純な例で、理論的に解を導いて見せて
くれないと、この問題は回答不能だ。
上だと思います、じゃ分からん。
0925デフォルトの名無しさん
2005/07/16(土) 00:02:14Cのプログラムの課題だったので・・・
お騒がせしました。
0926デフォルトの名無しさん
2005/07/16(土) 00:02:430927デフォルトの名無しさん
2005/07/16(土) 00:04:10つか、課題なら授業中にやり方教えてもらってるだろ。
0928デフォルトの名無しさん
2005/07/16(土) 00:09:21char **array=(char**)malloc(sizeof(char *)*a);
for(i=0;i<a;i++){
array[i]=malloc(sizeof(char)*a);
}
このように動的に2次元配列を得たとき、
割り当てた全てのメモリを開放するには
free(array);でいいのですか?
(このように書かれたページがあったのですが)
0929デフォルトの名無しさん
2005/07/16(土) 00:10:10ダメだ
0930デフォルトの名無しさん
2005/07/16(土) 00:10:34☆なら☆が答えです。
正方形の例は、あまりに点が少なすぎて、自分でもよくわかりませんでした。
点は1万点以上用意されます・・・
>>927
やり方はスネーク法と言われたのですがぐぐってもわからなかったので
自前でやろうかと思いました・・・
0931デフォルトの名無しさん
2005/07/16(土) 00:11:51うわぁ、方法を出されてるくせに情報後だしかよ
あまりにも酷すぎる
0932デフォルトの名無しさん
2005/07/16(土) 00:12:11だから、何故そうなのかを言えといっているだろうが・・・・
なぜ五角形ではなく星なんだ? 直観か? お前の直感を表示するプログラムなのかあぢえうぃdがwふじこわヴぇ
0933デフォルトの名無しさん
2005/07/16(土) 00:19:34これ良い問題だと思うが。
差し支えない範囲でいいから
学年、専攻、科目名を教えてくれないか?
0934デフォルトの名無しさん
2005/07/16(土) 00:22:33なんとなく言わんとしていることは分かる気もする。"が"、もう少し他人に
間違いなく自分の質問を理解してもらえる文章を書くべきだな。
なお、数学的には簡単だけど、効率よくそれをやるための質問ならこの
板で問題ない。"が"、宿題スレ向きかな。
0935デフォルトの名無しさん
2005/07/16(土) 00:26:25すいません・・・忘れてました・・・
>>932
ああっと・・・すいません
直感ではなく輪郭で考えたんですが・・・・
>>933
2年、専攻?ってよくわかりません、科目はC言語です
です。
>>934
でなおします。。。
0936デフォルトの名無しさん
2005/07/16(土) 00:28:260937デフォルトの名無しさん
2005/07/16(土) 00:29:420938デフォルトの名無しさん
2005/07/16(土) 00:30:32本人が一番わかってない事を。
いつまでたっても矛盾した定義しか出てこない。
0939デフォルトの名無しさん
2005/07/16(土) 00:35:20http://upld2.x0.com/data/upld7960.gif
解を求めるための条件づけをしなければ、解はいくらでもあるでしょ
0940郵政公社
2005/07/16(土) 00:38:110941デフォルトの名無しさん
2005/07/16(土) 00:39:29それをループさせて器具名でexitと入力されたらそこで終了というプログラムを作りたいのですが
どうやって終了させれば良いのか分かりません。
どなたか教えてもらえないでしょうか?
char data[4][20];
while(data[0] != "exit"){
printf("器具名を入力してください(exitで終了)->");
scanf("%s",data[0]);
printf("製造会社を入力してください->");
scanf("%s",data[1]);
printf("型番を入力してください)->");
scanf("%s",data[2]);
printf("製造番号を入力してください->");
scanf("%s",data[3]);
printf("\n");
}
0942デフォルトの名無しさん
2005/07/16(土) 00:42:490943デフォルトの名無しさん
2005/07/16(土) 00:43:570944933
2005/07/16(土) 00:57:32んで、>>933を書いた時点で>>930を見落としてた。
ただ授業中に出されたヒントを聞き落としているだけ、のように思えてきた。
0945デフォルトの名無しさん
2005/07/16(土) 01:03:07凸とは限らないとも言われました。
忙しいらしく、詳しくは聞けませんでした・・・
>>936
自分でも不明になってきましたごめんなさい・・・
>>939
そうですね・・・わからないので質問にいきますね・・・
>>942
ごめんなさい・・・
0946デフォルトの名無しさん
2005/07/16(土) 01:15:00depthをみてクリアする
int foo(int depth)
{
if(depth==0) counter=0;
...
foo(depth+1);
}
main(){ foo(0); }
0947デフォルトの名無しさん
2005/07/16(土) 01:28:151桁 5件
2桁 13件
3桁 35件
4桁 95件
5桁 259件
6桁 707件
7桁 1931件
8桁 5275件
9桁 14411件
10桁 39371件
11桁 107563件
12桁 293867件
13桁 802859件
14桁 2193451件
15桁 5992619件
16桁 16372139件
17桁 44729515件
18桁 122203307件
19桁 333865643件
20桁 912137899件
21桁 2492007083件
22桁 6808289963件
23桁 18600594091件
24桁 50817768107件
25桁 138836724395件
26桁 379308985003件
27桁 1036291418795件
28桁 2831200807595件
29桁 7734984452779件
30桁 21132370520747件
0948デフォルトの名無しさん
2005/07/16(土) 05:52:18fscanf()系だと','は区切り記号と認識してくれないのですが・・・
0949デフォルトの名無しさん
2005/07/16(土) 06:11:260950デフォルトの名無しさん
2005/07/16(土) 08:05:55fgets()で読み込んでから、strtok()なりsscanf("%[^,]s")なりを駆使してばらせ。
間違っても>949みたいなアプローチから入るな。
#とは言っても、csvの仕様によっては結局一文字ずつ解釈する必要があるんだけどね。
0951デフォルトの名無しさん
2005/07/16(土) 10:04:30ttp://cm.bell-labs.com/cm/cs/tpop/code.html
の2ndのやつ。
マルチスレッド非対応。大域変数使いまくり(こら)
一文字ずつパースの分類になると思う。
0952デフォルトの名無しさん
2005/07/16(土) 13:10:20作ってみた(age)
/* CSVデータ(数値)分割 */
/* ・maxItem迄、item[]に格納 */
/* ・分割できた個数を返す / -1は分割NG */
int divCSV(const char *src, int *item, int maxItem)
{
char *p;
int n,itemNum=0;
if(src==NULL || item==NULL || maxItem<1) return -1;
do{
if((p=strchr(src,','))) *p='\0';
n=sscanf(src, "%d", (item+itemNum)); if(p) *p=',';
if(n<1) return itemNum;
++itemNum;
src=p+1;
}while(p && itemNum<maxItem);
return itemNum;
}
こんなの見つけたけどsrc書き換えちゃってるねw
0953デフォルトの名無しさん
2005/07/16(土) 13:12:04\→-→/→| みたいにくるくる回るのを表示したり、プログレス
バーみたいなのを描画したりしてるのはどうやってるのでしょうか。
stdoutに書き出すのと違って、前に出力したやつの上に重ねて(?)
出力してるような感じなんですが、うまくいえなくてスイマセン
0954>>928
2005/07/16(土) 13:31:53>>929
やっぱだめですか
一つ一つ開放していくしかないのですね
ありがとうございました。
0955デフォルトの名無しさん
2005/07/16(土) 13:50:56windowsXPでコマンドプロンプトの場合は
先頭行にいく\r使えばよろし。
\nは改行だからね。
0956デフォルトの名無しさん
2005/07/16(土) 14:01:35>先頭行にいく\r使えばよろし。
できれば日本語で説明してください。
0957デフォルトの名無しさん
2005/07/16(土) 14:52:57いろいろ調べたのですがわからなくて、、1次元配列の確保ならわかるのですが。
0958デフォルトの名無しさん
2005/07/16(土) 15:04:24int * * alloArray2(int size1, int size2)
{
int * * tmp = malloc(sizeof(int *) * size1);
for (int i = 0; i < size1; ++i) {
tmp[i] = malloc(sizeof(int) * size2);
return tmp;
}
void freeArray2(int * * arr2, int size1)
{
for (int i = 0; i < size1; ++i) {
free(arr2[i]);
}
free(arr2);
}
0959デフォルトの名無しさん
2005/07/16(土) 15:28:28こうすると、組み込みの配列みたいに要素が連続し、
freeも戻り値のポインタに対してだけ実行すればいいのでやや楽。
ただし要素数があまりにも多ければ無理かもしれないが。
void **SquareAlloc(size_t size, size_t x, size_t y)
{
size_t offset = sizeof (void*) * x;
void **pp = malloc(offset + size * x * y);
if (pp)
{
void **ppIndex = pp;
size_t i;
for (i = 0; i < x; i++)
ppIndex[i] = (char *)pp + offset + size * y * i;
}
return pp;
}
0960デフォルトの名無しさん
2005/07/16(土) 15:47:520961デフォルトの名無しさん
2005/07/16(土) 16:07:34第2引数で指定したファイルに保存するプログラムなんですが
最後にどうしても変な一文字が入ってしまいます。
whileがいけないと思い、do-whileにしたのですがだめでした。
どうやれば消えるでしょうか?どなたか教えてください。
#include<stdio.h>
int main(int argc, char *argv[])
{
int txt;
FILE *before, *after;
before = fopen(argv[1], "r");
after = fopen(argv[2], "w");
do
{
txt = fgetc(before);
if(txt == ' ' || txt == ' ' || txt == '' || txt == '\n') continue;
fputc(txt, after);
fputc(txt, stdout);
}
while(!feof(before));
fclose(before);
fclose(after);
return 0;
}
0962デフォルトの名無しさん
2005/07/16(土) 16:24:12ところで全角スペースは1バイト文字じゃないからそれでは判定できない。
0963958
2005/07/16(土) 16:29:25ストリームからの入力は、fgetc()がEOFを返すまでループするのが常道。
feof()を調べるまでもない。
>>960
アホでない例を所望します。
0966デフォルトの名無しさん
2005/07/16(土) 18:14:06それdoubleの配列でも大丈夫か?整列しない気がするんだが
0967デフォルトの名無しさん
2005/07/16(土) 18:15:50""での引用やカラム中の改行にも対応してないのに無駄に長く汚い
ま、糞ソースだな
0968デフォルトの名無しさん
2005/07/16(土) 18:25:41public:
void method(int (*array)[10] ){}
}
を
class Class{
public:
void method(int ???);
}
void Class::method(int (*array)[10]){}
のように書き換えたいのですが???部分はどのように書いたらよいのでしょうか?
0969デフォルトの名無しさん
2005/07/16(土) 18:28:52好きなように書いてください。???部分をどのように書いてもコンパイルできませんから。
0970デフォルトの名無しさん
2005/07/16(土) 18:31:40セミコロンを2つほど書き忘れたのは気がつきましたが、
他にもまずいところがありますか?
0971デフォルトの名無しさん
2005/07/16(土) 18:33:31>1
0972デフォルトの名無しさん
2005/07/16(土) 18:45:11⊂⌒( ・ω・) はいはいわろすわろす
`ヽ_っ⌒/⌒c
⌒ ⌒
(´〜`;)ああ、イヤダイヤダ。
夏厨が湧き出しちゃったよ。
これから9月まで2ch全体が
つまらなくなるだよな。さっさと
夏終われ。ガキは学校でクセエ
汁垂らして部活でもやってろ。
あーあー、ウザイウザイw
0973デフォルトの名無しさん
2005/07/16(土) 19:15:10ガキ相手に「ボクの遊び場を荒らすな〜!」ってか?
0974デフォルトの名無しさん
2005/07/16(土) 19:18:19void method(int (*array)[10]){}
と書けば答えてもらえたんですかね?
>>969
>>971
的確なアドバイスをありがとうございました。
>>972
笑いを提供できて幸いです。
0975デフォルトの名無しさん
2005/07/16(土) 19:28:45C++とCは違う
0976ikaikaikajika
2005/07/17(日) 00:52:48改良してほしいんです。 これは お茶を置いたら タッチセンサーが感知して
ロボット発進、そしてお茶を持ってるときに 障害物を 光センサーが感知
すると 止まり、お茶を取られると、180度回転して、帰るのですが、帰る途中に
障害物を光センサーが感知すると 避けて行くように してほしいんですが?
どうでしょうか?
0977デフォルトの名無しさん
2005/07/17(日) 00:56:02{
return 0;
}
0978デフォルトの名無しさん
2005/07/17(日) 01:59:36ありがとうございます。なんとかできました。
0979デフォルトの名無しさん
2005/07/17(日) 04:35:36久々にワロタ
0980デフォルトの名無しさん
2005/07/17(日) 17:08:11abc,def,ghi,jikl
mno,ofi,jik,ji,
.
.
以下延々という感じなのですが
リダイレクションを使って標準入力としていいようなのですが、格納の仕方がわかりません。
0981デフォルトの名無しさん
2005/07/17(日) 17:15:490982デフォルトの名無しさん
2005/07/17(日) 17:56:56fgets() + sscanf() w/ "%[^,]"
0984デフォルトの名無しさん
2005/07/17(日) 18:47:31with
0985デフォルトの名無しさん
2005/07/17(日) 19:01:520986デフォルトの名無しさん
2005/07/17(日) 20:19:00>982
関数fgetsと、"%[^,]"を伴った関数sscanf。
0987デフォルトの名無しさん
2005/07/17(日) 23:10:36a[5] = { } とするのはベテランの人から見てどうなんでしょうか。
ネットで検索したところ a[5] = { 0 }
0988987
2005/07/17(日) 23:12:48専門学校の先生には「見た目がよくない」と言われました。
普通に使う書き方なんでしょうか。
0989デフォルトの名無しさん
2005/07/17(日) 23:14:060990デフォルトの名無しさん
2005/07/17(日) 23:21:03金払ってんだろ?
0991デフォルトの名無しさん
2005/07/17(日) 23:25:08a[5] = { }; は規格で認められているのか?
a[5] = {0}; で通してきたぞ俺は。
>>989
memse は初期化と言いません
0992デフォルトの名無しさん
2005/07/17(日) 23:28:30ほかはしかたないから{0}にするけど。
0993デフォルトの名無しさん
2005/07/17(日) 23:28:560994987
2005/07/17(日) 23:33:52= {0} のほうは普通に使われるみたいですね。
将来人に見せることになると考えると「見た目が悪い」という言葉が気になったので。
0995デフォルトの名無しさん
2005/07/17(日) 23:42:550996デフォルトの名無しさん
2005/07/17(日) 23:47:10適所適材。
「見た目が良い初期化」なんか見たことない。
その教員は鏡でも見てたんだろう。
0997デフォルトの名無しさん
2005/07/17(日) 23:48:450998デフォルトの名無しさん
2005/07/17(日) 23:49:18君は先生に質問し、どのような方法であれば見た目が良い方法なのか
ここに報告する義務がある
このスレが終わるまでに報告しなければならない
これは命令だ
0999デフォルトの名無しさん
2005/07/17(日) 23:59:391000デフォルトの名無しさん
2005/07/18(月) 00:01:451000get
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。