このスレッドはC言語について、 他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 C使いが優しくコメントを返しますが、 お礼はC言語の布教と初心者の救済をお願いします。
2 :
1 :2006/07/22(土) 13:28:09
超をつけるの忘れたorz
死ね
#include "stdio.h" #include "stdio" #include "cstdio" の違いを教えてください
C++を使わない限り、stdio.hでOK あと<>な
#include "stdio.h" と #include <stdio.h> の違いを教えてください。
小数点の切り捨てはintでいいの? floorの存在意義を教えてください
長瀬智也です。
長瀬さんこんにちは。cstdioはC++を将来使おうと思っている場合は、これを使っておくと良いでしょう。
>>7 自分でstdio.hというヘッダーを作ったとき、
"stdio.h"だとその自分のヘッダーが読み込まれる。
<stdio.h>だと標準のヘッダーが読み込まれる。
>>8 int型へのキャストでは、小数点部分を単純に捨てるだけ。
floorは、引数の値を超えない最大の整数を返すと定義されており、
負の数のとき、たとえばfloor(-2.5)は-3.0を返す。(int)-2.5では-2になる。
また、結果の値がintで表現できないほど大きかったり小さかったりすることを
想定しなければならない場合ということもある。
15 :
デフォルトの名無しさん :2006/07/24(月) 01:39:19
質の良い乱数の生成方法を教えてください
メルセンヌツイスター
四捨五入は int(x+0.5) で良いのでしょうか?
TT800
>>17 正のときだけを考えるのであればそれでよい。
こうじゃないの? (int)(x+0.5)
でもC++だったらstatic_cast使えと言われるので、 結局17の書き方は使われないと。
>>22 関数スタイルのキャストは普通に使うだろ。
しかも組み込み型への関数スタイルのキャストは
static_castと同等だと保障されている。
>>23 組み込み方へのキャストこそstatic_castなどを使えばすむから関数スタイルのキャストは要らない。
むしろコンストラクタ呼び出しになるのでクラスに対して使う方がよっぽど多い。
あと、組み込み型への関数スタイルキャストは、static_castと同等ではなく、Cスタイルキャストと同等。
static/const/reinterpret_cast全てを兼ねる。
うむ、まぁなんだ ここはC言語スレだということを忘れないでくれよ
>>24 もちつけ。前半は組み込み型について言及したつもりはないぞ。
後半に関しては規格を詳細に読むかTC++PLを読んでくれ。
27 :
C言語超初心者 :2006/07/26(水) 17:19:35
ax^2+bx+c=0 のa,b,cを任意に入力したときのxの解を求めるプログラムを作りたいんです。 誰か教えてくれませんか? ちなみに虚数解iが出る場合にも分けなきゃいけません。
マルチ乙
>>27 ニュートン砲(重力場を瞬間的に反転させることで膨大なエネルギー量を以て物体を放出する兵器)
>>27 ニュートン峰(南米最高峰アコンカグアのポーランド氷河ルート第3キャンプとして人気が高い)
31 :
デフォルトの名無しさん :2006/07/27(木) 22:43:46
下記に定義された関数を使い配列stack[]に任意の整数を5こ連続して 積み上げなさい。次に、それらすべてを読み出し、それらををprintf() で表示しなさい。以上のプログラムを main()関数に記述し完成させなさい。 #include <stdlib.h> #include <stdio.h> #include <ctype.h> #define poland #define N 100 int stack[N]; int n; void init(){ n = 0; } void push(int x){ stack[n++]=x; } int pop(){ return stack[--n]; } int main(){ ここにプログラムを記述すること return 0; これがよく分かりません><教えてください・・
宿題は宿題スレへ
宿題スレは答えを聞く(教える)ところ。
>>31 は自分で理解したいんじゃないか?
おれは親切だからおしえてやる。 #define orz() printf("%d\n",pop()) push(1);push(2);push(3);push(4);push(5);orz();orz();orz();orz();orz();
init()わすれたぜorz
36 :
ど素人 :2006/07/28(金) 02:10:04
前期の追試です。この2問に単位がかかっています。ぜひ、お願いします。 2.通常プログラムカウンタはプログラムの実行にしたがって一定の大きさだけ増えていく. しかし,時に,プログラムカウンタに直前の値とは大きく異なる値がセットされる 時がある.それはどんな時か? 3.次のプログラムは何を行うプログラムか.簡単に説明しなさい.また, 結果を得るまでに,A[k]==aの比較が行われた回数を書きなさい. A=new Array(3, 8, 19, 20, 22, 24, 45); i=0; j=A.length-1; a=19; k=Math.floor((i+j)/2); while(i<=j){ if(A[k] == a){ break; } else if(A[k] > a){ j = k - 1; } else{ i = k + 1; } k = Math.floor((i+j)/2); } if(i>j) k=-1; document.write(a," ",k);
すげぇな、スレ違い(いや、鼬害か)の上にマルチかよ。
何のために単位って概念があるか考えてみたらいいんじゃないかな
memset(dat64, 0, sizeof(dat64)); これはどういう役目をしているかわかりません。 誰か教えて下さい。
多分意味ないから消してみたら?
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define CATE_NUM 10 #define DATA_DIR "/xxx/yyy/zzz/Data/Img" void normal(unsigned char *,short); short hyojun[CATE_NUM][64][64]; unsigned char in_dat[CATE_NUM][200][512]; unsigned char dat64[CATE_NUM][200][64][64]; char *moji[]={"あ","い","う","え","お","か", "が","き","ぎ","く","ぐ","け", "げ","こ","ご","さ","ざ","し", "じ","す","ず"};
void InputData() { FILE *fp; int c_no; char fn[256]; for(c_no=0;c_no<CATE_NUM;c_no++) { int dat_no; sprintf(fn,"%s/%02d.bimg",DATA_DIR,c_no); fprintf(stderr,"read %s ",fn); fp=fopen(fn,"rb"); if(fp==NULL) { fprintf(stderr,"open error %s\n",fn); exit(1); } if(fread(in_dat[c_no],sizeof(in_dat[c_no]),1,fp)!=1) { fprintf(stderr,"read error %s\n",fn); fclose(fp); exit(1); } fclose(fp); fprintf(stderr,"done\n"); } }
void OutputData() { FILE *fp; int c_no; char fn[256]; for(c_no=0;c_no<CATE_NUM;c_no++) { int dat_no; sprintf(fn,"%s/%02d.bimg",DATA_DIR,c_no); fprintf(stderr,"read %s ",fn); fp=fopen(fn,"rb"); if(fp==NULL) { fprintf(stderr,"open error %s\n",fn); exit(1); } if(fread(in_dat[c_no],sizeof(in_dat[c_no]),1,fp)!=1) { fprintf(stderr,"read error %s\n",fn); fclose(fp); exit(1); } fclose(fp); fprintf(stderr,"done\n"); } }
積分について以下の内容がなぜ成立するのか誰か教えて下さい。 現在以下の内容をC言語で書こうとしています。 ∬(x-α)i乗(y-β)j乗f(x,y)dxdy=Mijと記述されます。 ここでα,βは位置の正規化において決まります。 そしてこの値を用い、 大きさの正規化基準:M40+M04=1,傾きの正規化基準:M22=1 と設定するのが標準的な手法であります。 最後にこれについては重心周りのモーメントが必要です。
To6464()は、あるファイルを読み込んだデータのビット操作をして文字画像 に変換している。64x64[pixel]である。 このプログラムについてどのような動作をしている誰か教えて下さい。 お願いします。 void To6464() { 071: int x,y; 072: int c_no,dat_no; 073: 074: memset(dat64,0,sizeof(dat64)); 075: 076: for(c_no=0;c_no<CATE_NUM;c_no++) { 077: for(dat_no=0;dat_no<200;dat_no++) { 078: for(y=0;y<64;y++) { 079: for(x=0;x<8;x++) { 080: int i; 081: unsigned char dat8=in_dat[c_no][dat_no][y*8+x]; 082: for(i=0;i<8;i++) { 083: if( (dat8&(128>>i))>0) 084: dat64[c_no][dat_no][y][x*8+i]=1; 085: } 086: } 087: } 088: 089: /*PrintDat64((unsigned char *)dat64[c_no][dat_no]);*/ 090: } 091: } 092: }
47 :
41 :2006/08/23(水) 03:48:22
>>40 >>41 >>46 memset() は意味があったのか、残念。
083,084 を
dat64[c_no][dat_no][y][x*8+i]=(dat8&(128>>i))>0;
に変えると memset() はいらないぞ。そして質問には答えない。
質問を答えて下さい。 お願いします。
しょうがねえなあ。 あるファイルを読み込んだデータのビット操作をして文字画像に変換している。 かなり無駄っぽい処理だ。
では、なくて45です。 誤解を招くような書き方をしてしまいすみません。
おれは微積とか忘れたから答えられないぞ。覚えてたかどうかすら忘れた。
C言語って半年あれば覚えられるもんなんですか?
人による。 あと、字下げを適当に使うな。
54 :
デフォルトの名無しさん :2006/08/28(月) 15:27:23
32Byte以下の文字データの集合で、40種別に分けられて種別毎の処理をする場合、 TCHAR MojiData[40][200][32] のような配列を作ると思うんですが、 種別毎の文字データの個数がバラバラで、 最高が198個なのに、殆んどは10個や20個程度という場合、 配列で確保したメモリ領域の殆んどは無駄になってしまうと思います。 領域の無駄は無くして、配列みたいに種別ごとの処理をfor文とかで一括処理したい場合、 どんな方法が一般的なんでしょうか。教えてください。
>>54 こんな感じでどうでしょ。
char **MojiData[40];
for (int ic = 0; ic < 40; ++ic) {
MojiData[ic] = malloc(sizeof(char *) * stringCount);
for (int sc = 0; sc < stringCount; ++sc) {
MojiData[ic][sc] = malloc(32);
}
}
実際には、ファイルか何かから読み込むのかな?
数値を入力して、0からその数値までを一つずつカウントしていって 偶数部分には○、奇数部分には□を表示する 例えば5と入力した場合、012345→「○□○□○□」と表示。 この程度の問題すら分からない超初心者なんだぜ? while文を使うとか言われたけど独学じゃさっぱりだぜ
がむばれだぜ?
交互に表示とかもう異次元なんだぜ? それに宿題スレに出すには次元が低すぎる問題だからガチで困る。
>>58 臆することはない。宿題スレには、簡単な問題を解きたがる人もいる。
解く人だって初心者に近い人いるからね。次からはテンプレ書いて投げるべし。
以下、解答例(別に模範解答じゃない。ていうか私ならwhileじゃなくて
forを使うな)。
#include<stdio.h>
int main(void)
{
int num, i;
scanf("%d", &num);
i = 0;
while(i <= num) {
if ((i % 2) == 0) {//偶数のとき
printf("〇");
}
else {
printf("□");
}
i++;
}
return 0;
}
#include <stdio.h> int main() { int ic, num = 0; scanf("%d", & num); for (ic = 0; ic < num; ic += 2) { printf("○□"); } if (ic == num) { printf("○"); } return 0; }
>>55 こんなときのためのポポポインタなんですね。
ありがとうございました。
63 :
デフォルトの名無しさん :2006/08/29(火) 14:10:10
今日からC言語を始めた21歳の大学生です。 Borland C++ Compilerというコンパイラを導入したのですが、 初期設定に悪戦苦闘を強いられて1時間もかかってしまいました。 僕にはプログラミングの才能は無いのでしょうか・・・? 来年からSEとして働くというのに先が思いやられます・・・
64 :
デフォルトの名無しさん :2006/08/29(火) 14:27:05
お勧めorお勧めでないC言語の参考書ってありますか?? あと・・・CとC++の違いはなんですか??
65 :
1001 :2006/08/29(火) 14:34:06
>>63 そんなんだと、これから先の人生が思いやられるよねー
でも、良かったじゃないか就職できて。
プログラムができなくてもSEとして就職できる世の中が悪い。
UNIX(FreeBSD)でforkして子プロセスがexecしたんですが、 親プロセスがwaitせずに子プロセスより先に死んだ場合、 子プロセスの親はinitになるのは判ったんですが、 子プロセスの返り値はwaitを待つために親プロセスが死亡するまで メモリ上に残っているのでしょうか? そうすると、親がinitになった場合の子プロセスの返り値などはメモリを食い続けるんですか? その場合、子プロセスの死亡後のメモリ食いを回避する方法はありますか?
68 :
デフォルトの名無しさん :2006/08/29(火) 15:48:48
ageます
69 :
デフォルトの名無しさん :2006/08/29(火) 16:06:24
参考書・・・教えてください・・・
参考書くらい自分で探せ
>>67 言語の範疇を超えているので、鼬害ですね。
>>67 「孤児プロセス」という単語でいろいろ調べるんだ
入門(どちらか一冊) 柴田望洋か結城浩のC入門本 中級 前橋和弥「C言語 ポインタ完全制覇」 少しプログラミングができるようになったら 平林 雅英:新ANSI C言語辞典 さらにアルゴリズムやデータ構造が気になりだしたら 紀平拓男・春日信弥:プログラミングの宝箱 アルゴリズムとデータ構造
>>65 やっぱり厳しいですよね・・・
Java言語は完璧なんですけどね。
>>66 SEはけっこう文系の人が多いんですよね。
接客が中心だからかもしれないですけどね。
75 :
デフォルトの名無しさん :2006/08/30(水) 00:39:15
>>6 まったくの初心者ならSEの倉薫さんの本(全2巻)をおすすめします。
柴田さんや結城さんの本はそれからのステップアップでいいとおもいます。
>74 >Java言語は完璧なんですけどね。 ダウト。 Javaは本当にやり込むと、 多数のOpenSourceのプロダクトやその関連など、 多岐にわたる知識と、それぞれの環境構築、 そしてそれぞれを活用するコーディング能力と、 実際に要求されるスキルはかなり高度なモノになる。 これだけ情報が多いBCCの初期設定に四苦八苦しているようなレベルで 「完璧」とは笑わせてくれる。
>多数のOpenSourceのプロダクトやその関連など そっちに行くのもナニだな・・・ おれはJVMの実装とかの話に行くと思ってたんだが
いや、彼は初期設定に苦労したらしいから。w
Javaが完璧ワロス
そう言いたい年頃なのさ。 色んなこと知れば知るほど「完璧」なんて言えなくなるのにな。
落ち着けお前ら。
>>63 は自身にプログラミングの才能が
あるかないのかを聞いているだけだ。
まあ、才能なんか皆無だろうし、現時点でJavaを完璧にこなせると
思いこんでいるような奴は努力しないだろうから今後にも期待できないな。
世のため人のために転職しろ。
俺の童貞は完璧なんだがな
><
85 :
63 :2006/08/30(水) 11:17:52
釣りです。ごめんなさい・・・ 大学で1年間Javaの勉強はしたんですけど、 教科書に載っている基礎的なプログラムしか組んでません。 JavaかCのどちらかを選択する時に友達が、 「今の時代の流れはJavaだぜ!」と言うのでJavaにしました。 先生も「今の企業はJavaを使っているところが多いから、 後々役に立つよ!CはJavaが出来るようになれば楽にマスター出来るさ!」 って言ってました。
一番悪いのはこんな役立たずにSE内定を出した企業だ。
>>85 じゃあ、Java 完璧だから C も楽にマスターできたんだね。
実力なくて学歴で入った奴は 周囲の期待を裏切った罪でいびられて一生を終えるぞ 初期設定に戸惑ったり釣り宣言したりせずにとっとと勉強しろ
俺もJavaつついてC→C++と移行したクチなんだが、 未だにcppに実装を書いて、hに定義だけ書くっつースタイルに慣れない。 定義と実装を同じ所に置いておかないと、 interfaceが変わったときとかめんどくさくね? ファイル数が増えると、管理対象も増えるってことで、結構面倒だし… 別に誰にソース見せるわけでもないから、 全部hに書いて組んじゃってるけど、 これって熟練者からすると、噴飯ものだろうなぁ。
コンパイルの単位がファイルだ、とか、いわゆるファイルスコープの変数とかいう 歴史的な理由が大きいからしょうがないだろう。 >全部hに書いて組んじゃってるけど 処理系によっては全部インライン展開されちゃうぞ
>>91 ファイルが増えると、コンパイル時間が馬鹿にならなくなってくる。
個人レベルの規模でも、一瞬でコンパイルが終わるケースなのに数十秒かかったりとか。
>>94 2週間近く経ってから何を意味のないことを……
96 :
デフォルトの名無しさん :2006/09/14(木) 15:00:53
入門書を終えた段階くらいのレベルで、マインスイーパって作れますかね? 10*10くらいなら行けそうな気もしますが・・・
>>96 作れる香具師は作れるし、作れない香具師はいつまでたっても作れない
>10*10くらいなら行けそうな気もしますが
10*10と20*20で何が違うのか述べよw
10*10が稼働していれば、サイズの違いがどれほどコードに影響する?
イヤマテ、「もし右上に地雷があったら〜 もし真上に地雷が〜」を 10*10個分並べるんだと思ってるのかもしれん。 「11*10にするには、右端の1列ぶんを全部書き直さなくちゃ! きゃ〜〜〜たいへ〜ん」
99 :
デフォルトの名無しさん :2006/09/14(木) 23:05:49
確かにそうですね、10*10と20*20は同じプログラムですねorz 何とか自力でやってみます
再帰使うと楽ですよと。
先ずは、1x1から作ってみたらどうだろう。
数字の桁数を求める標準ライブラリってありましたっけ?
ない希ガス。 n進数をnで割りまくる方法ですぐ作れると思う。
104 :
102 :2006/09/20(水) 00:23:44
>>103 ありがとう、無いと聞いて安心して自作した
浮動小数点数だったらlog10などがあると言えると思う。
itoaとstrlenでどうか。
ダメすぎ
C言語でw2kとIISで動くウェブアプリケーションを作れますか?
たいていの言語でつくれるよ
使用環境はCygwin+gcc+Meadow又はvimなんですが 入門書にあるとおりエスケープ文字を入力するとコンパイルエラーではじかれてしまいます。 例としては #include <stdio.h> int main(void) { pritnf("aaa\n"); printf("bbb\n"); return 0; } などのソースでコンパイルしようとすると $gcc ch02-20.c /cygdrive/d/Temp/ccckx0DW.o:ch02-20.c:(.Text+0x32): undefined reference to 'printf' collect2: ld はステータス 1 で終了しました とのエラーが出てしまいます。 Cの初心者なので環境が悪いのかソースが悪いのかもわかりません。 解決方法がわかりましたらよろしくお願いします。
pritnf ~~
>>111 しかし、エラーメッセージはprintfが参照できてないと読めるが。
113 :
110 :2006/10/09(月) 13:04:02
>>111 様
これで一晩悩んでいたうつけでございます。
どうぞ罵ってください。
本当にありがとうございました!
>>112 ソースのコピペすら出来ていないとすればエラーメッセージの正確なコピペを期待しちゃいかんだろ。
stdioとcstdioの違いを教えてください
スレ違い
117 :
117 :2006/10/12(木) 21:41:39
すみません、ちょっと質問なんですが、 staicを付けて宣言した関数ってのは return 後もメモリ上に配置されたまま 残り続けるんでしょうか? 他のファイルから見えないようにしたいんですが、メモリ上に残り続けるんなら staticは付けずに、プライベートヘッダファイル内でextern付けて宣言して、 それをincludeするのにとどめておいたほうがいいんでしょうか? よろしくお願いします。
関数のstaticはメモリーとは関係がない。
ノイマン型コンピュータは普通命令はメモリにありますよ
>>117 staticは付けずに以降のくだりは意味が良くわからないが、
おそらくグローバル変数を使うということだよな。
ならばそんな変数が存在する期間はstaticを付けた変数と同じ。
どちらもプログラム開始から終了まで存在し続ける静的記憶期間を持つ。
>>120 > staicを付けて宣言した関数
欲嫁
すっかり見落としていた_| ̄|○
123 :
117 :2006/10/13(金) 00:33:03
>>118 あ、そうなんですか。
気にせず使えってことですよね? たぶん。
ありがとうございます。
>>119 すみません。ちょっとよく分からないです。
>>120 すみません、はしょり過ぎて意味不明な書き方をしてしまって。
目的は、他のファイルに公開する関数と、そうでない関数とに区別を付けながら書くことです。
staticを付けた関数は、他のファイルからは見えないらしいので、これを利用しようと思いました。
でも、staticと聞くと、ついつい局所変数につけるstaticみたいに
静的領域に割り当てられて、プログラム実行中に常に値を保持するという連想をしてしまったので、
無闇に関数にstaticをつけるのもメモリの無駄遣いかなと思ったわけです。
(
>>118 さんによるとメモリとは関係ないらしいので杞憂ですが)
そこで、浅はかですが、他のファイルに公開しない関数のプロトタイプ宣言を、
ヘッダファイルに書いて、それをincludeするモジュールとincludeしないモジュールとで区別をつけて、
コンパイラの「暗黙の宣言エラー」を頼りに、手動で管理しようと思ったわけです。
これでは、実際には他のファイルからも呼び出せちゃいますけど、
気持ちとしては他のファイルに公開してるつもりかどうかを意識しながら書けると思ったもので・・。
長文ですみません。
ライブラリとかだったら、公開する関数だけをヘッダファイルに書くようにすればいいと思うよ。
staticな関数がメモリ上にあるかどうかはコンパイラ次第。
もしかしたら、インライン展開によって痕跡さえも消えてなくなっているかもしれない。
>>123 と言う話はさておき、一般に関数はプログラムがロードされている間はメモリ上に存在し続けるぞ。
つまり、staticをつけない方が寧ろメモリを消費すると言えるかもしれない。
従って、公開したくない関数にstaticをつけるのは、いろんな意味で正しい姿勢だ。
☆ ☆☆ ☆☆☆ ☆☆☆☆ ☆☆☆☆☆ ↑ これを再帰ってやつを使って表示させたいんです。 お願いします。
127 :
117 :2006/10/13(金) 02:27:17
>>124 最終的にはライブラリみたいなのを作りたいんですが、
そのライブラリを作るために書いているソースファイルが複数(たとえばa.c, b.c, ...)あって、
ソース間の関数の呼び出し合いが入り乱れて混乱するのを避けるため、
a.cの中には、「a.cの中の関数だけに利用させたい関数」と「b.cが呼び出す関数」もあるという状態です。
この例では、上手く伝わらないかもしれませんが・・。
>>125 極端なことを言えば、コンパイラによっては、関数を呼び出してる部分を
ジャンプとリターンの形じゃなくて、インライン展開しまくりで実現するかもしれないから
サイズが大きくなる場合もあるってことで合ってるのかな?
とにかく
>と言う話はさておき、一般に関数はプログラムがロードされている間はメモリ上に存在し続けるぞ。
>つまり、staticをつけない方が寧ろメモリを消費すると言えるかもしれない。
>従って、公開したくない関数にstaticをつけるのは、いろんな意味で正しい姿勢だ。
とのことなので、公開したくない関数にはstaticを付けていこうと思います。
丁寧な回答ありがとうございました。
128 :
117 :2006/10/13(金) 02:33:51
>ソース間の関数の呼び出し合いが入り乱れて混乱するのを避けるため というのは、ソースを書いているうちにどのファイルにどの関数があったかとか、ファイルの管理で自分が混乱するということです。 すれ汚ししてしまって、すみません。
ファイルの粒度が小さすぎるということはない? a.cとb.cを特に分ける必要も無いのに分けてるとか。 複数のファイルがお互いに参照しあってるという状況になってるとしたら、それは分けすぎかも。 あるいは、a.cとb.cが参照する関数は、mylib_util.cとかにまとめて、a.cとb.cはそれをincludeするとか。
>>126 if (n>1) func(n-1);
for ...
>>130 さん
#include <stdio.h>
#define N 5
#define I 1
void rec(int,int);
int main()
{
rec(N,I);
}
void rec(int n,int i)
{
if(i<=n){
printf("☆");
rec(n,i+1);
}
else{
printf("\n");
if(n>1){
rec(n-1,1);
}
}
}
これの逆バージョンを作りたいんです。
関数1つでforとかwhileとか使わないで
再帰だけでやるやつをお願いします。
typedef struct original {....} a; という記述で、自分で構造体を定義しました。 このとき void function (original *) という関数を作って、main関数から呼び出したのですが function( a ) ではうまくいかず function ( &a ) ではうまくいきました。 構造体の変数名はポインタを表すと思うんですが、この場合はなぜ&が必要なのでしょうか?
134 :
133 :2006/10/15(日) 05:47:02
typedef struct original {....} a; の書き方が間違っていました… typedef struct {....} original; original a; です。
> 構造体の変数名はポインタを表すと思うんですが、 なぜそう思うのか、理由を100字以上30字未満で述べよ。
配列と混同している予感。
137 :
133 :2006/10/15(日) 10:09:40
>>135 あっー!そこがそもそも間違いだったんですねorz
>>136 はい、その通りです…
以前、構造体の配列を扱ったときは&がいらなかったので、
配列の場合と混同してました。
どうもありがとうございました。
ハッシュ検索って何ですか?
139 :
デフォルトの名無しさん :2006/10/15(日) 18:35:38
複数のファイルから利用される、変更されないconstデータは どこに、どのように書くのが普通でしょうか? ヘッダにstaticで定義する? どこかの.cファイルに定義して、ヘッダにextern宣言する?
cのconstのリンケージってC++同じだっけ?
ある数が2のべき乗かを調べるプログラムらしいのですが、 C言語はさっぱりなので、プログラムの意味がよくわからんです。 入力された数から、マイナス1して入力された数とビット演算すると言うことでしょうか? bool powOFTwo(int num) { return !(num & (num-1)); } 教えて下さい。
>>141 そんな感じ。
(入力した数) と (-1した数) とでANDをとって
全ビット0だったら関数の戻り値としてtrue(1)を返す
base64エンコードする関数って標準ライブラリにある?
144 :
141 :2006/10/17(火) 22:31:38
>>142 ありがとうございます。
なぜ、それでべき乗になるのか、算数の勉強だな。
146 :
141 :2006/10/18(水) 10:31:32
あはは、2進数で考えたらすぐですね。 お恥ずかしい。
現在の時間を百分の一秒まで取得する関数教えて。
System.currentTimeMillis()*10
ありがとう。早速試してみるわ。
ではCでは?
秒単位ならtime()でできるんだけど
標準関数にはないので、環境ごとにマニュアルでも読んでくれ。 まぁ、gettimeofday()が使える環境は多いが。
だらだらと長い計算をやっているプログラムのどこかでNaNが発生しているので、 signal(SIGFPE, sighandle); を使って、その場所を調べようとしているのですが、signalが発生しません。 ためしに、 double a=1/0; とか入れると、その場所でsignalが発生するのですが。 計算がうまくいっていない場所を調べるにはどうすればよいのでしょうか。 システムはDebian Linux, コンパイラはgcc4.1です。
>>154 FPUが例外を出さない設定になっているとか、たまたまFPUを使わないで演算しているときに発生しているとか。
C言語を始めようとVisual Windows for BC++をインストールしたのですが、フォルダが設定されていないらしく先に進めません フォルダの自動検索・設定を実行しても未検索で終了になってしまいます。 これはインストール方法が悪かったのでしょうか?それともPC上にMeだからでしょうか? できれば手動での設定の仕方か解決方法を教えてください
PHP, Ruby, PerlしかしらないWEBプログラマなんですが、 Cもちょっくら勉強しようかと思います。 なんか目的がないとつまらないので、作るものを決めてそれに向かってがんばろうかと思ってんだけど Cで作れそうなものが思い浮かばないんだよね。 WEBだったらこんなサービスあったらおもしろそう =>つくろう!ってなるんだけど。 Cだと何作っていいのかわからん。 おもしろそうなものあったら教えて。
Cよりもアセンブラやった方が速く習得できるよ。
何が面白いと感じるかは人それぞれであり、 結局のところ自分がそれをはっきりと自覚していない限り 他人に自分のそれを求めるのは理不尽というものではないだろうか。
普段PHPとかRubyとかPerlでやってることをCでやればいいじゃん
char (*ptr[])[] を定義と同時に初期化するには char str1[]="hello"; char str2[]="begin"; char str3[]="wacth"; char (*ptr[])[6]={&str1,&str2,&str3}; のようにやる以外にやりようはないですか?
char hoge[10],foo[10]; fgets(hoge,10,stdin); fgets(foo,10,stdin); としたときに、最初のfgetsで半角で9文字以上入力したときに二番目のfgetsが飛ばされてしまう(というか最初の出オーバーした分を受け取って次へ行ってしまう) のですが、どのように回避すればいいのでしょうか?
\nまで読み捨てる。
読み捨てする、というのはどのようにすればいいのでしょうか?
167 :
162 :2006/10/29(日) 20:39:12
>>166 普通の配列と同じように事前に何かを用意しなくてもいきなり定義できないのかな、と
例えば
char str[][6]={"hello","begin","wacth"}
みたいにです
必要性無視した単なる可能不可能を知りたいだけの質問で申し訳ないんですが…
>>167 >167のようにただの配列の配列(の配列……)なら普通に初期化できる。
>162のようにポインタが介在すると、そのポインタを初期化するために、別途初期化された変数が必要になる。
それだけのこと。
>>165 while (fgetc(stdin) != '\n') ;
とすれば改行まで読み捨てられる。
#但し、入力が閉じられるなどの異常に対応していないので、必要なら対策すべし。
>>167 char str[][6]={{"hello"},{"begin"},{"wacth"}};
データの境界を教えてあげるために、{} でくくるだけなんですよね。
171 :
162 :2006/10/29(日) 21:53:46
>>168 ,170
あ、なるほど、そこが同時では無理だったんですね
ありがとうございました
>>169 ありがとうございます
char hoge[10],foo[10];
fgets(hoge,10,stdin);
while (fgetc(stdin) != '\n') ;
fgets(foo,10,stdin);
そこで以上のようにしてやってみたのですが、最初のfgetsで9文字以下の入力をされたとき
while (fgetc(stdin) != '\n') ;
で一度エンターをおさないと二番目のfgetsに進まなくなったのですが、使い方間違ってるのでしょうか・・?
>>172 読み捨てる必要がないときには読み捨てるな。
>>173 strlenあたりで判定するんでしょうか
やってみます、ありがとうございました
つーか、最後に改行がなければ読み捨てる必要があって、 最後に改行があれば読み捨てる必要がないのだろう。
大域ヘッダーファイルの〜〜.hと7つの原始ファイル〜.cを動かすにはどうすればいいですか?
変数の種類で、ポインタ以外のもの全般の事は一般的になんと呼ばれますか?
Windows用のコンパイラだと、printf関数とかfopen関数は内部的にはWinAPI呼び出して処理してるんですか?
Hellow Worldから解説してるサイトを教えてください。m(__)m
入門書買ったほうがいいんじゃ無いか? ついでに、C言語ってぐぐればどっかでてくるんじゃね?
いや、まずは中学の英語の教科書からだ
Linux入れたらC言語覚える前にシェルスクリプトですよね?
constについて質問があります。 他のシステムに以下のような関数があり void foo(const void *prm); 実際にはprmには構造体のポインタを渡しています。 constなのでこのポインタが指す先の構造他はfooでは変更できないという認識なのですが、関数を呼び出し終わって構造体を見てみるとメンバが書き換わっている場合があります。 fooのソースがないので、その関数内で書き換えているのかいないのか定かではなく、問い合わせをしようと思っているのですが、constがあるのに中身を書き換えていませんか??と問い合わせるのは抵抗があります。 constの付いた引数がポインタだった場合、ポインタの指す先が書き換えられないんですよね?
キャストしてconstを取ってやれば可能。
便乗で質問。 関数内部で書き換えるのに、引数にconstをつける理由ってなに?
>>185 ライブラリ設計時点では内部を書き換える予定はなかったが、
実装段階で書き換える必要が出た場合。
全然constの意味ないな
すみません、この問題のプログラムはどう作ればよいのかがわからないので ぜひ、よろしくお願いします・・・ 問題 配列su(要素数:12)に任意の数値をランダムに初期値設定し、逐次決定法によって 整列(昇順)させ、結果を表示させるプログラムを作成してください。
マルチ氏ね
殺人未遂の容疑でタイ━━━━||Φ|(|゚|∀|゚|)|Φ||━━━━ホ!!!!!!
ダイテル本の練習問題3.36「二進数を十進数にするプログラム」が書けない・・・ アドバイスか罵声、誰かたのむ
printf("%d",x);
strtol(s,0,2);
>>191 同じとこやってたから書いてみた
int main(void)
{
int bin, dec, a, b, c, d;
printf("0と1のみで数字を入力:");
scanf("%d", &bin);
a = bin / 1000 * 8;
b = bin % 1000 / 100 * 4;
c = bin % 1000 % 100 / 10 * 2;
d = bin % 1000 % 100 % 10;
dec = a + b + c + d;
printf("%d\n", dec);
return 0;
}
binは2進数でdecが10進数。
でもこれだと4桁までしか入力対応してない上、binに1と0以外の値入れても反応する。
whileとシフト演算子使ってどうにかならないのかな
>>194 %xで十六進法で入力させれば除算・剰余算をシフト・ビット積にできる。
それだったらfgets()で入力して、strtol()で変換してもいいね。
>>194 for(i=0,dec=0; bin; i++) {
if(bin%10) dec += pow(2, i);
bin /= 10;
}
やりたいことはこういうこと?
198 :
194 :2006/11/19(日) 19:11:51
>>197 調べたところpowはこの場合(2のi乗)を返すということなので、おそらくそういうことです。
ただ本の進行度として、for文と関数powを使用していません。
197さんのソースを参考にして、作り直してみたところ、実行することができました
while (bin)
{
if (bin % 10)
{
dec += i;
}
i *= 2;
bin /= 10;
}
ありがとうございます。
199 :
191 :2006/11/19(日) 23:09:29
>>194-198 thx
自分も同じように任意の桁の二進整数を入力した時の
変数宣言後の反復構造の扱いに苦慮していました
参考にさせて頂きます
200 :
デフォルトの名無しさん :2006/11/20(月) 21:05:57
data[0][0][0]=data[0] data[0][0][1]=data[1] data[0][0][2]=data[2] data[1][0][0]=data[3] data[1][0][1]=data[4] data[1][0][2]=data[5] data[2][0][0]=data[6] data[2][0][1]=data[7] data[2][0][2]=data[8] … data[0][1][0]=data[3w] data[0][1][1]=data[3w+1] data[0][1][2]=data[3w+2] data[1][1][0]=data[3w+3] data[1][1][1]=data[3w+4] data[1][1][2]=data[3w+5] というふうに1次元配列のrgbデータをを3次元配列で表したいんですがどうすればよいですか?
諦めてオフセット計算用関数を用意するのが一番無難かもね。 Ex. static inline int offset(int p1, int p2, int p3, int w2, int w3) {return p1 * w2 * w3 + p2 * w3 + p3;} あー、rgb限定ならこれでもいいか。 static inline int offset(int p1, int p2, int p3, int width) {return p1 * width * 3 + p2 * 3 + p3;}
遅いレス
>>183 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct {
int a;
char *s;
}HOGE;
void foo(HOGE *hoge){
hoge->s[2] = 'G';
}
int main(void)
{
HOGE hoge;
hoge.s = (char *)malloc(strlen("piyo") + 1);
strcpy(hoge.s, "piyo");
foo(&hoge);
printf("%s\n", hoge.s);
return 0;
}
要するに、構造体ポインタにconstつけた場合、 構造体そのもの、メンバにはconstがついて変更できないが、 構造体のメンバが指すもの(hoge->s[2])についてはconstにならない。
204 :
デフォルトの名無しさん :2006/11/21(火) 01:41:13
以下のような3つのペアの実数をファイルに書き、 それらのペアを配列を使って読んで、 それぞれの四則演算を別のファイルに書き出しなさい。 5.0 3.0 2.5 1.0 4.0 1.5 って課題が授業で出てサッパリわかんなくて困ってるんですが、 どなたか助けていただけないでしょうか?
WinXP,VC++6.0で 0〜4294967295の符号なし長整数を 扱いたいのですが #include <stdio.h> int main() { long int v1 = 4294000000; unsigned long int v2 = 4294000000; printf("符号付\t\t= %d\n",v1); printf("符号なし\t= %d",v2); return 0; } 実行結果: 符号付 = -967296 符号なし = -967296Press any key to continue となってしまいます。 どうしたら4294967295まで扱えるのでしょうか? ヘタレですいませんが、どなたかお願いします。
>>205 変数がそこまで扱えていても、出力で制限しちゃダメだべ。
long intは%ld、unsigned long intは%luで出力すべし。
>>206 あぁ、ナルホド!
出力時のtypeが悪かったんですね。。。
ありがとうございます〜。
/* 自然対数の底eの近似値を求めるプログラム */ #include<stdio.h> main() { float e = 1.00; int count = 1, n = 1, counter = 1; while(counter < アレ){ while(count > 0){ n *= count--; } e += 1 / (float)n; ++counter; count = counter; } printf("自然対数の底eの近似値は %f", e); return 0; } アレの値を11以上にするとプログラムが動きません 6以上でも出力結果が2.586834のまま変わりません どなたかアドバイスお願いします
>>208 nを算出するループの外側で、printf("%.20g, %d\n", e, n);として見給え。
要は、nがある程度大きくなるとfloatの精度では数値が変わらなくなるし、更に大きくなるとそれ自体がオーバーフローする。
#そもそもその近似式はあっているのか?
愚直に計算するように直してみた。 ・long doubleで精度を確保 ・long longで階乗もOK ・逆順で計算することで誤差を減らす でも微妙にmath.hのM_E(2.7182818284590452354)と違う…… -- #include<stdio.h> int main() { long double e = 0; for (int counter = 21; counter >= 1; --counter) { unsigned long long n = 1; for (int count = 1; count < counter; ++count) { n *= count; } e += 1.0 / n; printf("%.30Lg, %llu\n", e, n); } printf("自然対数の底eの近似値は %.30Lg", e); return 0; }
>>209-210 ありがとうございます
>>209 のようにプリントした結果、n導出後にnの初期化を忘れていたようです
くどいプログラムとなりましたが、
>>210 と併せて参考にさせていただきます
fprintf(stdin,"hogehoge"); のようにして標準入力バッファにどこかからの入力を出力する(つまり保持させる)ことは出来ないんでしょうか?
213 :
212 :2006/11/22(水) 15:47:21
こんな感じでやってみた時はだめでした #include <stdio.h> int main() { int c; fprintf(stdin,"hogehoge"); while( ( c=fgetc(stdin) ) != EOF ) putchar(c); return 0; }
>>213 そりゃ無理だ。だが、環境とやりたいことによっては似たようなことはできる。
215 :
212 :2006/11/22(水) 19:22:11
>>214 どのようなものでしょう?ただ興味があるだけで活用法はパッと思いつかないんですが、できれば教えていただきたいです
標準入力の入力バッファとかストリームと呼ばれるものはstdinが指す先にあるFILE構造体にあるんですよね
ファイルの状態としてはfopen("stdin","r")みたいに読み取り専用になってるでしょうか?
環境も書かないような初心者には無理だろ。
217 :
212 :2006/11/24(金) 12:27:59
>>216 すみません、OSはWindowsXP、コンパイラはVC++Toolkit2003を使っています。
キーボードからの入力以外に、直接文字配列を標準入力に入力することは出来るのか
出来るとしたらどのように実現しているのかが、さわりだけでも興味があったので
環境依存で自分の環境ではできなくても特に不満はないです
Unix系ならecho foo| yourProgramで標準入力にfooが入力されるわけだが。 勿論これはfooが事前に決定できる文字列の話なので、 自前で文字列を用意して自分自身の標準入力で受けるのならパイプでも使わないと無理だが。
219 :
212 :2006/11/24(金) 16:29:31
>>218 パイプってまさしくそういうことだったんですね、ありがとうございます
パイプがやってる処理を自前でソースの中に組み込むことは出来るんでしょうか?
つ[pipe()] 今話題の用途には使いにくいが、お手軽にはpopen()も。
大域ヘッダーファイルの〜〜.hと7つの原始ファイル〜.cを動かすにはどうすればいいですか? vc++で動かしたいのですがlinuxでやってたリンク編集とかが分からなくて、 できればVCでの手順などを教えていただけませんか?
222 :
212 :2006/11/24(金) 17:20:55
>>220 おお、こんな関数があったんですね、ありがとうございます
ぐぐったところには出力の方はあっても入力の方がなかったのでおぼろですが
fprintf(stdin,"hogehoge");みたいなことをしたいのならこんな感じでしょうか?
int filedes[2];
char buf[256];
pipe(filedes);
close(STDIN_FILENO);
dup2( fd[0] , STDIN_FILENO );
write( fd[0] , "hogehoge" , 256 );
223 :
212 :2006/11/24(金) 17:30:23
すみません弄ってたら余計なものが残ったままでした… char buf[256];は省いて、writeの第3引数は9にして下さい
>>222 大体あってる、でも、ひとつ間違いがあってwriteするほうが1、readが0
あとdup2の前でcloseする必要はない。dup2がやってくれる。
#include<unistd.h>
#include<stdio.h>
int main()
{
int fd[2];
char buf[256];
pipe(fd);
dup2( fd[0] , STDIN_FILENO );
write( fd[1] , "hogehoge" , 9 );
read( fd[0] , buf , 9 );
puts(buf);
}
225 :
212 :2006/11/25(土) 16:44:17
>>224 レス遅れてすみません、理解するのに時間掛かってました
dup2( fd[0] , STDIN_FILENO );でキーボードからの入力を無効にして
write( fd[1] , "hogehoge" , 9 );で本来なら画面に出力されるところをパイプが受け止めて
read( fd[0] , buf , 9 );でキーボードからの入力を受け取るところ、すでにパイプに
保持されている文字列を受け取っている、という理解でいいでしょうか?
そうなると、パイプがバッファリングに使う領域=標準入力がバッファリングされる領域=標準出力がデータを取ってくる領域
ということなんでしょうか?
超初心者なんですがreturn 0;ってどういう意味ですか?
0を返すという意味です
特にmain関数の場合は、正常終了した場合0を返すと定められています。
式の中では0は偽で0以外が真なのに、0を返すことが正常終了になってるのは 単にそうすれば0以外の値にどんなエラーだったのかそれぞれ意味を付加ことができるから?
付加する、だった
>>229 そのアプリケーションを呼び出すシェルでは逆に0が真で0以外が偽なんだと。
シェルスクリプトでバッチ処理とかする際に対応がきちんとしてるとバグの混入を防げる。
233 :
212 :2006/11/27(月) 16:32:34
何度も長文ですみません
勘違いしていました、pipe()は標準入力or出力の間に入って本来とは違う場所へ出力できるバッファ=パイプを作ってるわけですね
>>212 の話に戻るのですが
for(c=0;c<10;c++)
*(stdin->_ptr+c)=c+'0';
fflush(stdin);
printf("%s\n",stdin->_ptr);
等のようにstdinの指すFILE型構造体の中身を操作してもちゃんと動作するのに
何故fprintf(stdin,"hogehoge")やsscanf("%s",stdin->_ptr)はできないのか不思議です
またstdoutの場合stdout->_ptrは常時NULLを指していて、何か代入しても無視されNULLのままで
ポインタ演算や逆参照をすると、コンパイル自体は通るものの不正終了してしまいます
stdinやstdoutは普通のファイルポインタとはちょっと違うみたいですね
無理なものは無理だとしてとりあえず先に進むことにします、付き合っていただいてありがとうございました
lseekのlはleadのですか?
何故唐突にleadが出てくるのかが分からない。
>>235 なんとなく探す場所に導く(lead)って意味なのかなと…
柴田望洋の明解C言語って本を渡されたが これ演習の答えがないと答えがあってるか不安になるなorz チラ裏でスマソ
>>236 location seek じゃないかなあ?
239 :
234 :2006/11/29(水) 19:28:52
>>238 あ、なるほど。それっぽくてすっきりしました、ありがとうございます。
open <-> fopen read <-> fread write <-> fwrite close <-> fclose なのにseekは lseek <-> fseek なんだよね。 昔システムコールにseekがあってlseekに拡張されてseekがobsoleteになったとかなのかね?
lseek()のlはlongのl
>>241 オフセットの型がintなseekが最初にあってlongに拡張されたlseekに置き換わった?
そして今やオフセットの型はoff_tなんだよね。longに結び付けられてたりするけど。
でもシステムによってはintだったりすることもある。
243 :
234 :2006/11/30(木) 17:57:49
>>241 longですかー、うーん下らない部分だと分かっていても気になってしまう
fseek だって、_fseeki64 とか言うのが出来たしな
年賀状の当選番号を検索するってプログラムを作ることになったけどわかんない・・・ 具体的には例を出すとあたり番号が「012345」というのがあったら入力が出来ないということです ですので、文字列としてやって見ようと思うのですが6文字(1等は6桁のため)と言う風に定義が出来ない・・・ タスケテ・・・
誰が何の目的でそんなプログラムを必要とするのだろうとふと思った
一応宿題ってことになってます
>245 別に先頭が0でも数字として入力できないわけじゃないだろ? 当選番号の桁数は決まってるんだから、入力された数字から12345を引いて 1000000で割った余りが0なら当選ってすればいいじゃん。
fprintfでも使えば?
こういう書き方ってひょっとしてまずいんでしょうか。 この関数にsizeofで260の文字列入れて、戻り値をsizeofしてみたら4だったんですけど、 その戻り値の文字列をprintfしてみたらどう見ても4じゃおさまりません。 ものすごく不安です。 // rev_strstr関数 // strstr関数を文字列の後ろから行う char* rev_strstr (char* check_str, char* search_str){ char* rev_search_str; char* rev_str; rev_search_str = strrev(search_str); rev_str = strrev(check_str); rev_str = strstr(rev_str, rev_search_str); return strrev(rev_str); }
ポインタのサイズは今の時代はまだ4で通用するかな あと何年かすると8で当たり前じゃんこのじじぃがとかいう時代になるのかも
それだけでは判断が付かないが、sizeofの結果が4になるというのは、 おそらくsizeof (char*)ということになっているのだろう。
ちなみにANSI Cの文字列は0終端だから strlenって関数で長さを知ることが出来る。
258 :
254 :2006/12/03(日) 01:08:31
ありがとうございました。strlen関数で実際のchar配列の要素数と同じ数字を得られました。 内部的に配列になってないんじゃないかと心配したんですが、そういうことじゃなかったんですね。
259 :
250 :2006/12/03(日) 18:56:34 BE:184086836-2BP(111)
250です 一応自分で作ってみたのですが無限ループらしく落ちてしまいますorz どこが原因か見ていただけないでしょうか #include <stdio.h> #include <string.h> #include <stdlib.h> /* 定数 */ #define FNAME1 "uho.txt" /* 読み込むファイル名 */ #define FNAME2 "yaranaika.txt" /* 吐き出すファイル名 */ /* 関数のプロトタイプ宣言 */ int split_date(char* buf); char *declast(char saba[20]); /*グローバル変数として宣言*/ FILE *fp1,*fp2;/* ファイルポインタ */ /* main関数 */ int main(void) { /* 変数宣言 */ char buf[512]; /*uho.txtから読み込むデータのための配列*/ /*uho.txtを読み込みモードで開く*/ fp1 = fopen(FNAME1,"r"); if ( fp1 ==NULL) { printf("ファイルオープンに失敗したんです><\n"); return 1; }
260 :
250 :2006/12/03(日) 18:57:16 BE:122724926-2BP(111)
/*yaranaika.txtを上書きモードで開く*/ fp2 = fopen(FNAME2,"w"); if ( fp2 ==NULL) { printf("ファイルオープンに失敗したんです><\n"); return 2; } /*uho.txtから一行分のデータを読み込む*/ while(fgets(buf,256,fp1)!=NULL) { /*データの取り出し*/ split_date(buf); } /*uho.txtを閉じる*/ fclose(fp1); /*yaranaika.txtを閉じる*/ fclose(fp2); return 0; }
261 :
250 :2006/12/03(日) 19:00:49 BE:122724162-2BP(111)
>>261 strtok()何ぞを使っている段階で読む気が失せた。
sscanf()で、%[^/]でも使えば?
{ int i=0; int temp=0; for(i=0;i<n/2;i++) { temp = a[i]; a[i] = a[n-i-1]; a[n-i-1] = temp; } } これは逆順の関数なんですがaをポインタ形式に書き換え様としています。 自分でやったら動作がおかしくなるorエラーなので、誰か手本を下さい。 ポインタをよく分かってなさそうなので参考にもしたいです。
a[x] → *(a+x) に全部書き換えればいいよ
>>263 つーか、ちゃんとaをポインタとして使っているジャン。
>264がヒントを書いているけれど、Cでは配列を配列のまま参照することはないからね。
266 :
デフォルトの名無しさん :2006/12/03(日) 21:50:06
C言語の配列とポインターを使って、文字列をひとつ入れて それぞれの文字が入っているアドレスを出力しなさい。 また、整数データの列を定義してそれぞれの整数が入っている アドレスを出力しなさい 。 という問題を考えているんですが、C言語をまだ習い始めたばかりで、 どのように示せばいいのか悩んでいるので、 解答もしくはヒントを提示していただけないでしょうか? よろしくお願いします。
>>266 配列の各要素にアクセスするにはどうしたら良いか?
変数のアドレスを取得するにはどうするか?
後は、>264とかも参考になる。
269 :
デフォルトの名無しさん :2006/12/03(日) 22:48:13
始めて書き込みます コンパイラborlandをインスコしたのですが メモ帳で作ったファイルの入れ方(コンパイル)がわかりません・・・ お願いします
構造体に配列を使って格納したデータの中に、曜日やら時間やらが入っているんですけど 例えば曜日を入力したらその中の同じ曜日の物だけを表示するプログラムを作りたいです。 なんかアドバイス貰えませんか? void printf_lesson(struct lesson a) { printf("name:%s\n",a.name); printf("prof:%s\n",a.prof); printf("day:%d\n",a.day); printf("period:%d\n\n",a.period); } こんな関数を利用するんですが。
>>269 bcc32 ファイル名.c
で出来ない?
274 :
デフォルトの名無しさん :2006/12/04(月) 01:00:53
276 :
デフォルトの名無しさん :2006/12/04(月) 02:22:44
>>273 ありがとう
ちょっとやってみてから
また質問します( ^ω^)
>>271 lesson {a1,a2...ai...an}
曜日を入力
for(i:1->n)
if(曜日=ai.day) printf_lesson
i++
>277 ==
279 :
デフォルトの名無しさん :2006/12/04(月) 09:36:45
>>275 ありがとうございます。
こんな簡単なことに気づけないなんて、情けないです。
もっと勉強します!
280 :
271 :2006/12/04(月) 12:25:01
>>277 その曜日の入力のやり方がいまいち分かりません。
scanf("%d",&ai.day);とかでいいんですか?
あとよかったらfor(i:1->n) の意味を説明してほしいです。
281 :
271 :2006/12/04(月) 14:17:13
情報量が少なくて答えにくいと思うから追記 時間割表のようなものを配列の中に入れるのですが 配列の中に7個 科目を選んで入れてその科目自体に曜日と時間を決めておくから、 配列の1番目が月曜日と決まっているわけではないです。 strcpy(c.name,"科目名"); strcpy(c.prof,"教授の名前"); c.day=2; //曜日。2なので水曜日 c.period=1;//一限目という意味 構造体を使っててこんなデータを7個配列に入れているのですが 2と入力したらその中でday=2の物を全部出すようにしたいです。
282 :
274 :2006/12/04(月) 14:45:30
>>283 とりあえず課題はelse ifとか使って無理やり結果は出るようにしたんですが
やっぱ題意と違うからこのまま出したら減点される。。
構造体の配列がいまいち分かりません。
本に書いてある通りだと配列全部同時に出力とかになるんですが
応用して選んだやつだけ、それも配列番号じゃなくて
中のデータの一部を汲み取って表示とかは分からないです。
2ちゃんで訊かなきゃならんほど追い詰められていながら 減点を気にするとはいやはや
減点というかそのプログラムを応用したものを次に作らないといけないのと 自分でやった方法だと配列が使われてない(><; のが問題だと思いまして
とりあえずそのelse ifを使って無理やり結果を出すソースが見たい
>>286 >>280 はちょっと違って、一旦別の変数xに入れてからxとa[i].dayの比較をする
for(i:1->n)は iを1〜nまで を適当に書いただけ
あとは
>>287 と同じ
>>282 s=0 としてから ave_m = avarage_math(s); としているがどうなるか、sとは何か
sum=0 として sum += sum; としているがどういう意味の式か
290 :
デフォルトの名無し :2006/12/05(火) 12:53:28
このような事ができるようなプログラムを1時間以内で教えて下さい。お願いします 1:4個の1桁の数字からなる順列を乱数で生成 (4個の数字は全て異なる) 2:4個の数字の順列を入力 3:生成した順列と入力の順列を比較 (数と位置があっている「hit]) (数はあるけれど位置が違う「blow]) 4:hit数とblow数を表示 5:順列があたるまで入力を繰り返す 実行例 Number?:0123 Hits:0,Blows:1 Number?:0124 Hits:0,Blows:0 Number?:3567 Hits:3,Blows:0 Number?:3568 Hits:3,Blows:0 Number?:3569 Hits:4,Blows:0 Trials:5
borlandのコンパイラを入れたんですが マイドキュメントにあるtest.cを C:\borland\bcc55\Bin\bcc32.exeでコンパイルして別のフォルダに出力する方法ってありますか? 出来れば簡単に出来るといいのですが・・・ 変なところあるかもしれませんがよろしくお願いしますm(__)m
>>291 出力ファイル名を指定するオプションは、たぶんパス指定も受け付けると思う。
>>291 -eFilePath
スペース空けたら駄目
294 :
デフォルトの名無しさん :2006/12/05(火) 18:58:15
猫でもわかるプログラm という本を買ってやり始めようと思ったんですが・・・ 初めのパスやPATHの設定の仕方が書いてありません! 設定のやり方がkwsk載っているサイトありましたら 教えて下さいorz
296 :
デフォルトの名無しさん :2006/12/05(火) 19:19:15
>>295 ありがとうございます(*´∀`*)
なんとか設定できたみたいです。
"bcc32.cfg"を作れ、とかいてあり作ろうとしたらなぜかもう作ってありました・・・。
こういうのはなぜ作るのか教えて下さいorz気になる、、、
猿でもわかるようにorz
>>296 まだC言語に触ったことないなら説明しても解からないと思うが
インクルードパスやライブラリパスを指定するためにbcc32.cfgを作る
298 :
デフォルトの名無しさん :2006/12/05(火) 19:39:47
>>297 ・・・
よくわかりませんが、ありがとうございます⊂二二二( ;^ω^)二⊃ブーン
299 :
デフォルトの名無しさん :2006/12/06(水) 21:22:22
main()とmain(void)のようにカッコの中に何も書かない場合とvoidを書く場合の違いがわからないのですが、解説してもらえないでしょうか。
そこにvoidを書くと、引数を取らないことを意味する。 関数定義でvoidを書かない場合は上と同じ。 プロトタイプ宣言でそれを書かない場合、引数の指定が全くないことを意味する。 なお、C++では常に引数を取らないことを意味する。
Visual C++ 2003でCの勉強してるんですけど ど〜してもエディタが気に入りません。 どうしたらいいですか。
302 :
デフォルトの名無しさん :2006/12/06(水) 22:05:34
すいません質問です。 #include <stdio.h> #include <conio.h> int main(void) { char ch; printf("メッセージを入力:\n"); ch = getche(); while(ch != '\r') { printf("%c", ch+1); ch = getche(); } return 0; } このコードをコンパイルして実行したんですが 文字を入力したら文字が右斜め上に行ってしまいます。 何が原因なんでしょうか? コンパイラはBorland C++5.5.1です。win2000で使用してます。 よろしくお願いします。
ある程度はカスタマイズできる。 それでも気に入らないなら、使わなければいい。 コンパイルはコマンドプロンプトからするも良し、 他のエディタでコマンドを呼び出すようにするも良し。
>>302 bccだけ斜め上行くね
VC++,gccは問題なかった
なんでだろ
C言語を習得したいと思っているのですが、分かりやすい参考書、サイトなどありましたら教えてください。 また、C言語にも色々と種類があるようなのですが、どれから勉強していけばよいのでしょうか?
>>302 #include <stdio.h>
#include <conio.h>
int main(void)
{
char ch;
printf("メッセージを入力:\n");
ch = getch();
while(ch != '\r') {
printf("%c", ch);
printf("%c", ch+1);
ch = getch();
}
return 0;
}
これでちょっとやってみて。
CRLFが悪さをしてるかと
310 :
302 :2006/12/06(水) 22:39:36
>>306 9行目はどういう意味になるのでしょうか?
>>302 getchはconio.hでいいんですか?
>>309 ありがとうございます。
>独習CからC++やC#なりに行けばいいと思いますが
とありますが、C言語自体は独学でも十分に習得できるものということでしょうか?
またプログラムのプの字も知らない状態なので、
フリーのコンパイラとともに「猫にもわかるプログラミング」というサイトで勉強しようと思っているのですが
なんとかなりますか?
312 :
302 :2006/12/06(水) 22:41:01
>>307 CRLFが原因だとすると解決方法は
あるのでしょうか?
コマンドラインからビルドしたら右上に行ったけど、 BCC Developer でビルドしたら普通に動いたよ。 素人だからわからんけど、引数じゃ無いかな?
>>310 思い出した
DOS窓の行数が増えていくと表示がおかしくなる現象
新たにDOS窓開くと問題ないと思う
>>314 ホントだ。
再現できた。
コンソール起動してすぐなら異常ないけど、
行数稼いでから実行すると異常を起こす。
316 :
デフォルトの名無しさん :2006/12/06(水) 23:00:18
>>315 bccのconioまわりがおかしいのかもね
カーソル位置を指定するgotoxyも同じように行数増えるとおかしくなるはず
318 :
デフォルトの名無しさん :2006/12/06(水) 23:52:03
どうするとバグが多くなると思いますか?
キーボードにコーヒーをこぼすと 入力ミスが多くなりますよ (^^
320 :
デフォルトの名無しさん :2006/12/07(木) 01:09:49
バグ少ない作りかたしたほうがよくないですか? プログラムしたことないんですが?
321 :
デフォルトの名無しさん :2006/12/07(木) 09:25:01
Cです。 略 int main() { char expr[] = { '8', '6', '*', '5', '-', '\n'}; int i,j; for(i=0; i < 10; i++){ if (isdigit(expr[i])) { j = atoi(expr[i]); 略 この状態でコンパイルしようとすると、atoiの行でエラーが出てしまうのですが対処法を教えてもらえないでしょうか? 型が関係しているのかと思い色々試してみてもうまくいきません。 j = atoi(expr); とするとコンパイルはできたのですが、代入された数字が他の数字(98)に変わってしまいました・・・。
>>321 j = atoi(&(expr[i]));
何をしようとしているかぐらい話のネタとして書いてくれないとつまらない
>>321 これがやりたい?そのコードで10回ループはマズイよ。
char expr[] = { '8', '6', '*', '5', '-', '\n'};
int i, j;
for(i = 0; i < sizeof(expr) / sizeof(char); ++i){
if(isdigit(expr[i])){
char str[] = {expr[i], '\0'};
j = atoi(str);
}
}
>>321 何故「atoi(expr[i])」がダメかと言うと
atoi()は引数に「const char*」を取るから。
「expr[i]」の場合の型は「char」だからコンパイルエラーになるよ。
だから一旦、下みたいに別の領域に置いて、atoi()に渡してやる必要があるよ。
char str[]={expr[i],'\0'}; ←何処までが文字列か分かる様に'\0'を追加しとく
あと配列の要素数ぶんキチンとループしないと
確保したメモリ領域以外にアクセスする事になるから気を付けないと。
for(i=0;i<10;i++) こんな適当じゃなくて
for(i=0;i<sizeof(expr)/sizeof(char);++i) こんなふうに要素数を溢れない様にしないと。
>>322-324 ありがとうございます。逆ポーランド式の計算プログラムを作っています。
sizeofというのは演算子なんですね。初めて見ました。
「’\n’」が来た時にiに10より大きい数字を代入してループを抜けようと考えていたのですが、むちゃくちゃすぎるでしょうか?
今は期限がせまっているのであとでじっくり考えてみます!
>>325 文字数ぶんループしたいなら↓の様にすればいいよ。
char expr[] = { '8', '6', '*', '5', '-', '\0'};
for(i = 0; i < strlen(expr) ++i)
これでもいいけど。
for(i = 0; expr[i] != '\0'; ++i)
改行で判定したい場合はこれ。
char expr[] = { '8', '6', '*', '5', '-', '\n'};
for(i = 0; expr[i] != '\n'; ++i)
>>326 strlen()も初めて見ました。\0という表現(?)も。あとで調べてみます。
expr[i] != '\n' ← なるほど!と思いました。なぜ気づかなかったんだろう。
どうにかプログラムがうまく動くようになってよかったです。本当にありがとうございました(^^)
atoi()よりもstrtol()かsscanf()を使うべきだな。 それらはatoi()と違って、変換終了点が判るのだから。
C言語で最適なコンパイラって何ですか?(市販品も含めて)
awkのことはここで聞いてもおk? 初心者というかアルゴリズムがわからなくって・・。 # cat aaa 1 2 3 これを 1 2 3 に並べ替えるってどうすりゃいいのか
>>330 awkじゃ完全にスレ違いだ。ちゃんとawkスレはあった気がする。
並べ替えっていうより複数行をまとめるってことじゃないの?
そうなら、アルゴリズム以前の問題だ。
ヒント:BEGIN{ORS=" "}{print}
>>329 ライブラリは探せば出てくるから、とくにこれといって優れたものというのはないと思う。
ダイテル本の練習問題の解答集を自費出版するまでの道のりを教えて下さい
>>333 ハメ撮りクイズをインディーズで出すってこと?
ちょっと質問。 fwrite() とかの、size と count ってのは何のために用意されてるんでしょう? fwrite(hoge, 2, 4, fp);
fwrite(hoge, 2, 4, fp); fwrite(hoge, 1, 8, fp); の違いが分かりません。 メモリ上のデータと書き込み先のデータでインディアンが違うときとか、そういう時のため?
337 :
デフォルトの名無しさん :2006/12/09(土) 14:32:21
C言語でカレンダーを作りたいのですがわかりません 簡単なプログラムで作りたいのですが…… よろしくおねがいします
printf("12月"); printf(" 1 2"); printf(" 3 4 5 6 7 8 9"); printf("10 11 12 13 14 15 16"); printf("17 18 19 20 21 22 23"); printf("24 25 26 27 28 29 30"); printf("31");
つまりは、何が分からないのかをしっかり伝えないと、 こちらからはこんな答えしか書きようがないってことだ。
>>337 #include <stdio.h>
int day_of_week(int year, int month, int day) {
if (month == 1 || month == 2) { --year; month += 12; }
return (year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + day) % 7;
}
int days_of_month(int year, int month){
static const int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month < 1 || month > 12) month = 1;
if (month == 2) return days[1] + (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
else return days[month-1];
}
void calendar(int year){
int i, k, month, days;
for (month = 1; month <= 12; month++) {
printf("\n %d年%d月\n日 月 火 水 木 金 土\n", year, month);
k = day_of_week(year, month, 1);
days = days_of_month(year, month);
for (i = 0; i < k; i++) printf(" ");
for (i = 1; i <= days; i++) {
printf("%2d ", i);
if (++k % 7 == 0) printf("\n");
}
printf("\n");
}
}
int main(void) {
int year;
printf("何年?:"); scanf("%d", &year);
calendar(year);
return 0;
}
インディアンが違うと確かに困るな。 南米ではインディオだな。
fwriteの戻り値の説明で >読み書きに成功した要素の個数を返す。エラーが生じた場合や、end-of-file(ファイルの最後)に達した場合、 >返り値は指定した個数よりも小さい値(またはゼロ)となる。 とありました。 fwrite(buf, sizeof(int), 8); とした場合に8より小さい値が返ってきたらエラーかどうかの区別がつかない気がするのですが、 エラーかどうかをどうやって判断したらよいのでしょうか?
ネイティブアメリカンだバカヤロウ
>>344 そこでferror()ですよ。
まぁ、大抵fwrite()で4*8程度ではバッファ内に収まってしまうから実際の書き出しは行なわれず、
エラーなんぞ起きやせんのだが。
#そしてfclose()で書き出しが行なわれてエラーになったりする罠。
fwrite()の場合は、書きこんだサイズがバッファより小さかったら、エラーなんじゃないの? いや、ferror()で調べればいいけどさ。
unixのwrite()の場合は、全部書きこまないで戻ってきて、しかもエラーで ない場合がありえるって話を読んだことがあるな。。。 fwrite()もそうなのか? まあ、どちらにしてもferror()で調べるようにすればいい話だけど。
>>344 の戻り値の説明はfread()の間違いだろと誰も指摘しないのかよ
「読み書きに成功した・・・」だから、fwriteも含んでるんじゃね?
>>350 自分の持ってるANSI Cの辞書にはfwrite()の項にこう書いてある。
返却値
@書き込みに成功した値を返す.
A書き込みエラーが発生したときのみ,nより小さくなる.
352 :
346 :2006/12/09(土) 19:59:38
>>347 エラーの種類の判断とミスリードした。確かに、少ない時点でエラーだね。
#それさえも起きない可能性が高いことは>346に書いた通り。
Cってセックスのことでしょ? まだ手をにぎったことしかないんですけど、 セックスのときってなにかとくべつな言葉をつかうものなのですか?
354 :
デフォルトの名無しさん :2006/12/09(土) 22:47:41
よろしくお願いします。 for(i=0;i<12;i++) { printf("a[%d]=",i+1); scanf("%lf",&a[i]); } 上のような構文(?)を使って、 a[1]=5(数字は何でも良い) a[2]=7 ・ ・ ・ a[11]=5 a[12]=8 というように入力していき、 その入力した数字(上の例では、a[1]=5、a[2]=7、a[11]=5、a[12]=8)を for文を使って、 5 7 ・ ・ ・ 5 8 という風に表示させたいのですが、どのようにしたら良いでしょうか?
>>354 自分で答えかいてるようなものじゃん
for(i=0;i<12;i++)
{
printf("%d",a[i]);
}
改行忘れた \nね
357 :
354 :2006/12/09(土) 23:28:54
ありがとうございます。 しかし、仰るようにすると、すべて「0」になってしまうんです・・・。 ソースを貼っておきますので、アドバイスお願いします。 #include<stdio.h> #include<math.h> int main(void) { printf("測定データを入力せよ!\n"); double a[12],ave=0.0,ss=0.0,var,std; int i; for(i=0;i<12;i++) { printf("a[%d]=",i+1); scanf("%lf",&a[i]); } for(i=0;i<12;i++) ave+=a[i]; ave/=(double)12; for(i=0;i<12;i++) ss+=(a[i]-ave)*(a[i]-ave); var=ss/(double)12; std=sqrt(var); printf("測定データ:\n"); for(i=0;i<12;i++) { printf("%d \n",a[i]); } printf("平均板厚=%1f(mm)\n",ave); printf("標準偏差=%1f\n",var); return 0; }
>>357 a[i]はdoubleだから%lfだな
359 :
354 :2006/12/09(土) 23:37:19
すみません。自己解決しました。。。 %dを%lfに変えるの忘れてました。 ありがとうございました!!
360 :
354 :2006/12/09(土) 23:38:28
>>358 その通りでした
ありがとうございます!
361 :
デフォルトの名無しさん :2006/12/09(土) 23:43:55
「3次元空間で座標を入力して現在位置から次の敵機が迎撃可能かどうかを 確認するプログラム」を作りました。 (3次元のインベーダーみたいなのを想像してください) これから拡張してどの経路をたどれば最高得点か、というところまで 行きたいのですがどのように作っていけばいいでしょうか?
>>361 移動の仕組みはどうなっているのか、
撃てば必ず当たるの?
その際の得点は?
など説明が足りなさ過ぎる。
363 :
361 :2006/12/09(土) 23:53:06
移動速度は自機と敵機おなじ速さで敵は今はまっすぐ落ちてくるだけ そして、迎撃方法は時機が敵機に体当たりするという変なプログラムですw だから迎撃可能範囲が円錐になる感じですね 当たり判定は今のところ点です.
364 :
361 :2006/12/09(土) 23:59:15
追加補足で、自機の移動は最低ラインを動くのみで前には出ない 得点はどれもおなじ です
>>363 なんだかよくわからないが、得点が固定ならMST(最小木)を調べてみたらどうだろう
366 :
361 :2006/12/10(日) 01:52:48
このスレと別の宿題スレとか勉強になるね サンプルかき集めたら何か出来そう
Cで中田氏を実行したら、Dに進んでしまった。 手術費をどうするかでもめてる。orz
372 :
372 :2006/12/13(水) 16:34:32
流れを断ち切って申し訳ナス。 変数を引数して、変数名と値を出力する関数を作りたいです! 変数から、その変数名の文字列をとりだす方法ってありますか? //ソース void DebugOut(int value); void main(){ int value = 100; DebugOut(value); } //実行結果 value:100 って感じになる関数を作りたいんです!よろしくお願いします!
printf("value:%d", value);じゃダメなの?
そういうときはマクロのの出番。 #define DebugOut(variable) (fprintf(stderr, "%s : %d\n", #variable, (int)(variable)))
375 :
372 :2006/12/13(水) 17:53:50
<<373 それでできるんだろうけど、めんどくさかったんです! <<374 すげー!できました。 お二方とも、ありがとうございました!
376 :
デフォルトの名無しさん :2006/12/13(水) 20:14:54
OpenCVを使っているのですが、 画像を読み込んで、すべてのピクセルで、 getpixel(img,x,y,&r,&g,&b); printf("座標(%d, %d)のRGB値は(%d, %d, %d)です.\n",x,y,r,g,b); を繰り返したいのですが、 for文などの繰り返し文をどのように書けばいいのかわかりません。 よろしくお願いします。
for for とか?
あれ・・・スペース入んない・・・
379 :
デフォルトの名無しさん :2006/12/13(水) 20:44:36
そうです! 自分で調べてみたらWidthなどを使っていました。 for文の書き方教えてほしいです。 とりあえず10*10でやってみようと思って、 int x,y; for(y=0,y<=10,y++){ for(x=0,x<=10,x++){ getpixel(img,x,y,&r,&g,&b); printf("座標(%d, %d)のRGB値は(%d, %d, %d)です.\n",x,y,r,g,b); } } と書いてみたのですが、エラーで実行できませんでした。 おかしいところを指摘していただけたら嬉しいです。
エラーメッセージを書いて
381 :
379 :2006/12/13(水) 22:49:19
全source #include <stdio.h> #include "cv.h" #include "cxcore.h" #include "highgui.h" IplImage *img=0; int getpixel(IplImage *image, int x, int y, int *r, int *g, int *b){ *r =(uchar) image->imageData[y *image->widthStep+ x * image->nChannels + 2]; *g =(uchar) image->imageData[y *image->widthStep+ x * image->nChannels + 1]; *b =(uchar) image->imageData[y *image->widthStep+x * image->nChannels]; return 0; } int main( int argc, char** argv ){ int x=240,y=370; int r,g,b; char* filename = argc == 2 ? argv[1] : (char*)"image.bmp"; if( (img = cvLoadImage( filename, 1)) == 0 ) return -1; cvNamedWindow("Image", 1); for(y=0,y<=10,y++){ for(x=0,x<=10,x++){ getpixel(img,x,y,&r,&g,&b); printf("座標(%d, %d)のRGB値は(%d, %d, %d)です.\n",x,y,r,g,b); } } cvShowImage("Image", img); cvWaitKey(0); cvReleaseImage(&img); cvDestroyWindow("Image"); return 0; }
382 :
379 :2006/12/13(水) 22:55:27
error expected `;'before')'token could not convert `cvShowImage(((const char*)"Image"),((const CvArr*)((void*)img)))' to `bool' expected `)'before';'token
383 :
デフォルトの名無しさん :2006/12/13(水) 22:56:23
よろしくおねがいします^^;
>>379 for(y=0,y<=10,y++)
これじゃ0から10までの11回実行されるよ。
0,1,2,3,4,5,6,7,8,9,10 <-11個あるよね?
for(y=0,y<10,y++)
イコール無しだと0から9までの10回ループ。
0,1,2,3,4,5,6,7,8,9 <--10個
>385 もっと大きな問題があるだろ。 コピペしといて気づかないのか?
388 :
デフォルトの名無しさん :2006/12/14(木) 01:23:38
それと、forの中は、,じゃなく;だよ。
389 :
デフォルトの名無しさん :2006/12/14(木) 01:28:19
ファイルが20個あってその20個について同じ処理をしたいのですが、 ファイルをループさせるにはどうすれば良いのですか?
390 :
385 :2006/12/14(木) 01:33:04
おぉ。すっかり見落としてた。 みんな目ぇいいな。
391 :
歩歩 :2006/12/14(木) 01:33:20
誰かこの問題を解いてください。 9〜11行目を別の関数(関数名FuncDev)とし、修正しなさい。ただし、グローバル変数は使わないこと。 また、FuncDev内のローカル変数名は任意とする。 FuncDev関数は以下の定義とする。 int FuncDev(void); FuncDev関数の戻り値は、画面入力されたint型データとする。 1:#include<stdio.h> 2:void main (void); 3:void main (void) 4:{ 5:int n1,n2; 6:int nt; 7:nt=0; 8:for(n1=0;n1<10;n1++){ 9:printf("0-9の数値を入力:"); 10:scanf("%d",&n2); 11:nt -=n2; 12:} 13:printf("結果は%dです。",nt); 14:} よろしくお願いします。
392 :
デフォルトの名無しさん :2006/12/14(木) 01:41:11
ファイル名は用意しなきゃならんような… 新規で作るなら連番でfor回せば良いけど。
>389 1.ファイル名を連番で用意する 2.ファイル名の入った文字列の配列を用意する >391 int FuncDev(void){ int n; printf("0-9の数値を入力:"); scanf("%d", &n); return n;} void main(void) { int n, nt; nt = 0; for(n=0; n<10; n++) nt -= FuncDev(); printf("結果は%dです。", nt); }
394 :
デフォルトの名無しさん :2006/12/14(木) 01:46:49
>>392 返答ありがとうございます。
ファイル名をtest1.txt test2.txt …… test20.txt としたら
for文でどう書いたらよいのですか?
395 :
歩歩 :2006/12/14(木) 01:48:06
ありがとうございます すごい助かりました
396 :
デフォルトの名無しさん :2006/12/14(木) 01:52:30
>>394 ファイルへの書き込みの仕方はわかる?
for(i=1;i<21;i++)の中で、ファイルへの書き込みを回すだけ。
書き込む式のファイル名の部分を、test[i]とすれば、中身が同じな連番ファイルの出来上がり。
397 :
デフォルトの名無しさん :2006/12/14(木) 01:52:31
キーボードから読み込んだ整数n以下の素数をすべて求め1行に12個表示させなさい。 という問題がまったくわかりません。どなたか教えてください・・
>394 for(i=0; i<20; i++) { sprintf(filename, "test%d.txt", i+1); fp = fopen(filename,
399 :
デフォルトの名無しさん :2006/12/14(木) 01:59:10
>>397 1以上の整数nが素数であるかどうかは、
n%2,n%3,n%4,n%…とやっていって、
n%(n-1)まで繰り返して(本当はもっと少なくて良いんだけど)、
一度も余りが0にならなかったら(つまり一度も割り切れなければ)素数。
ここから考えていけば作れると思うよ。
401 :
デフォルトの名無しさん :2006/12/14(木) 02:00:12
>>396 返答ありがとうございます。まだできません。
私はファイルからデータを読み込んで処理をしたいのです。
for(i=1; i<=20; i++){
fp = fopen(test[i] , "r");
処理
fclose(fp);
}
これで良いのでしょうか?
402 :
399 :2006/12/14(木) 02:00:27
1以上ってorz 1より大きい整数ね・・・
403 :
デフォルトの名無しさん :2006/12/14(木) 02:02:44
test[i].txtだね。
>397 1行に12個表示するということは、12個表示したら改行するということ。 カウンタを用意して素数を表示するたびに+1して12になったら改行すればいい。
405 :
デフォルトの名無しさん :2006/12/14(木) 02:09:20
>>401 あぁ、ごめん。
398さんの方法でお願い。
惑わせまくってる・・・ちょっと吊って来る。
406 :
歩歩 :2006/12/14(木) 02:10:25
何度もすいませんがお願いします。 このプログラムのfor文をwhile文に修正しなさい。 #include<stdio.h> void main (void); void main (void) { int n1,n2; int nt; nt=0; for(n1=0;n1<10;n1++){ printf("0-9の数値を入力:"); scanf("%d",&n2); nt -=n2; } printf("結果は%dです。",nt); } ほんとお願いします。
>406 初期設定部をwhileの前に置く。 条件判定部をwhileの括弧内に入れる。 インクリメント部をwhileブロック内の最後に入れる。
コマンドライン引数で与えられたファイルを開いて、そのファイルの最初の1文字を表示するプログラムを作りたいんですが、 あえて関数を使うとすると、次のどちらのプログラムの方がよいのでしょうか? 1. #include <stdio.h> #include <stdlib.h> void f(char *filename); int main(int argc, char *argv[]) { if (argc != 2) { puts("error"); exit(1); } f(argv[1]); return 0; } void f(char *filename) { FILE *fp; char ch; if ((fp = fopen(filename, "r")) == NULL) { puts("error"); exit(1); } if (!feof(fp)) ch = fgetc(fp); fclose(fp); putchar(ch); }
409 :
408 :2006/12/14(木) 09:28:27
2. #include <stdio.h> #include <stdlib.h> void f(FILE *fp); int main(int argc, char *argv[]) { FILE *fp; if (argc != 2) { puts("error"); exit(1); } if ((fp = fopen(argv[1], "r")) == NULL) { puts("error"); exit(1); } f(fp); fclose(fp); return 0; } void f(FILE *fp) { char ch; if (!feof(fp)) ch = fgetc(fp); putchar(ch); }
410 :
デフォルトの名無しさん :2006/12/14(木) 18:10:20
Windowsプログラミングって、C/WinAPIってことですか?
基本的にはそれ。 場合によっては広義にMFCを使ったり.NET Frameworkを使ったものも含まれることがある。
>>408 それだけではどちらともいえない。
それはさておき、fopen()直後のfeof()は無意味だ。
>>408 私ならmainが小さくなる1だな。関数に分ける意味も出る。2だったらf関数はあまり意味が無い気がする。
#include <stdio.h>
void f(FILE *fp);
int main(int argc, char *argv[])
{
FILE *fp;
char ch;
if (argc != 2) {
puts("error");
return 1;
}
if ((fp = fopen(argv[1], "r")) == NULL) {
puts("error");
return 1;
}
ch = fgetc(fp);
if (ch == EOF) {
return 1;
}
putchar(ch);
f(fp);
fclose(fp);
return 0;
}
main関数でX=5と値を入れ、次にaaaという関数を呼び出し そのaaaでもX=5だと認識させるにはどうすればいいのですか?
kwsk無いから良くわかんないけどグローバル変数じゃね?
Xを変更しないならそのまま渡してやればいいだろうし、変更したいならポインタで渡せばいい。
419 :
デフォルトの名無しさん :2006/12/16(土) 18:46:31
BCB6でソフトウェアキーボードを作ってみようと思うんですが、 keybd_eventのことについて全く知識がなく、検索かけてみたんですが、 あまり詳しく載っている所がありません。 加えて、文字を打ち込みたい箇所をアクティブにする操作も分からないので、 どなたか詳しく紹介されてあるページか、操作そのものを教えていただけると幸いです。。。。
Win32APIのスレへどうぞ
ダイテル本のp.p.128練習問題4.30「switch文をネストされたif/else文に書き換える」 書いてみたんですがうまく動きません。アドバイス頂けますか? /* switch構造をif/else文に書き換える(リスト4.5) */ #include<stdio.h> main() { int grade; int aCount = 0, bCount = 0, cCount = 0, dCount = 0, fCount = 0; printf("試験の成績(A,B,C,D,F)を入力してください。\n"); printf("入力を終了するには、EOFをタイプしてください。\n");
while ( ( grade = getchar() ) != EOF) { if( ( grade = getchar() ) == 'A' || grade == 'a' )/* 成績がAまたはaの場合 */ ++aCount; else if( ( grade = getchar() ) == 'B' || grade == 'b' )/* 成績がBまたはbの場合 */ ++bCount; else if( ( grade = getchar() ) == 'C' || grade == 'c' )/* 成績がCまたはcの場合 */ ++cCount; else if( ( grade = getchar() ) == 'D' || grade == 'd' )/* 成績がDまたはdの場合 */ ++dCount; else if( ( grade = getchar() ) == 'F' || grade == 'f' )/* 成績がFまたはfの場合 */ ++fCount; else if( ( grade = getchar() ) == ' ' || grade == '\n' )/* 空白改行は無視 */ ; else {/* その他の文字が入力された場合 */ printf("成績を表す文字が正しくありません。\n"); printf("もう一度、入力して下さい。\n"); } } printf("\n各成績の集計結果:\n"); printf("A: %d\n", aCount); printf("B: %d\n", bCount); printf("C: %d\n", cCount); printf("D: %d\n", dCount); printf("F: %d\n", fCount); return 0; }
>>421 元のswitch使った方がどういうものかは知らないが、
if,else ifに入るたびにgetcharしてるのは問題ないのか?
424 :
421 :2006/12/19(火) 16:47:19
>>423 仰るように、{}内のgetcharは不要のようでした
ありがとうございました
test
NaNを変数に直接代入できないでしょうか? 今は a=1/0; のようにやっているんですが、スマートな記述法があったらご教授ください。
>>426 1/0ではNaNにならないだろ。
それにそのコードは警告を出すコンパイラが多いだろうし、
場合によっては実行時に0除算の段階で異常終了する。
1./0.でも無限大であってNaNにはならない。
「NaNを変数に直接代入」ってのがNaNのリテラルが欲しいっていう意味なら、
処理系によってはNANみたいに定義されていることもあるので、
使ってる処理系のmath.h辺りを探してみ。
最近の処理系ならあると思うが、無ければ例えばIEEE754形式のNaNの表現に従って、
仮数部を非0、指数部を255にしたビットパターンを作って自分で定義してやればいい。
ついさっきボーランドのコンパイラとBCC Developerをインスコして、 とりあえず色んなサイト見つつプログラム書いてみた。 440の音源を指定した周波数にずらすには、何セントずらせばいいかってプログラムなんだけど、 "log10 SIGN error"って出て上手くいかない。 #include <stdio.h> #include <math.h> main() { double Hz,cent; int S; char MSB,LSB; printf("何Hz? > "); scanf("%d", &Hz); cent = 1200 * log10(Hz / 440) / log10(2); printf("cent = %d\n", cent); } 何か俺がCの書き方を勘違いしてるからなんだろうけど、誰かエロいひとおせーて。
>>428 Hzがdoubleなのにscanf()で%dを指定しているから、まともに値を拾うことができていない。
その値がたまたま負となったために件のエラーが起きたのだろう。
従って、scanf()の指定を%lfにでもすればいい。
勿論、printf()も%g辺りにしておかなければいけないのは言うまでもない。
>>429 ありがとう。ああ、%dとかにも種類があるんだね。
精進するよ。
何度もごめん。また行き詰まった。 #include <stdio.h> #include <math.h> main() { double Hz,cent,St; int S; char MSB,LSB; printf("何Hz? > "); scanf("%lf", &Hz); cent = 1200 * log10(Hz / 440) / log10(2); St = cent / ( 100 / 8192 ); // この行が問題っぽい S = (int)((St >= 0) ? (St + 0.5) : (St - 0.5)); printf("S %d",S); } って書いたら、コンパイルは通るのに、実行して数値を入れると強制終了されちゃう。 というか、世間はイブだっていうのに俺はここで何してるんだろorz
>>431 100 / 8192 == 0
でゼロ除算
100.0 / 8192.0にしる
CとC++って根本的に何がどう違うんですか? 最初は何となく、Cはコンソール、C++はそれにウィンドウ表示ができるものと思っていたんですが、それも違うようです。 あと、ウィンドウを表示するアプリケーション(API?)の作り方が詳しく解説されてるサイトってありませんか? それとも素直にVC++に移行した方がいいんでしょうか…?
435 :
デフォルトの名無しさん :2006/12/25(月) 22:57:35
CでもC++でもウィンドウの生成は出来る 違いはCで言う構造体のパワーアップしたクラスというものと コンテナという便利な物やその他Cで書くとめんどくさいアルゴリズム等 を用意してくれてる。 でもCだろうとC++だろうと、精度の高いプログラムを作れるかどうかは 結局本人のスキル次第
つーかプログラミング言語と言語製品の区別ぐらいしろよ。
超初心者です。 scanfの練習をしていたんですが、上手く動いてくれません。 手本によれば、100と入力すると100.000000が表示される筈なのですが 何を入力しても、0.000000が表示されます。orz 見比べて入力間違いは無いと思うのですが… どこに間違いが有るか教えて下さい。お願いします。 #include <stdio.h> int main(void) { double data; scanf("%If",&data);/*入力*/ printf("%f\n",data); return 0; }
%lf
441 :
439 :2006/12/26(火) 10:14:17
>>440 解決しました。私の使っているエディターで『I』、『l』の
表示が同じだったので気付きませんでした。orz
どうもありがとうございました!
そういうのをきちんと区別できるフォントにしたほうがいいよ。
lfはlong floatだっけ
>>435-438 ありがとうございます。
理解できました。
ウインドウアプリは少し面倒そうですが、がんばってみます。
445 :
デフォルトの名無しさん :2006/12/26(火) 19:34:08
これからC言語を始めたいと思うのですが、初心者はとりあえずこれ使っとけみたいなコンパイラってどれですか? プログラミングはJavaを少しかじった程度なのでどれを選んだら良いのかさっぱり分かりませんorz
むしろいくつも使っとけ。
今は無料でいろいろ試せるからなあ
コンパイラによって実行ファイルの動作が違うからいくつも試したほうがいい。
450 :
445 :2006/12/26(火) 20:00:11
素早い回答ありがとうございます。
とりあえず
>>447 を使ってみようと思います。
451 :
デフォルトの名無しさん :2006/12/26(火) 21:13:53
コマンドプロンプトでソースファイルの行数を調べる方法ありますか? wc -l ソースファイル名 上記のコマンドでUNIX(?)では調べられるらしいんですが・・・ windowsMeではだめでした。
Cygwinをインストールすればwcも使える。 それはともかくとして、行数数えるプログラムくらい自分で作ってみろよ。
453 :
デフォルトの名無しさん :2006/12/26(火) 21:53:18
>>452 あやや!そう言われればそうでした!
ナイスですw
ってかC関係ないじゃん… findコマンドを応用すれば出来るから自分で考えれ
455 :
デフォルトの名無しさん :2006/12/26(火) 22:42:15
>>454 C以外の事でしたね。すみません
ところでこの手の質問はどこにしたらいいのでしょうか?
探して見ましたが余り適当な所が見当たらなかったです。
>>455 wcはcの入門書の例題によく出てくるから、まあ範疇でいいじゃない。
wc sed grep lsなど簡単なunixコマンドは大抵win32版がgnuその他のフリーウェアで
転がっているから、ググレば拾えるよ。
wcを作りたいって話じゃなかったろ…
>>455 Win板で見つからないなら探し方が悪いだけ
458 :
デフォルトの名無しさん :2006/12/27(水) 00:10:29
>>456 了解です。只、あれば使って見ようって発想だったんで。プログラム世界のガキ状態ですw
>>457 何かを作るというより、何かを利用して試したいという段階なんでこれ以上の思惑はないですよ。
只、wcと等価なプログラムを自分で作れっていいうその発想自体が刺激的で勉強になりました。
三四郎じょうたいですねw
>>458 会社の新人に、wc -l相当を作らせた。
できてきたから今度は各行の桁数をカウントさせた。
#wcにはない機能だ。
「wcを自力で拡張した」気になって楽しかったそうだ。
こんな感じ? #include <stdio.h> #define CR 0x0D int main(int c,char **v) { FILE *fp=NULL; int c=0; unsigned long l=0; if(!(fp=fopen(v[1]))) return -1; while((c=fgetc(fp))!=EOF){ if(c==CR) l++; } printf("Line : %lu",l); return 0; }
質問です。 関数を二つ使うプログラムで変数を共有する方法を教えてください 大局変数で出来るかと思ったのですが、 同じ変数は使えるけど値が共有されてなかったみたいなので・・・
グローバル変数でOK もしかして別ファイルで変数定義をヘッダに入れて static つけたりしてないか?
465 :
461 :2006/12/27(水) 15:47:26
>>462-464 あれ・・できるんですかorz
すいませんもうちょっと見直してきます
staticやマルチスレッドがどういうものなのかも分からん初心者ですいません
その変数を使用する関数より(ソース上で)先に宣言されてないとグローバルであっても使えない
グローバルで宣言したのと同じ名前の変数を関数内で宣言してない?
468 :
461 :2006/12/27(水) 19:32:36
>>466-467 それはたぶん大丈夫だと思います
実は学校で出された課題で
f(関数fib)を読んだ数をカウントしろというものです
#include<stdio.h>
int t;
int fib(int n){
int fn;
t++;
printf("%d\n", time);
if(n == 1 || n == 2)fn = 1;
else fn = fib(n-1) + fib(n-2);
return fn;
}
int main(){
int n;
char buf[256];
printf("与えられたnに対してフィボナッチ数f(n)を返します。\nn: ");
fgets(buf, 256, stdin);
sscanf(buf, "%d", &n);
printf("f(%d) = %d, f は %d 回呼ばれました。", n, fib(n), t);
}
>>468 それ、何を持って違うと判断した?
tはグローバル変数だから、0に初期化されてるが
printf の引数は右から積むから、printfにはtが0のままセットされるよ
関数fib()を呼び出すのはその後だから、違うように見える
>>469 おおおお!ありがとうございます!!
順番のことなんてまったく思いつきませんでした
printfは右からだったなんてまったく知りませんでしたorz
おかげで動きました!!
いわゆる副作用ってやつだ。 関数の引数は評価の順番に依存してはいけない
プログラムでそのプログラム中で使われる変数名や関数名を記憶している領域から 任意の変数名や関数名を取り出して表示することって出来ますか?
>>472 デバッグオプション付きでコンパイル + デバッガ
>>473 そっか、確かにそういう作業ってデバッグだと必要ですよね、ありがとうございます
まずは使えるようにするところからか…
476 :
デフォルトの名無しさん :2006/12/28(木) 13:01:04
すいません。初めての書き込みです。プログラム初心者、というか何も勉強していないのですが、 このような問題を解決しなければならなくなってしまいました。どうか教えてください。課題を教えてくださるスレッド(?)が書き込みできなくなっていたので、 こちらに書き込ませていただきました。 【質問テンプレ】 [1] 授業単元:基礎情報処理 [2] 問題文:縦100横100のマス目(点)に分けられた紙の各点が、白と黒に塗り分けられたものを考える。この中に、下にある様な黒い点で囲まれた図形が1つだけある。図形は必ず、黒い点で囲まれており、 内部は白い点で埋め尽くされている。この「囲まれている」とは、各黒い点の上下左右および8つの点のどれかが黒い点となっているものと考えよう。 □□□□□□□□□□ □□■■■■■■□□ □■□□□□■□□□ □□■□□□□■□□ □□■□□□□■□□ □□■■■■■■□□ □□□□□□□□□□ □□□□□□□□□□ □□□□□□□□□□ □□□□□□□□□□ この図形は整数値の2次元配列(例えばC言語ならa[y,x])で表されている。x軸は左から右、y軸は上からしたとするので、a[1,1]は一番左上の点になる。この配列はプログラムに入る前に何らかの方法で、白い点は0、黒い点は1になっているものとする。 さて、図形の面積、つまり黒い点で囲まれた内部の「白い点」の数を数えるプログラムを考えよう。ただし図形は必ず紙の上に1つだけ存在し、また必ず紙の端から点1つ以上ずつ少し離れた位置にあるとする(つまり黒い点は紙の上下左右の端には存在しない)。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン: すみません、よくわかりません [3.3] 言語: なんでもかまいません。 [4] 期限: 2007年1月5日0時まで [5] その他の制限:まだ何も習っていません。具体的に回答を提示してくれると助かります。
無関係なスレにマルチするような馬鹿に教える気はない
まずはローカルマナーだな
生瀬智也です
480 :
デフォルトの名無しさん :2006/12/28(木) 22:36:47
「メモリのオーバーレイ」 という技法はC言語の範囲で実現可能ですか? 昔はゲーム等でよく使われてた方法みたいですが
できるけど、今は仮想記憶当たり前だから使わんよ
確かにメモリが厳しかった頃、関数ポインタを求めて、そこに直接 別の関数をロードするなど、今からすれば考えられないような 汚いテクニックが当たり前のように使われていた時代がある。 家庭用ゲーム機には仮想記憶がないので、未だにオーバーレイが 使われている。
メモリロックとか言うやつだっけ?
整数型引数fillCharacterで指定された文字を使って、 任意の長さの正方形をプリントする関数を書いているのですが、 以下のコードを実行すると、数字以外の文字は0で表示されてしまいます。 おそらくデータ型の宣言に問題があると思うのですが、どうして問題かも分からないレベルです。 ご教授ください /* 正方形描写関数 */ #include<stdio.h> void drawSquare(int, int); main() { int Side, fillCharacter; printf("***正方形プリントプログラム***\n\n"); printf("整数を入力して下さい: "); scanf("%d", &Side); printf("文字を指定して下さい: "); scanf("%d", &fillCharacter); drawSquare(Side, fillCharacter); return 0; } void drawSquare(int x, int y) { int counter1, counter2; for(counter1 = 1; counter1 <= x; counter1++){ for(counter2 = 1; counter2 <= x; counter2++) printf("%d", (char)y); printf("\n"); } }
>484 > scanf("%d", &fillCharacter); おかしいだろ。
486 :
デフォルトの名無しさん :2007/01/01(月) 08:25:50
あけましておめでとう。 %dは数値を扱う時な。 マルチバイト文字考えないなら 変数fillCharはchar型で足りるし%cでいい
文字出力なんて、普通に英語使えば十分。 おまいら義務教育で英語習ったよな?
あに言ってんだおめ
489 :
デフォルトの名無しさん :2007/01/01(月) 16:19:35
お前が義務教育で日本語習ってないのはわかった
わざわざ日本語の義務教育受けてる在日乙。 日本語学校に通って、卒業証書貰えよ。
さいた さいた さくらが さいた
スレ違いもたいがいにしろ 邪魔だ
>>485 >>486 ありがとうございます
>>484 のコードを
関数プロトヤイプ void drawSquare(int, int);→void drawSquare(int, char);
変数宣言 int Side, fillCharacter;→int Side;char fillCharacter;
fillCharacterのscanfの変換仕様 %d→%c
関数定義 void drawSquare(int x, int y)→void drawSquare(int x, char y)
定義内側のfor内printfの変換仕様 %d→%c
のように変えてみたのですがうまく動きません
このようにした場合、どこに問題がおきるのでしょうか?
自分も日本語には自信がないのですがC言語になるとサッパリです・・
>493 バッファに残った改行文字を文字として読み込んじゃってるから。 scanf("%c", &fillCharacter); → scanf(" %c", &fillCharacter); にすれば改行文字を読み飛ばせる。
>>494 ありがとうございます
この手のミスは参考書だけでなかなか身に付くものではないので参考になりました
そりゃまぁ、typoは参考書を読んでも直せないな。
ミスが身に付くのもどうかと思うけどな 言いたいことは分かるけど
#include <stdio.h> int main(void) { int mokuhyou, sumple, sankaryou, tounyuu; printf("目標値を入力して下さい"); scanf("%d", &mokuhyou); printf("サンプル値を入力して下さい"); scanf("%d", &sumple); printf("酸化量を入力して下さい"); scanf("%d", &sankaryou); tounyuu = ((mokuhyou - sumple) * 11.7 + sankaryou) / 0.97 / 0.35; printf("入力した数値\n 目標値:%d\n, サンプル値:%d\n, 酸化量:%d\n\n, 計算された加炭材投入量:%d", mokuhyou, sumple, sankaryou, tounyuu); } 仕事で使えたら便利なのでこんなん作ったんだけど、どうしても小数点で 計算ができないんだ…。上のは書式制御文字を%dでやってるんだけど、 これだと計算は正しいんだけど計算結果の小数点を切り捨てて表示され てしまう。つかどっちにしても計算のために入力する数値が小数点使う 場合もあるんで、仮に四捨五入やってくれるとしてもこれじゃあ使えない んだけど。 かと言って%dを%fに変えると、今度はちゃんと計算しやがらねえ…。 これどこが悪いん?サンプル値や目標値にも小数点使う場合があるんで、 そういう風に修正するにはどうすればいいだろう。
>>498 一番簡単で、単純な方法だと、
int mokuhyou...のところをdouble型にする
入力書式%dを%lfにする
最後に、出力書式%dを%fにする
でおk。
>>499 ごめん、調べても分からなかったんだけど、double型にするにはどうしたらいいの?
本を読んでも、どーも計算させるプログラムについて深く説明してくれてないから
よく分からん…。
んで%lfってのは%fとかと同じく小数点を扱う書式制御文字ってことでおk?
仕事で使えたら便利だから作ったとか言う割に小数にint・・・
#include <stdio.h> int main(void) { double mokuhyou, sumple, sankaryou, tounyuu; printf("目標値を入力して下さい"); scanf("%lf", &mokuhyou); printf("サンプル値を入力して下さい"); scanf("%lf", &sumple); printf("酸化量を入力して下さい"); scanf("%lf", &sankaryou); tounyuu = ((mokuhyou - sumple) * 11.7 + sankaryou) / 0.97 / 0.35; printf("入力した数値\n 目標値:%f\n, サンプル値:%f\n, 酸化量:%f\n\n, 計算された加炭材投入量:%f", mokuhyou, sumple, sankaryou, tounyuu); return 0; }
>>502 おおっ、ありがとん!これだよ俺が求めてたものはー。
ってか職場でW-ZERO3に入れて使おうと思ってたんだが、
W-ZERO3でC言語動かすソフトが見当たらねorz
でも勉強になった。ほんとありがとう。
>>503 W-ZERO3ってExcel載ってなかった? >502程度の内容ならExcelで充分でしょ。
#VBAさえ必要なかろうし。
以下のプログラムをコンパイルして実行させると、 b->i=0 (b + 1)->i=1 のように出力されます。 (あ)行では、a型の構造体の1件分しかメモリを確保していないのですが、 何故、(い)、(う)行が正しく動作しているのでしょうか? ((b + 1)の領域は確保されていないですよね?) #include <stdio.h> #include <stdlib.h> struct a { int i; }; main() { struct a *b; b = (struct a *)malloc(sizeof(struct a) * 1); ←(あ) b->i = 0; (b + 1)-> = 1; ←(い) printf("b->i=%d\n", b->i); printf("(b + 1)->i=%d\n", (b + 1)->i); ←(う) }
訂正します ×:(b + 1)-> = 1; ←(い) ○:(b + 1)->i = 1; ←(い)
>>505 正しく動作していると何故判断できる?
正しく動作しているように見えるが、実は正しく動作していないかもしれないじゃないか。
つまり、その辺りは「動いたからOK」と判断せず、正しいプログラムを書くように心掛けなければならないと言うことだ。
>>507 助かります即レスありがとうございます
やはり、(い)、(う)行が動作したのは偶然と考え、(あ)行で2件mallocするのが
規格に則ったC言語の処方なのでしょうか?
疑問に思ったのは、実行時にセグメンテーションエラーが出なかったことなのです。
メモリ上に存在しない(b+1)領域を参照してるのに、なぜプログラムが落ちないのか、
それが不思議でなりません。
>>508 それはね、ライブラリとしては1個分*だけ*確保した積もりでも、
環境(OS)の都合で4個分とか8個分も確保してくれちゃったからなのよ。
#b[4].i = 1;で落ちるかb[8].i = 1;で落ちるか、或いはもっといけるか試してみるといい。
Cのライブラリの方で大きめにとったヒープから切り出してるかもしれんし mallocの最小単位のサイズがそこでとった量より大きいのかもしれんし
>>509 >>510 疑問が解けました、本当にありがとうございます。
試してみたところ(b + 33789)でセグメンテーションエラーが出て落ちました!
mallocってメモリを余分に確保するんですね、
Cの参考書に書いてないし全然知らなかった・・。
512 :
デフォルトの名無しさん :2007/01/12(金) 16:16:48
>>511 参考のために聞いておきたいんだけど、コンパイラは何を使ってるの?
ハリコの虎見てちんちんおっきおっき こ の 書 き 込 み を 見 た 人 は 三 年 後 に イ ン ポ に な り ま す 。 イ ン ポ に な っ て オ ナ ニ ー が 出 来 な く な る の が 嫌 な 人 は こ の 書 き 込 み と 同 じ 文 章 を 三 時 間 以 内 に 違 う ス レ に 五 回 以 上 コ ピ ペ し て く だ さ い 。 五 回 書 き 込 ま な か っ た 男 子 学 生 が 書 き 込み を 見 た 後 三 年 後 に イ ン ポに な り ま し
同じ型へのポインタで、単なるポインタの比較に意味がないシステムって例えばどういうのでしょうか?
よくわからんけどメモリマップドI/O使ってるとか?
文字列とかは? 同じ文字列でもアドレスは違うし
517 :
514 :2007/01/12(金) 18:08:55
すみません、微妙に文を間違えてました
K&RのP229、UNIXの記憶割り当てのところで確保したブロックへのポインタが
意味のある形で比較できることが前提になっているのですが
「標準規格が許すのは配列の中でのみのポインタの比較である。
したがってこの版のmallocは、一般的なポインタ比較に意味がある
マシンの間でのみ同じように通用する。」
とあって、意味がない場合と言うのが気になりました
>>515 メモリマップドI/Oがまだ良く分からないのですが、
ポインタがメモリアドレスを指しているわけではない場合ということですか
>>516 説明不足ですみません、マシンの方の問題らしいです
>>517 本の前提やコードが判らんからなんとも言えんが、
malloc()で確保したメモリ同士を比較することに意味がない環境は在り得る。
例えば次の結果は予想不可能だ。
int main()
{
void * p1 = malloc(1);
void * p2 = malloc(1);
printf("p1 %s than p2.\n", p1 < 2 ? "less" : "greater");
return 0;
}
519 :
517 :2007/01/12(金) 18:58:26
こいつは malloc の実装についてだぞ
>こいつは malloc の実装についてだぞ あ、最初からそういう風に言えばよかったんですね…orz
523 :
517 :2007/01/12(金) 20:11:45
あ、メモリアドレスはあくまでアドレスだから配列の中でないと 比較しても意味がない環境はあり得るって意味でしたか 自分が変に難しく考えてただけっぽいですね、ありがとうございました
524 :
デフォルトの名無しさん :2007/01/13(土) 05:11:43
超初心者です。 2枚の画像を任意の場所で重ねて一枚の画像として 出力するにはどのように考えればよいのでしょうか? 環境 winXP Visual C++.NET 2003 コンパイラ(?)→コマンドプロンプト
525 :
デフォルトの名無しさん :2007/01/13(土) 05:14:27
↑ Visual Studio.NET 2003の誤りです。 すいません。
527 :
デフォルトの名無しさん :2007/01/13(土) 12:47:08
>>526 Visual Studioうんぬんというより、c言語を使って上記の作業を行う場合、
基本的にどのような流れを組むかアドバイスしてほしいです。
初心者ですいません。
>>527 画像や画像表示はJavaのように言語や標準のライブラリ等の機能としてあれば説明できるが、
C言語の場合言仕様語にも標準のライブラリにも含まれない。
このため画像表示に関しては多くの場合プラットフォームや外部のライブラリに依存することになる。
そうであるためVSやVCスレでいう結論になる。
これでいい?
誘導先はこっちがいいじゃない 【初心者歓迎】C/C++室 Ver.33【環境依存OK】
530 :
527 :2007/01/13(土) 15:16:25
531 :
デフォルトの名無しさん :2007/01/14(日) 08:38:43
C言語のプログラムから電卓などのアプリケーションを呼び出すにはどうすればいいでしょうか?
system()は標準だと思う。 fork exec とか spawnは環境依存。
int f(int n)ってどういう意味なんでしょうか? どなたか教えてください
536 :
デフォルトの名無しさん :2007/01/14(日) 14:52:48
引数がint型でnに値渡しで渡して 関数f内でnをつかっていろいろ処理して 戻り値もint型なのでそのいろいろ処理した結果をint型で戻す
>>536 ありがとうございます!!!
もう1つあるのですが、よかったら教えてください。
for(p=2; p*p<=n; ++p)
for(;n%p==0; n/=p)
というfor文なんですが
上の行は /*pを2から1つずつ増やしていき、p*p がn以下の時、以下を計算*/
という意味でいいでしょうか?
下の行はよくわかりません。。。
>>537 pを2から始めて、p*pがn以下であるという判定が正しい時、以下を計算し、pを1増やして、判定以降を繰り返す。
nをpで割った余りが0であるという判定が正しい時、以下を計算し、nをpで割ったものをpに代入し、判定以降を繰り返す。
>>538 すごく論理的でわかりやすいです。
助かりました、ありがとうございました。
540 :
デフォルトの名無しさん :2007/01/14(日) 21:41:18
作者に訊くのは?
542 :
デフォルトの名無しさん :2007/01/14(日) 21:51:58
>>541 それが、Delphi製ということなので・・・
何かしらのヒントにはなると思っていますが・・・。。すみません
544 :
デフォルトの名無しさん :2007/01/14(日) 23:38:53
>>544 ありがとうございます。
本文コピペですが、そちらに貼らせて頂きます..
スタックオーバーフローを予防するためには、「できるだけヒープを使う」ことしかないのですか? プロの人は、「今ココでスタックを256バイト使っている」とか、計算しながら書いたりするのでしょうか。 デバッグ中に、スタックの使用量を求めることは出来るのでしょうか。
環境依存
組み込み系だとほんとに計算しながらやってたりしたな 今はどうか知らんが
main関数の引数のことで質問です。 main(int argc, char *argv[]) の*argv[]が**argvでもいいみたいなんですが、 *argvでなく**argvなのはなぜでしょうか?
*argv だと文字列いっこじゃね?
>>548 配列とポインタの関係が理解できてない。
参考書があるなら、配列の項目をしっかり読むといい。
質問です。 getch0()というのはどういう意味なんでしょうか? getch()がキーボードから1文字読み込むものだというのは分かったのですが 0っていうのがさっぱり分かりません・・・
552 :
548 :2007/01/15(月) 23:16:52
>>549 >>550 ありがとうございます。
アドバイスを参考に復習してきます。
インターネットで調べつつやっているんですが、
参考書みたいなものはあったほうがいいんでしょうか?
>>552 俺もインターネットで学習した人だけど、やっぱり参考書があったほうがいい。
資金がつぎ込まれているものはやはり完成度、確かさが違う。
金を出すのがイヤなら、学校や町の図書館で借りるのがいいかと。
>>552 C言語の本は星の数ほどあるけれど、これ以外読む必要はない
SEでこの本を読んでない奴はモグリ
ちなみに
>>548 の回答もズバリ「5.10コマンド行の引数」に書かれている
プログラミング言語C ANSI規格準拠 (単行本)
B.W. カーニハン (著), D.M. リッチー (著), 石田 晴久 (翻訳)
556 :
デフォルトの名無しさん :2007/01/16(火) 00:36:37
すいませんがこの問題が解けなくて困ってます 誰かヒントをもらえるとたすかりますm(__)m cos(x)をマクローリン展開してxに対して第n項まで計算して cos(x)の近似値を取り値とする関数double Maclaurin_cos(double x,int n)を 作成しなさい。 次に、x=-π/2からx=π/2までを256分割した場合に テイラー展開の第N項まで計算した時のグラフの面積S(TN)とcos(x)のS(cos)を 求め、以下の式で求めたエラーが5%以下になるNを求めなさい。 Error=|S(TN)-S(cos)|/|S(cos)|×100[%]
557 :
548 :2007/01/16(火) 00:37:00
558 :
548 :2007/01/16(火) 01:01:17
すみません、 argvには直接文字が直接わたってくると勘違いしていたみたいです。 argvには文字列へのアドレスが渡ってきて、 *argv=argv[0]=文字列へのアドレス(プログラムのあるアドレスの文字列)、 そして、**argvで文字列の最初の文字を見られる。 最初にポインタがわたってくる(?)から**argvということでいいんでしょうか。
559 :
デフォルトの名無しさん :2007/01/16(火) 01:01:49
560 :
555 :2007/01/16(火) 01:03:16
>>557 ごめん偉そうな事書いたけど
頭ごなしに信用して買うんじゃなくて、一応中確認してから買ってね
やっぱ生理的に合わない文体もあるから
でも俺は今のところ、この本を読んで解決しなかった謎はないよ
(理解できる範囲で)
あと周りの人必ず誰か持ってると思うんで、借りてみるのもいいよ
>>558 概ねそれで正解。
argvで渡されるのは、複数の文字列のポインタが詰まった配列。
最初のポインタは、最初のコマンドライン引数の一文字目ということになる。
したがって、i番目のコマンドライン引数にアクセスする場合は、arg[i]となる。
その中のj番目の文字にアクセスする場合は、arg[i][j]となる。
理解するのが面倒だが、がんばれ。
562 :
548 :2007/01/16(火) 01:41:26
よく読まない癖が出てみなさんに迷惑をかけてしまい申し訳ありませんでした。
>>559 英語はあまりできないので、時間はかかりそうですが少しずつ読んでみたいと思います。
むしろ、英語の勉強になりそうです。
>>560 プログラミングに関係ない環境にいるので、持ってる人はいないと思います。
でもかなりいい本みたいなので買ってみたいと思っています。
>>561 なるほど、すっきりしました。
argv[0]には文字が入ってると勘違いしていて1日くらいずっとループしてました。
もっともっと勉強して、いろいろなプログラムが書けるよう頑張りたいと思います。
みなさん本当にありがとうございました。おやすみなさい。
>>561 argvの最初のポインタは、最初のコマンドライン引数へのポインタでなく、
コマンドそのものの文字配列へのポインタ。
したがって、
> i番目のコマンドライン引数にアクセスする場合は、arg[i]となる。
は正しい。argvの添字は0から始まるから。
564 :
デフォルトの名無しさん :2007/01/16(火) 17:46:51
関数のポインタを利用したジャンプテーブル ジャンプテーブルとはどういう意味、モノですか?
>>564 処理の行き先を定義したテーブルのこと。
#include <stdio.h>
void fn1() { puts("function 1"); }
void fn2() { puts("function 2"); exit(0); }
void fn3() { puts("function 3"); }
int main(void)
{
void (*jump_table[])(void) = {fn1, fn2};
jump_table[0]();
puts("i return.");
jump_table[0] = fn3;
jump_table[0]();
puts("i return.");
jump_table[1]();
puts("i return.");
return 0;
}
関数へのポインタの配列を用意して、その配列の要素を関数として呼び出す。
このポインタの配列を関数のポインタを利用したジャンプテーブルという。
テーブルの内容を途中で書き換えるような使い方もできるし、
呼び出し先から戻ってこないようにすることもできる。
#include <stdio.h> int main() { char str[] = "This is a pen."; int count = 0; int i; for(i=0; str[i] != '\0'; i++); if(str[i] == ' ') count++; printf("sp = %d\n", count); return 0; } "This is a pen."に含まれる空白(スペース)の数を表示するプログラムを作りたいのですが、↑のものをコンパイルして実行しても実行結果は「sp = 0」となってしまい、うまくいきません。どう改善すればいいのか教えてもらえないでしょうか。
> for(i=0; str[i] != '\0'; i++); ↑
>>566 初心者のうちは、for文やif文の中身が単文であっても、
できるだけ{}で囲う癖をつけておいた方がいいよ。
そうすればそういう凡ミスは防げる。
569 :
566 :2007/01/16(火) 21:21:34
>>567 アー!!
ifに気をとられてました・・・。いつもこんなんで詰まっちゃう(TT
>>568 そうですか〜。教科書の例題なんかのをよくわからずに真似しちゃってました
回答ありがとうございました。
>>569 printfをいろんなところに入れてデバッグする癖をつけろ
さらにバグ出すかもしれんが
PSPでプログラミングをしたいと思っている者です。 画像を扱うとき、バックバッファはどうやって作ればよろしいでしょうか?
文字コードってポインタ?
いいえ
数と文字を一対一で対応させてるのがそれっぽく感じるけど、さすがに無理があるかー
575 :
デフォルトの名無しさん :2007/01/17(水) 11:42:58
#include <iostream> using namespace std; int main(void) { unsigned char x,y; cout << "2つの値を入力してください。\n"; cin >> x >> y; int a = x + y; int b = x * y; printf("x = %d, y = %d, x + y = %d, x * y = %d",x,y,a,b); return 0; } どうすればunsigned charの文字をそのまま整数として吐き出せるんでしょうか?
576 :
デフォルトの名無しさん :2007/01/17(水) 12:06:34
>>575 もう何がしたいのかわからねぇ
C++したいの?
Cしたいの?
どっちなのーーーーーー
577 :
デフォルトの名無しさん :2007/01/17(水) 12:16:02
C++っす
578 :
デフォルトの名無しさん :2007/01/17(水) 12:22:48
ここはC言語のスレっすよ!
>>575 '1'を 1 にしたいってことかな
x -= '0';
y -= '0';
580 :
デフォルトの名無しさん :2007/01/17(水) 15:17:31
C言語でsin(2πf)みたいなπと、変数fを使いたいときはどうすればいいんですか? include math.hってのはわかるんですが、 sin(2*3.14*f)ってすればいいんですか? πをあらわすのって無理なんでしょうか
M_PIでいける処理系も多いけど標準じゃないようなので、 math.hの中を検索して定義されていなければ、 自分で定数として定義するか、そのまま値を式に書くかする。
583 :
デフォルトの名無しさん :2007/01/17(水) 15:25:15
宿題ぐらいなら π=3.14 とするみたいに定義してあるだろ。多分。
π=およそ3
>>580 double MY_PI = 4 * atan(1);
あ・・・あのさ C勉強し始めて半年くらいたつんだが ここの質問の内容がほとんど理解できない これって才能ないんですか? みなさんプログラミング学習し始めてどのくらい経っているんですか? ちなみに、プログラマ目指している62歳です
588 :
↑ :2007/01/17(水) 20:18:00
22歳の間違えです
589 :
デフォルトの名無しさん :2007/01/17(水) 21:15:49
>>587 別に良いんじゃねーの〜
人それぞれペースってのがあるし
そりゃ才能や素質があればそれにこしたことはないけど
日々勤しめば成らざるを得やんや
ゆっくり行こうや
構造体の質問です。 例えば、 struct table dat[10000]; の10000を変数で定義できないんでしょうか? ファイルサイズに合わせて構造体の要素数を決めたいです。
>>590 malloc() & free()
スタックが十分にあるならalloca()でもいい
>>591 即レスありがとうございます。
struct table{
int amp;
int time;
int line;
};
struct table dat[76800];
int m=0;
for(int l=0;l<300;l++){
for(int n=0+256*l;n<256+256*l;n++){
dat[n].line = m;
}
m=m+1;
}
.....
恥ずかしい話、今はこのように無理やり計算してます。
malloc、freeを構造体に適用する場合どう書けばいいのでしょうか?
593 :
デフォルトの名無しさん :2007/01/17(水) 22:39:29
>>592 #include <stdio.h>
#include <stdlib.h>
typedef struct{
int amp;
int time;
int line;
} TABLE;
int main(int argc, char *argv[]) {
int m = 0, n = 0, l = 0;
TABLE *dat;
dat = malloc(sizeof(TABLE) * 76800);
if (dat == NULL) exit(-1);
for (l=0; l<300; l++) {
for (n=256*l; n<256+256*l; n++){
dat[n].line = m;
}
m = m + 1;
}
/* Test print ... */
for (m = 0; m < 76800; m += 10000)
printf("dat[%d].line = %d\n", m, dat[m].line);
free(dat);
return 0;
}
>>593 ありがとうございます。大変参考になります。
先がようやく見えました気がします。
>585 目から鱗がばさばさと落ちた。感動した。いままでの理解は何だったのだろう?
>>595 つーか、ネタとしても詰まらんのだけど、そのWikiもどき。
wikiとwikipediaを一緒にするヤツは許せない
62歳ワロス
int a[10][10]; int[10][10] f(){return a); //コンパイルエラー void g(int a[10][10]); //引数ならできた この関数fの戻り値の型ってどうすればエラー消えますか
Cでは配列は返せない。 構造体にするかポインタで
601 :
デフォルトの名無しさん :2007/01/18(木) 01:11:00
>>599 戻り値にint[10][10]としてるが、例えばその戻り値のaの値はint[10][10]のどこに入る?
ま、簡単に言えば、構文として成り立ってない。
適切な戻り値の型以前にその関数が何をしたいのかが分からない。
まだ、その関数の用途が分かれば返答も出来るけどね
>>600 なるほど、ありがとうございます
>>601 すみません、特に用途があるわけではなくちょっと疑問におもっただけです
int (*)[10] f() { return a; } としたらエラー消えないか?
もしくは構造体ハック struct B { int a[10][10]; } b; struct B f() { return b; }
typedef int hoge_t[10]; int a[10][10]; /* hoge_t a[10];と同じ */ hoge_t *f() {return a;}
607 :
デフォルトの名無しさん :2007/01/18(木) 19:47:32
H8/3664のマイコンで7セグメントLEDで表示する貯金箱を作ってるんだけどC言語のプログラムが全くわかんないですorz コインの識別はコインセレクター(自販機とかにある500,100,50を識別する機械)で判別させようと思うんだけど… わかる頭が良い人教えてください
608 :
デフォルトの名無しさん :2007/01/18(木) 19:49:00
H8/3664のマイコンで7セグメントLEDで表示する貯金箱を作ってるんだけどC言語のプログラムが全くわかんないですorz コインの識別はコインセレクター(自販機とかにある500,100,50を識別する機械)で判別させようと思うんだけど… わかる頭が良い人教えてください
LINUXでC言語のプログラムを作成しているのですが エラーでcoreを出力したときの中身の見方が分かりません。 ぐぐってもいまいち見つからなかったので・・・
>>610 レスどうもです。dbxでぐぐってみました。
コンパイル時に -g オプションを付けて
dbx (ファイル名).c core.**
とすれば良いのでしょうか?
そこまで甘えるのか
構造体のデータをまるまるファイル分割してもってくることってできます? A.cでつくった構造体のデータをB.cでも使えるようにする方法ってあります?
>>613 インクルードファイルに構造体を書いて、両方でインクルードする。
>>614 ありがとうございます
しかし、宣言に記憶クラスが多すぎる
というエラーがでるのですが
616 :
デフォルトの名無しさん :2007/01/19(金) 02:50:38
ファイルの入力で読み込んだ文字を全て一旦 変数に格納したいのですが、どのようにすればいいのでしょうか? いろいろ試してみたのですが、実行中に突然エラーになってしまったり して、どうすればいいのか困っています。 わかる方 教えてください。 ちなみに具体的に説明すると while(c=fgetc(fp))!=EOF){}のchar型変数cに格納された 文字をほかに用意した変数(a[200])に一回一回格納して いくにはどうすればいいのか? ということです。 よろしくお願いします。
617 :
デフォルトの名無しさん :2007/01/19(金) 03:14:58
fread(a, 1, 200, fp);
標準Cだけで書かれた有名なソフトウェアってどんなのがありますか?
hello, world
621 :
デフォルトの名無しさん :2007/01/19(金) 05:31:38
ちょいと長くなるが入力した日付の前後の日にちを表示するプログラムを作りたいんだ うまく書けたと思ったんだがどうも計算がうまく行ってない様なんで間違いを指摘してください #include<stdio.h> void yesterday(int *y,int *m,int *d) { if(d == 1) { *m--; if(m == 0) { *m=12; *y--; } } else { *d--; } }
622 :
デフォルトの名無しさん :2007/01/19(金) 05:32:44
void tomorrow(int *y,int *m,int *d) { if(d == 30) { *d=1; *m++; if(m == 13) { *m=1; *y++; } else { *d++; } } } int main(void) { int pa,pb,pc,pd; printf("西暦と日付を入力してください\n"); printf("西暦:");scanf("%d",&pa); printf("月:");scanf("%d",&pb); printf("日:");scanf("%d",&pc);
623 :
デフォルトの名無しさん :2007/01/19(金) 05:33:21
do{ printf("昨日の日付と明日の日付どちらを表示するか入力してください\n"); printf("明日:[1]、昨日:[2] ");scanf("%d",&pd); if(pd==2){ yesterday(&pa,&pb,&pc); printf("昨日の日付は西暦%d年%d月%d日です\n",pa,pb,pc); } else if(pd==1){ tomorrow(&pa,&pb,&pc); printf("明日の日付は西暦%d年%d月%d日です\n",pa,pb,pc); } else { printf("入力しなおしてください\n"); } }while(pd==0,pd>2); return(0); } よろしくお願いします
>>621-623 Cプログラミングの練習をしているならともかく、
time.hにあるtm構造体や各種関数を使った方が綺麗にまとまるんじゃないか?
625 :
デフォルトの名無しさん :2007/01/19(金) 05:53:30
ポインタを使った演習なんです
626 :
デフォルトの名無しさん :2007/01/19(金) 06:11:41
なんとかできました もういいです ありがとうございました
>>616 while(c=fgetc(fp))!=EOF){
a[i] = c;
i = i + 0;
};
これじゃだめ?
あと実行中のエラーは、a[200]の場合、読み込んだ文字列が
200文字超えた時に起きてるのじゃないかな。
このエラーは、mallocとreallocを使って、読み込みながらメモリを
取得していくことで解決できるよ。
628 :
はじめまして :2007/01/19(金) 09:38:32
昨日からCに挑戦してます。 コンパイラの設定を誤り、正しくコンパイルしてくれません。ちなみにbcc32です。購入した本はXPを使った演習で、こちらは98です(古いorz) プロンプトはMS-DOSでコンパイラの場所はC:>\windows\borland\bcc55\bioです。本には正しくコンパイラが動作するようにpathが付けようとか書いてるけど、その本には環境変数をどうたらかんたら……。でも98にはそんな項目が見当たらない……。 ※本の題名は「10日でC言語〜」著:坂下 夕里
>>628 環境変数の設定が必要。
少なくとも、PATH、INCLUDE、LIB は入れないと。
98の環境変数はSET コマンドで設定する
毎回同じものを設定するならBATファイルに設定
AUTOEXEC.BATに入れとけばずっと設定される。
630 :
デフォルトの名無しさん :2007/01/19(金) 11:06:17
ありがとうございます! 早速…と、思ったら… なになに!? クラスタスキャン!? なんだよこれ!!!
>>627 realloc()を使うようなプログラムなら、malloc()は不要だろ。
初回だけmalloc()を使うなんて扇子ないぞ。
そうか?
それほどでもない
そんなことより >i = i + 0; ここに突っ込もうぜ。
636 :
デフォルトの名無しさん :2007/01/19(金) 15:28:56
>>628 十日でC言語〜
って本読んでも十日でみにつくもんじゃないから
その本一通り終わったら、他にもネットや本で
知識と経験をたくわえよーな
有名な本は
プログラミング言語C(K&R) 共立出版社 //初心者向きではない
ポインタ完全制覇 技術評論社//ポインタについて解説
C言語によるアルゴリズム事典 技術評論社 //アルゴリズム全般を網羅した事典
//俺が買った本
C言語入門本物志向が身に付く本 技術評論社 //入門書としてはけっこう良いと俺は思う
C言語文字列操作+ファイル入出力完全制覇 技術評論社 //けっこう俺にはためになった
ANSI C言語辞典 技術評論社 //間違ってるとこ多数有るがリファレンス本として
新C言語入門 ソフトバンク //シニア編しか持ってないけど
//DOS環境ならシニア編の次のやつが役立つかも
//参考サイト
ttp://wisdom.sakura.ne.jp/ ttp://www.geocities.jp/ky_webid/algorithm/index.html がんばってください
62歳じゃもう無理だろ。 来世に期待しろ。
>>636 応援ありがとうございます。
XPを持っている叔父の家で練習します。
その後、その参考資料をもとにレベルアップをはかります!
なんとかできました もういいです ありがとうございました
640 :
デフォルトの名無しさん :2007/01/19(金) 21:49:33
クイックソートの安定性が欠けるという問題点 を解決する方法についてお教えください。 よろしくお願いします。
>>640 よくわからないがこういう答えでええの?
1.安定なソートアルゴリズムを使う。
2.順番に番号を振ってからクイックソートする。
>>641 ありがとうございます。
参考になります。
ディレクトリ内のファイル列挙がしたいっス ><;;
参考書の問題なんですが 次に示すように、二つの整数値を読み込んで、前者の値が後者の何%であるかを表示するプログラムを作成せよ。 の問題をこういう形で答えたいんですが・・・ 2つの整数を入力してください。 整数A:○ 整数B:○ Aの値はBの○%です。 説明下手ですみません・・・
自分で解かないで何の意味がある? 部分的に聞きたいのなら、どこがわかってどこがわからないのか、自分の中で切り分けろ。
もし宿題なら宿題スレへ池
648 :
644 :2007/01/21(日) 01:58:12
すいません誰か教えてください
malloc()の使用例で int *a = (int *)malloc(1024); とキャストしているのをよく見るんですが、何故キャストしているんでしょうか?
考えられる理由は2つ。 1. 昔のCにはvoid*がなくchar*で代用していたためキャストが必要だった。 2. 実はC++としてコンパイルしている:C++では型安全性のためvoid*から他のポインタ型への変換にはキャストが必要になった。 もちろん好みでやっていると言う可能性もあるが、そういう人も上に挙げた理由の影響を少なからず受けていると思う。
651 :
649 :2007/01/21(日) 23:38:27
>>650 なるほど、良く分かりました。
ありがとうございました。
継続条件と判定条件の違いがわかりません
宜しくです unsigned charとcharの違いをざっくりと教えてもらえませんか
unsigned char 0〜255 char -127〜127
>>654 >>653 です
ありがとさんです
unsigned charもcharも文字型の変数ということには変わりないですよね?
>>654 間違い。
charはsignedであってもunsignedであってもいい。
>>653 ,657
規格ではそのように定められているので、
>>656 が正しい。
(ISO/IEC 9899:1999 6.2.5 Types 15)
区別は<limits.h>で定義されているCHAR_MINの値が0かSCHAR_MINかによって
可能であるとされている。
(ISO/IEC 9899:1999 footnote 35)
普通はcharならsignedと考えるだろ。実際signed charとか宣言しねーし。
だから
>>654 でも正解といえるな。
>>653 です
みなさんどうもありがとうございます
ANSI Cであることを明示しなくて申し訳なかったです
結論としては
unsigned charとcharの区別は無く、同じ文字型の変数を表すという事と理解しました。
662 :
658 :2007/01/22(月) 20:22:26
>>653 の質問は二つの意味にとれる。
(1)unsigned charとsigned charの違いをざっくりと教えてもらえませんか
(2)unsigned charとunsigned charの違いをざっくりと教えてもらえませんか
それを確認しないで、回答した
>>654 は早とちり。
さらに
>>654 に突っ込む
>>656 も早とちり。
(1)の場合は
>>654 が正解。(2)はありえない。
>>653 です続けて申し訳ないのですが
次の質問をさせて下さい
この様なmain関数とfor文が出てきたのですがこのfor文はどんな振舞いをするのでしょうか?
さっぱり理解できません、宜しくお願いします。これもANSI Cです
void main(int argc, char *argv[])
{
int i = 0;
for (--argc, ++argv; argc > 0; --argc, ++argv, i++) {
//処理
}
}
>>663 unsigned charとsigned charとcharは各々異なる型なんだが、
signed charとcharが同じものだと勘違いしてないか?
>>664 すべてのargvに対して処理をしている。
ただしargv[0]、すなわち"program name"(自身のパスのことが多い)を除く。
っていうかその文でのiの意味がわからんな。 iを定義したなら for(i=1; i<argc; i++) { で処理内でargv[i]を使う方が普通じゃないか?
>>665 unsigned charとsigned charとcharが各々異なる型なのはC++の場合。
Cの場合charはsigned charまたはunsigned charと同じとされている。
だから663は一見おかしく見えるが、おかしいことは言っていない。
unsigned foo[10];とunsigned int foo[10]は同義と考えていいですか? ANSI Cです。
はいそうです。
>>668 charは、signed charとunsigned charとのいずれとも、異なる型であり、compatibleではない。
(ISO/IEC 9899:1999 footnote 35)
/\___/\ / / ヽ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < まーたC99か!! | ,;‐=‐ヽ .:::::| \_______ \ `ニニ´ .:::/ /`ー‐--‐‐―´´\
>>671 char/signed char/unsigned charってどう違うの??
>>674 charがsignedかunsignedかは処理系定義。
実際、コンパイラオプションで切り替えられるのが一般的。
従って、>654では不充分。
>>674 でもあってるじゃねーか馬鹿じゃねーのこいつ・・
>>653 の「ざっくり」が読めてないのか?
>>675 >charがsignedかunsignedかは処理系定義。
charをunsignedでコンパイルしている奴には今までお目にかかった事はないな実務としてだけど
初心者スレ程度なら
>>654 でざっくり覚えておけばいいだろ、というかいい加減にしろ
初心者がざっくり覚えるなら、「charは処理系定義だけど大抵はsigned charとして使われている」でいいじゃん。 で、charが処理系定義であることを認めない香具師は何でそんなに必死なの?
必要なのは数字の範囲だからなあ 規約云々ばかり言ってるとあたまでっかちに思われるから注意した方がいいよ
>680 LSI C-86はcharをunsignedにしていたはず。
684 :
デフォルトの名無しさん :2007/01/23(火) 16:20:43
宜しくです unsigned charとcharの違いをざっくりと教えてもらえませんか
-j オプションをつけると、unsigned char になる
ということはデフォルトはsigned char??
687 :
デフォルトの名無しさん :2007/01/23(火) 16:47:32
20MBほどの.hファイルをインクルードしようとしたらヒープ領域を使い果たしましたというエラーになりました。 うまくインクルードする方法はないでしょうか?
>>687 OSなやIDEどの環境とコンパイラの種類とヴァージョンくらい書こうな。
1つのファイルで20M?それともトータル?
a->b[a->c] = x; ++(a->c); これがどういう動きをしてるのか詳しく教えて下さい。 2行続けてソース内に入力されています。
a->bの配列、添え字a->cにxを代入 a->cをインクリメント
691 :
デフォルトの名無しさん :2007/01/23(火) 19:16:28
#include <stdio.h> #define pow2(x) ((x)*(x)) main() { int a = 5; printf("%d\n", pow2(++a)); } というプログラムは、printfの行が printf("%d\n", ((++a)*(++a))); のように展開され、6*7=42になると 思ったのですが、gcc でコンパイル して実行してみると、(7*7=)49が かえってきました。なぜでしょうか。
コンパイラ依存なんで考えるだけ無駄 そしてコンパイラに依存するコードは書いてはいけない
693 :
デフォルトの名無しさん :2007/01/23(火) 19:29:44
694 :
デフォルトの名無しさん :2007/01/23(火) 19:40:17
C++にも絡む話しなんですが、いいでしょうか? Cのソースをライブラリにして、C++で使いたいのですが、 gcc -fPIC -Wall -c libtest.c gcc -shared -o libtest.so libtest.o gcc -o main main.c -L. -ltest のようにすると(Cでコンパイル)問題なく実行できますが、 gccをg++に変えると、 undeclared (first use this function) となってしまいます。 C++についてはあまりよく知りません。 アドバイスをよろしくお願いします。
696 :
デフォルトの名無しさん :2007/01/23(火) 20:20:01
宿題がどうしても解けないので教えてもらいたいです。 お願いします。 [1] 授業単元: C言語 [2] 問題文(含コード&リンク): 生徒の点数を入力すると、平均点と最高点・最低点を表示するプログラムを作成せよ。 『-1』が入力されたらデータの最後とする。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: Borland C++Compiler [3.3] 言語:C++ [4] 期限: 出来るだけ早くお願いしたいです。 [5] その他の制限: 出力例はこんな感じです。 点数を入力してください:87 76 45 73 66 -1 平均点:69.4 最高点:87 最低点:45
>>696 どこのテンプレかしらないけど、そこまで書式整えてんなら、素直に宿題スレ行けよw
ごばくだろw
699 :
694 :2007/01/23(火) 20:29:58
extern "C"{} を使うとうまくいくようです。 失礼しました。
stdlib.hにあるqsort()やbsearch()のような、任意のデータ型の変数へのポインタとそのデータ型のサイズを渡して 配列などのデータを変更するような関数が作りたくて、以下のようなプログラムを作ったのですがうまく動きません。 void *vcopy ( void *dest, const void *src, size_t n ) { size_t i ; for ( i = 0 ; i < n ; i++ ) { * ( unsigned char * ) ( ( size_t ) dest + i ) = * ( unsigned char * ) ( ( size_t ) src + i ) ; } return dest ; } ポインタsrcが指すnバイトのデータ型の変数の内容を、ポインタdestが指す 同じnバイトのデータ型の変数へコピーする関数として作ったつもりです。 hoge = * ( unsigned char * ) ( ( size_t ) src + i )としてもhogeには0が入ってしまいます。 やはりこのようなポインタの使い方は無茶で、__asmなどを使わなければ駄目なのでしょうか? 環境はWindows XPでコンパイラはbcc5.5.1.2です。
まさかsizeof(size_t)が2でsizeof(void*)が4という話ではないだろうな
>700 その関数使ってみたけど、ちゃんとコピーできたよ。
ごめんなさい、この関数を用いたサンプルコードで引数のdestとsrcの順番が逆だったようです スレ汚しすいませんでした
あいうえお,1,2,3,4,5 ...... ,50 かきくけこ,1,2,3,4,5 ...... ,50 ・ ・ ・ 上のような、カンマで区切られたtxtファイルを 構造体配列に格納したいのですが 1行あたり50個程データが有り 一つ一つ格納していくと、どうしてもコードが長くなってしまいます・・・ 配列のように簡単に格納出来るような良い方法は無いでしょうか?
ってループ組めば個数関係ないじゃん
たぶん、行中にある50個のデータそれぞれについて代入文を書くのが面倒くさいって言ってるんじゃまいか。 各行の各項目を全部文字列として格納しちまえ。 もし、各項目の文字列の最大長があまり変わらないなら、長さの決まった文字配列に、 最大長を決められないとかなら、ヒープからでもメモリを割り当てて、それにそれぞれを格納する。 そうすれば、構造体じゃなく行番号と項目番号と項目内容の各文字の位置をインデックスとする三次元文字配列か、 行番号と項目番号をインデックスとする文字配列へのポインタの二次元配列で済むぞ。 ループで楽に回せる。
>>706-707 なるほど、わざわざ構造体にせずとも、多次元配列+ループを使えばいいわけですね
そっちの方向で練り直してみます、ありがとうございました
709 :
デフォルトの名無しさん :2007/01/24(水) 18:34:22
>>707 非常に関心があります、具体的なコードを書いてみてもらえますか?
>>705 のtxtファイルの行数が予めわかってるか否かで
配列にするか構造体にするか変わってくるんじゃね?
コマンドライン引数として"-a"と入力されたときに、"aiueo"というメッセージを表示するプログラムを作りたいのですが、うまくいきません。 ソースは以下の通りです。 #include <stdio.h> int main(int argc, char *argv[]) { if (argc != 2) { printf("error\n"); exit(0); } if (argv[1] == "-a"){ printf("aiueo\n");} return 0; } 改善点を教えていただけないでしょうか。
>>711 >if (argv[1] == "-a"){
間違い
コンパイル時に出力されたエラーも書けよ
>712 エラーはでない。 警告なら出るが、うまくいかないのとは無関係。
714 :
711 :2007/01/25(木) 02:53:51
すみません。エラーはでませんでしたが、実行しても何も表示されませんでした。 条件文をどのようにすればいいんでしょうか・・・?
if (strcmp(argv[1], "-a") == 0)
716 :
711 :2007/01/25(木) 03:25:06
>>715 ありがとうございます。解決しました。
strcmpには大小関係を比べるイメージしかなかったのですが、こういった使い方がありましたか。
うーん、理解が足りてない。精進せねば・・
>>713 こういうあげあし取りのレスって恥ずかしいよな・・・w
リアルでもいるだろ、教科書の一字一句を盾に重箱の隅突付いて「俺が正しい」みたいな顔してるやつ。
スゴイ自演でスレが止まったなw
>>716 そもそも、こっちの使い方のが多いと思う。
大小も比較するなんてほとんどソートの時だし
ひどい自演だww
テキストファイルを1文字毎に読み込むのと、1行毎に読み込むのとでは どのような違いがあるのでしょうか??
改行コードを気にしなくてすむ
いや改行なんてCではいつでも'\n'だろ。
>>723 違いなんて別にない。処理しやすいほうを選べ。
>>725 LF、CRは1バイト、CRLFは2バイトですが何か
テキストモードで読み書きすれば、外の環境で使われる改行の表現が何であろうと、プログラムの中では常に'\n'1字。
>>727 ありがとうございます
一行の方にします
729 :
デフォルトの名無しさん :2007/01/27(土) 15:09:09
なんか小技ないですかね ソースを全部コピーして別ディレクトリに別の名前で保存とか
プログラムとしては簡単だけど、windowsとかなら自分でコピー&ペーストした方がはやいだろ。
>>729 C言語にファイル操作の小技なんてない。
外部のデータファイルからデータを入力したいのですが どのようにしたらよいのでしょうか
fopen fclose fread fgets fscanf
735 :
デフォルトの名無しさん :2007/01/29(月) 01:43:51
複数行あるテキストファイルを、fgetsを使って最後まで読み込みたいのですが、 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fp; char buf[128]; char *c; if(argc != 2) { printf("usage: prog filename\n"); exit(0); } fp = fopen(argv[1],"r"); if(fp == NULL) {printf("cannot open file\n"); exit(0);} c = fgets(buf,128,fp); while((*c != EOF)){ printf(buf); c = fgets(buf,128,fp); } fclose(fp); } このプログラムを実行すると "Segmentation Fault"が出てしまいます。どうすればいいんでしょうか?
*cをEOFではなく、cをNULLと比較しなさい。 printfは"%s",bufを使いなさい。 そして関数のマニュアルを読みなさい それはあなたのプログラムをよりよくする助けです。
737 :
735 :2007/01/29(月) 02:08:28
>>736 解決しました。
いつもは%sを使っていたんですが、今回はわけもわからずお手本を真似ていた次第です。
ありがとうございました。
べつにbufでもいいけどな、中に%が入ってなけりゃw
739 :
デフォルトの名無しさん :2007/01/29(月) 16:13:43
#include <stdio.h> int main(){ int n; char ch; printf("数値: "); scanf("%d", &n); // ←(1) printf("文字: "); scanf("%c", &ch); // ←(2) printf("入力された数値: %d\n", n); printf("入力された文字: %c\n", ch); return 0; } このプログラムを実行して(1)の所で数値を入力してEnterを押すと(2)の所で入力を待たずに終了してしまうのですが何が問題なのでしょうか?
>739 >494
>>740 なんでスペース入れると改行文字を読み飛ばせるの?
>>741 scanf()系のフォーマット指定における空白とは、「ホワイトスペース文字(空白、改行、タブ)の読み飛ばし」と言う意味だからです。
743 :
デフォルトの名無しさん :2007/01/29(月) 17:23:02
はじめまして。初級過ぎて申し訳ないんですけど、 1から10まで加算する時、どう書けばいいか教えてください!
1+2+3+4+5+6+7+8+9+10
int sum = 0; for (int i = 1; i <= 10; ++i) sum += i;
(10 * 11) / 2
10*(10+1)/2
int sum; while(sum != (10*11)/2) sum++;
printf("1から10まで加算=%d\n", 55);
750 :
デフォルトの名無しさん :2007/01/29(月) 18:16:48
char *end (char*)a この二つの違いを教えてください
前者は変数宣言の一部と思われますが、後者はキャスト演算子を含んだ式の一部と思われます。
752 :
750 :2007/01/29(月) 18:21:38
すみませんまちがいました。 char *a (char*)a この二つの違いを教えてください
char *a はchar* a と同じ
754 :
750 :2007/01/29(月) 18:23:49
>>752 それらが現れる文脈によって異なります。
756 :
750 :2007/01/29(月) 18:50:14
たびたびすみません。 void *base; size_t nmemb; size_t size, char *p1; int end = (int)base + nmemb * size; for(p1 = (char*)base; p1 < (char*)end; p1 += size){ 上の二つの文はそれぞれどういう意味なのでしょうか? できるだけ詳しく教えてください
キャスト void*型(もしくはvoidへのポインタ型) ポインタ演算 これがこのコードで理解してほしいところだと思うんだけど、上に挙げた言葉のうちわからないのはどれ?
758 :
デフォルトの名無しさん :2007/01/29(月) 19:29:47
連立2次方程式のx yを求めるにはどうしたらいいのですか? ノートでは式を立てられるのですが、C言語で解く方法を知りたいです。
行列にして解くとか。ガッコで習わなかった?
>>758 ヒント:2つの式をy=ax+bの形に変形してyを除去
行列は高校で習うんです。 中学校レベル、できれば小学校レベルで教えてください。
別に学校で習わんでも世界中に情報は転がってると思うが・・・
>761 小学校じゃ連立方程式はやらん。
764 :
758 :2007/01/29(月) 20:32:06
すみません。 MATLAB では解けるんですが、Cが分かりません。 具体的に言うと、線分ABの両端に、点A、点Bを中心にした円を描いて、 円と線分ABの交点を求めるだけなんです。 点A、点Bの座標、円の半径はわかっています。 これを片方ずつ解くだけなのですが、Cでの求め方がわかりません。
ソース上で数値を扱う場合、 マクロはプログラムの軸構造を無惨に変更する(?)#defineは使わず、 enumを使うべきだと習いました。 無惨に変更するって、#defineはCソースでよく使われていると 思いますが、問題を抱えているんでしょうか?
スレ違い 初心者用じゃない
767 :
765 :2007/01/29(月) 20:43:45
ううorz なぜ... わかりました。他に行きます。
>>765 enumで列挙することで、一つのグループとしてまとめて定義できるから
わかりやすいからじゃないかな??
例えばなんらかの関連のある定数A、B、Cを
enum teusu { A=0, B=1, C=2 }
とするのと
#define A 0
#define B 1
#define C 2
とするのではenumの方がわかり易いとか・・
Cで集合型が欲しいです
enumは一応、型とかスコープとかあるからな。
771 :
デフォルトの名無しさん :2007/01/30(火) 00:01:20
初心者はC言語の前にアセンブラを勉強するといいとのことですが、 なぜでしょうか。今、CASLUを勉強しています。 将来は組み込みのプログラマになりたいです。
772 :
デフォルトの名無しさん :2007/01/30(火) 00:11:44
失礼します。 今日C++をはじめてみた者です。アホらしい質問かもしれませんがお願いします。 以下のプログラムについて質問です。 #include <iostream> using namespace std; class Glass {int nakami; //水の量 public: Glass(int x) : nakami(x){} //引数を取るコンストラクタ //ユーザかプログラマに渡される値(xで表される)をnakamiに格納 void dasu(int); //水を出す関数 }; void Glass::dasu(int x){ if(nakami >= x){ nakami -= x; cout<< "水を出しました。" << endl; cout<< "現在のコップの中身は" << nakami << "です。" <<endl; } else{cout<< "そんなに水がありません。" <<endl; cout<< "現在コップの中には" << nakami << "入っているだけです。" <<endl; } } int main() {int x; //整数の「いれもの」xの定義。下のcinの前ならどこにあってもよいのです。 cout << "コップを生成します。どれだけ水をいれるか入力してください。" << endl; cin >> x; Glass glass(x); //引数を取るコンストラクタが呼び出され、 //水がxだけ入ったglassという名のコップが生成される cout << "さあ、glassから水を出します。いくら出しますか。入力してください。" <<endl; cin >> x; //上のxを使いまわしている glass.dasu(x); cout<<"終了"<<endl; } これは、とある(おそらく有名な?)C++入門ページの所からの引用なんですが、 なぜ、変数のxを使いまわすことができるのかわかりません。 一回目に指定した物がnakamiに入って、二回目に指定した物がdasu量になるなんて、 そんな都合のいいようになるわけが・・・と思ったら普通になったわけですが、どうなってるんでしょうか?
>>772 何を言っているのかさっぱり分からない。
JAVA使いだと勝手に推測してみる。
>>771 アセンブラはよりハードに近いプログラミングを行うので、ハードとソフトの関係を理解できる。
ハードとソフトの関係を最初に習っておけば、C言語のような高等言語の裏で何が行われているのか、
よく分かるようになり、学習、理解の幅が広がる。
いわば基礎固め。
重要。
遠回りと思えるけれど、勉強して損になることは全くない。
775 :
デフォルトの名無しさん :2007/01/30(火) 00:23:32
>>773 JAVA使いではありません。というより、プログラム自体
今日まさに始めたばかりなので拙い表現で申し訳ないのですが、
まぁ要するに、コップに入った水っていうクラスを作ってみて、
その初めにある水の量と、dasuという関数で捨てる量をどっちもxで
表しているのにどうしてごちゃごちゃにならずに実行されるのかが
分からないわけであります。
776 :
デフォルトの名無しさん :2007/01/30(火) 00:28:34
>>773 JAVA使いではありません。というより、プログラム自体今日始めたばかりなので
拙い表現で申し訳ないのですが、要するに、
水の入ったコップというクラスを作って、その最初から入っている水の量と、
関数によって捨てていく水の量をどっちもxで表しているのに、
ごちゃごちゃにならずに普通に実行されるのはなんでかなぁというわけであります。
おーい、誰か。>772のコメント持ってっちゃってくれ。
778 :
デフォルトの名無しさん :2007/01/30(火) 00:32:36
やはり連投してしまっていたかorz あのー、もしやこの質問はC言語ではなくC++の方に するべきでしたでしょうか・・・?
もしかしなくてもそうです。
アセンブラと言うか、実際のCPUがどういう演算してるかぐらいは知っておくと、Cのような高級風言語でも比較的最適化されやすいプログラムが組める。 アセンブラの次は、Cの場合だとCコンパイラの生成する実行ファイルの解析って感じ。 VCでも、gccでもiccでも違うし。
>>780 なんかもう、そういうのは10年くらい前にあきらめました。
素直に書いて、あとはコンパイラの最適化におまかせ。
素直に書くってのが難しいわけだが
オプティマイザーが迷わず成仏・・じゃなかった最適化できるような書き方をする。 そういうノウハウはあるね。
>>782 素直でない書き方ってのは、16bit時代には通用してた速い書き方。
#include <stdio.h> int main(void) { int num; num = 3; printf("変数numは→%dです\n", num); return 0; } Visual C++ Expressを使っています ここまで書いたんですが、 ------ ビルド開始: プロジェクト: ****, 構成: Debug Win32 ------ 実行するビルド コマンド ラインがありません。 メイクファイル プロジェクト動作を実行しています。 プロジェクト : error PRJ0046 : 指定されたコマンド ラインが空だったため、コマンド ラインを起動できませんでした。 ビルドログは "file://c:\Documents and Settings\*************************.htm" に保存されました。 **** - エラー 1、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ========== と出てしまいます どこがおかしいのですか?
>>785 それはC言語の問題ではないのでVisualStudioの初心者向けのスレへどうぞ。
すみません。 win環境で新たにC言語を勉強しようと思っていますが、 無料で手に入る、ボーランド社のコンパイラと マイクロソフトのVC++は、どちらを使えばよいのでしょうか? そんなに大差があるわけでもないのでしょうか? お願いします
無料なんだし、とりあえず両方さわってみては
仕事すること考えたらVC++かなあ・・
質問です。 何故か C/C++ では #include されるファイルを ヘッダファイルと実装ソースに分けるようですが 直接、実装 .c ファイルを読み込むのではいけないのでしょうか?
792 :
デフォルトの名無しさん :2007/01/30(火) 14:49:39
「あいう」というcharの配列の中身を16進数の文字列(文字コード?)に変換するにはどうすればいいですか? また変換された16進数の文字列を元に戻すにはどうすればいいでしょう?
printf系で %02X 使うとか。 戻すのは strtol() とか
>>790 hは宣言、c( → cpp ?)で定義って
オブジェクト指向のことを言いたいの?
たまに、ヘッダに書くような関数のプロトタイプ宣言や
構造体とかをcppに各会社があるね!
795 :
デフォルトの名無しさん :2007/01/30(火) 16:40:56
>>793 ありがとうございます。
こんな風にしてみたんですが「あいう」に戻ってくれません。。。
たくさん間違ってると思いますが、どうすればいいんでしょう?
char hoge[] = "あいう";
char buf[16];
char fuga[16];
sprintf(buf, "%02X", hoge);
for (int i = 0; i < (int)strlen(buf); i++)
{
char c[3];
c[0] = buf[i * 2];
c[1] = buf[i * 2 + 1];
c[2] = '\0';
fuga[i] = strtol(c, NULL, 16);
}
796 :
795 :2007/01/30(火) 16:41:44
ごめんなさい、最後の式は fuga[i*2] = strtol(c, NULL, 16); でした。
サイズの可変する配列をつくる課題があります。 その際、チャンク単位でサイズを変更すること、とあります。 チャンクってなんでしょうか?(ググったんですけどイマイチわかりません)
#defineによる定数と列挙型定数の、使い分けの指針みたいなものを教えてください。
>>795 %02Xは1バイトだけだから、バイト数分繰り返せ。
800 :
790 :2007/01/30(火) 17:41:21
解答ありがとうございます。 しかし申し訳ないのですが疑問はうまく晴れません… >791 ??? 実装が2ヶ所から読まれることがあるのですか? どういう場合にそうなるのか解らないのですが… >794 いいえ、C言語のスレなので、関数の宣言のことです。 もちろん C++ のクラスのことも含まないわけではないですが C言語でそうなっている理由が解れば C++ でそうなっている理由も解ると思ったので…
>>800 複数のソースで同じヘッダファイルを読むだろう
> cat libfoo.c #ifndef (以下略) > cat mainbar.c #include "libfoo.c"
誰か↓の関数の使い方教えてください。 int addname(Nameval newname) { Nameval *nvp; if (nvtab.nameval == NULL){/* 一番最初 */ nvtab.nameval = (Nameval *)malloc(NVINIT * sizeof(Nameval) ); if (nvtab.nameval == NULL) return -1; nvtab.max = NVINIT; nvtab.nval = 0; }else if ( nvtab.nval >= nvtab.max ) { /* 伸張 */ nvp = (Nameval *)realloc(nvtab.nameval, (NVGROW*nvtab.max) * sizeof(Nameval) ); if( nvp == NULL ) return -1; nvtab.max *= NVGROW; nvtab.nameval = nvp; } nvtab.nameval[nvtab.nval] = newname; return nvtab.nval++; }
805 :
804 :2007/01/30(火) 18:11:24
構造体は、↓です。 お願いします。゚+.((人д<o)(o>д人))゚+. typedef struct Nameval Nameval; struct Nameval { char *name; int value; }; struct NVtab{ int nval;/* 値の現在の個数 */ int max;/* 割り当て済みの値の個数 */ Nameval *nameval;/* 名前-値ペアの配列 */ } nvtab; enum{NVINIT = 1, NVGROW = 2};
>790 ひょっとして、全プロジェクトを単一の翻訳単位ですますのはどうか、 という疑問なのか?
その昔、80年代終わりに書かれた入門書には、 分割コンパイルがあたかも上級テクニックのように本の後ろのほうに載ってて、 子供だった自分には何か大げさで込み入った仕掛けのように思えたものだ。 時を経て今に至ってGUIのIDEは分割コンパイルをユーザがたとえ何も分からなくても自動的に行っている。 これもまた時代の流れの中でのソフトウェアの進歩の一つなのかもとしばし感慨にふける。
すごいなファイル全部くっ付けてコンパイルか…
誤爆スマソ
どれが誤爆かわからんくらい流れにのってるな
811 :
デフォルトの名無しさん :2007/01/30(火) 18:35:40
>>799 おっしゃる通りにやってみたつもりですが、たぶん違うので答えがめちゃめちゃです。
どうすればいいんでしょうか・・・。
char hoge[] = "あいう";
char fuga[255];
char hogefuga[255];
for (int i = 0, padding = 0; i < (int)strlen(hoge); i++)
{
char buf[255];
int len = sprintf(buf, "%02X", hoge[i]);
for (int j = 0; j < len; j++)
{
fuga[padding + j] = buf[j];
fuga[padding + j + 1] = '\0';
}
padding += len;
}
for (int i = 0; i < (int)strlen(fuga); i++)
{
char c[3];
c[0] = fuga[i * 2];
c[1] = fuga[i * 2 + 1];
c[2] = '\0';
long n = strtol(c, NULL, 16);
hogefuga[i] = n;
hogefuga[i + 1] = '\0';
}
812 :
811 :2007/01/30(火) 18:38:18
ちなみに
>>811 のコードでは、
char hoge[] = "abc";
と、元の文字列が1バイトのものであれば正しく復元できます。
813 :
790 :2007/01/30(火) 18:39:28
度々解答ありがとうございました。 何となくですが疑問が晴れた気がします。 多分、毎回全ソースをコンパイルしたら (例えば stdio.c があったとすればそれ+それ以下のソース全て含めて) コンパイル時間が膨大になってしまうので 分割でコンパイルしたいと。 その為には extern 等が必要だが それを毎回コピペするのは行儀が悪いので そこを .h で補完するという認識で良いでしょうか? 開始アドレスでなく名前と引数さえ判ればリンクまで出来るのに バイナリだけでは呼べないってのも変な気がしますが イメージが掴めた感じなので今回の質問はここまでに留めます。 2度もお手数をおかけしてすみませんでした。 ありがとうございました。
>>812 char hoge を unsigned char hoge にしてみ。
それに付随するエラーはキャストでおさえればいい
そもそも、途中経過のbufやfugaを表示させてみればわかると思うぞ 符号拡張してるのが
816 :
812 :2007/01/30(火) 21:01:37
>>814-815 ありがとうございます、無事に目的を達成できました。
unsigned char を char にキャストするのが何故大丈夫なのかが
いまいち納得いかないのですが、色々デバッガで追ってみようと思います。
817 :
デフォルトの名無しさん :2007/01/31(水) 16:22:01
以下の二行の日時の差を求めるにはどうすればよいのでしょうか? time.hを使うのだろうという所まではわかったのですが、実際の使い方がわかりません・・・。 Sun Sep 03 11:56:11 1988 Sun Sep 16 01:03:52 2007
1970年からの秒を使っていいなら、どちらも秒に直して差をとり 出た秒数を日数と時分秒にするとか
質問失礼します。 Visual C++ 2005 で、コンソールアプリケーションを組むと、 「デバッグ無しで開始」の場合は 「続行するには何かキーを押してください...」 と出て、そこでプログラムが止まります。 が、Debugファイルの中にあるexeを直接実行してみると、 停止せずすぐに消えてしまいます。 これはどうしてなんでしょうか? また停止せず表示したままにするにはどうすればいいでしょうか?
オレは、最後に画面見たいときはデバッグの時はmain()の最後に ブレークポイント入れてっけどな
>819 すぐ消えないようにIDEが仕込んでるから。 コンソールアプリは元々は コマンドプロンプトやバッチファイルから起動するものだしな。 一つは、同じフォルダにバッチファイルを作り、そこから起動する方法。 例えば「hello.exe」を起動するバッチファイルならテキストエディタで hello.exe pause と書いたものを拡張子「.bat」で保存。 後はバッチファイルを開けば hello.exe を実行した後に一旦止まるハズ。 後は >820 や、最後に標準入力を待つように書くとか、方法は色々。
>>820-821 どうもありがとうございます。
消えるのが普通なんですね。
ありがとうございます。ちょっと両方とも試してみます。
823 :
デフォルトの名無しさん :2007/01/31(水) 18:28:01
char moji[] = "12345678"; というchar型の配列があるとき、 最初のn文字を取り出すには strncpy(char *, const char *, n) でできますが、 最初の5文字目から7文字目(上記例だと 567)を取り出すにはどうすればいいんでしょうか? やはり地味にポインタ進めて取得する方法ですか?
ああ、直接実行したいのか。 MSのTweakUI 入れて、command window hire を使えるようにして EXEのあるディレクトリで右クリックでそれ実行して コマンドプロンプトから直接キーボード入力でファイル名叩くっててもあるぞ コマンドプロンプトでcdコマンドで深い階層まで到達してもいいけどな
>>823 それも strncpy() でできるけどな。
引数のsrcのポインタに4足して、nを3にすればいい。
>>824 ありがとうございます。ちょっと調べてみます。
827 :
デフォルトの名無しさん :2007/01/31(水) 18:37:31
>>825 すてき!ポインタってかっこいい!!
ありがとう!!
検索ができる二分探索木を作っています。ファイルを取り込んで二分探索木を作ることには成功したのですが、検索をかけてもうまくヒットしてくれないので、検索をする関数searchにおかしい部分があるのではないかと考えています。(コンパイルエラーはありません) 検索の部分を抜き出すと struct tnode { struct tnode *left; char name[40]; struct tnode *right; }; struct tnode *root; struct tnode *search(struct tnode *,char *); { char dat[40]; char *c; puts( "検索するデータを入力してください" ); scanf( "%s", dat ); if( search(root, dat ) == NULL ) { puts( "指定されたデータは存在しません" ); } else { puts( "指定されたデータを発見しました" ); } }
829 :
828 :2007/01/31(水) 19:12:57
struct tnode* search(struct tnode* p,char *c) { while( p != NULL ) { if(strcmp(c,p->name)==0 ) { return p; } if(strcmp(c,p->name)<0 ) { p = p->left; } else { p = p->right; } } return NULL; } このような感じです。この中におかしい部分はありますか??
830 :
828 :2007/01/31(水) 19:16:15
削りすぎたかもしれません;
>>828 の
struct tnode *root;
struct tnode *search(struct tnode *,char *);
の次がmain関数です。int main()が抜けました。
>828 それだと一回しか検索してない。 再帰でp->leftかp->rightを引数に渡したいんじゃないの?
すまん、勘違いした。
不等号の向きはあってるの?
834 :
828 :2007/01/31(水) 19:49:47
順番が逆ですいません。二分探索木作成は下記のように再帰を使って行っています。つながりが悪いんでしょうか・・? int main() { FILE *fp; int i; char dat[40]; char *c; root=talloc(); fp = fopen("list.txt","r"); if(fp == NULL) {printf("cannot open file\n"); exit(0);} c = fgets(dat,40,fp); while ((c != NULL)) { c = fgets(dat,40,fp); root=gentree(root,dat); } struct tnode *gentree(struct tnode *p,char *c) { if (p==NULL) { p = talloc(); strcpy(p->name,c); p->left=p->right=NULL; } else if(strcmp(c,p->name)<0) p->left=gentree(p->left,c); else p->right=gentree(p->right,c); return p; }
835 :
828 :2007/01/31(水) 19:52:05
>>833 不等号の向きはあっていると思います。
試しに逆にしてみてもうまくいきませんでした
リストの中身がどうなのかわからないけど、改行文字も保存したりしてない? あと、最初の40文字分は飛ばしちゃっていいの?
837 :
828 :2007/01/31(水) 23:26:20
>>836 リストの中身は
tanaka_tarou 26
isida_junichi 1
kurima_tasumi 17
こんな感じのランダムな文字列が数十行ほどならべてあるものです。
確かに一行とんでいました!
while ((c != NULL)) {
root=gentree(root,dat);
c = fgets(dat,40,fp);
}
こうすべきでしたね。ご指摘ありがとうございます。
fgetsで読み込むと改行文字も含んだ文字列になるから、scanfで入力した文字列とは一致しないよ。
>>827 strncpy()はナル文字を詰めてくれないからsprintf()の方がいいぞ。
5文字目から7文字目ならこんな感じだ。
sprintf(extractedString, "%.*s", (7 - 5) + 1, moji + (5 - 1));
C言語を学びたいのですが、 コマンドプロンプトの環境の作り方を教えていただけないでしょうか? また、コンパイラはフリーで提供されているんでしょうか?
getsの存在理由を教えてください
過去との互換性。
>>840 環境の作り方っつーと、どういう事が言いたいか判らんが
コマンドプロンプトでプログラミングする時知っておくべき事は
・コマンドの実行の仕方
・カレントディレクトリと cd コマンド
・PATH(パス)の通し方
この辺が解ると迷いが少ないだろう。
フリーC言語コンパイラ、は数多く存在する。
ググれば色々出てくると思うがパッと思い付くのは
・Borland C++ Compiler / Turbo C++
・Microsoft Visual Studio Express
・mingw / cygwin + gcc
こんなところか。
BCC は少し古いのが難点だが、勉強用なら充分。容量も動作も軽い。
最近ボーランドは Turbo の名前で色々出してるからこれも良いかもな。
MSの環境は当然WindowsやMS由来の技術との相性が良い。
DirectX とか扱いたいならMSの環境が無難。
mingwやcygwinは Linux用ソフトの移植の為によく使われる環境。
LinuxやUNIX を扱うならコレだろうな。
環境変数を忘れるな
845 :
デフォルトの名無しさん :2007/02/01(木) 17:04:19
for(;;){} これってどういう意味ですか?
849 :
845 :2007/02/01(木) 17:26:24
みなさん、ありがとうございます><
きっと、、、無限ループ
#include<stdio.h> #define SIZE 10 void reversePrint(int [], int); main() { int i, a[SIZE]; for(i = 0; i <= SIZE - 1; i++) a[i] = i * 3; printf("配列の値は : \n"); reversePrint(a, SIZE); printf("\n"); return 0; } void reversePrint(int b[], int size) { if(size > 0){ reversePrint(&b[1], size - 1); printf("%d ", b[0]); } } 配列要素の逆向きプリントなのですが、reversePrint関数の再帰部分の働きがよく理解できません。 どなたかご教示ください。特に&b[1]が???です。
↓3つをASCII文字値順にソートすると、 AElig, Ascute, Acirc ↓ で間違いないですか? AElig Acirc Ascute プログラミング作法でツリーの説明のページで、 AElig Ascute Acirc となっていたので疑問に思いました。
Windows.hって、初心者でも作れますか?
>>855 どっかからダウンロードできるんじゃないの?
初心者には無理
いえ、学校で使いたいのですが学校にはネット環境が無くて… 自分のPCでダウンロードして、それを学校側に移せばいいんですかね? 学校のPC、フロッピーしか入れられないけど。
まずは学校側とお前の環境書け
環境というと?
開発環境
今のWindows.hはそれ自身で完結せず多数のファイルをインクルードしている。 しかも実行可能ファイルを作るには各種インポートライブラリも必要。 結局フロッピーディスク1枚に収まる量にならない。 おとなしくPlatform SDKのISO版をダウンロードしてCD-Rか何かにISO焼きして持っていけ。 CDドライブもないようなPCだったら諦めろ。
開発環境ですか… 自分のPCには何もありません。 学校のもよく分からないけどウルトラ.cって言うの使ってます。
よく分かっていないものにフィーリングで何かしようとしても悪化させるだけだ
わかりました。どうも有難うございました。
>>840 です。
>>843 さん、回答ありがとうございます。
えっと、ボーランド社からダウンロードしてインストールしたんですけど、
あとは、
・コマンドの実行の仕方
・カレントディレクトリと cd コマンド
・PATH(パス)の通し方
に注意して、コマンドプロンプトで入力したらいいんでしょうか??
メモ帳に書いて貼ったんですが、最初のHello World!が表示できません・・・。
870 :
デフォルトの名無しさん :2007/02/01(木) 23:56:56
ライブラリー関数qsort()と、自分で作った関数isort()を共に実行した結果、 qsort()の方が明らかに早く整列されるんです。 この差は何が原因なんでしょうか?
何回比較して何回入れ替えたかの差
ライブラリ側はqsortって言っても、数が少なくなったらソート方式を切り替えたり、 分割点の選択方式が優れているんじゃないの。
qsort()はクイックソートとは限らないね。
ここ一ヶ月で住人入れ替わったな
そりゃ1ヶ月もあれば初心者卒業するだろ不通
それはない プログラムだけやってりゃわからんが・・・
そりゃ中一にでもなれば童貞卒業するだろう普通
それはない オナヌーだけやってりゃわからんが・・・
879 :
デフォルトの名無しさん :2007/02/02(金) 14:19:04
すいませんfor文の二重ループで 1 12 123 1234 12345 123456 1234567 12345678 123456789 と表示されるにはどうしたらいいですか #include <stdio.h> void main( void ) { int i,j こっからお願いします
; for(i = 1;i <= 9;i++){ for(j = 1;j <= i;j++){ printf("%d", j); } printf("\n"); }
881 :
879 :2007/02/02(金) 14:35:25
プラグインを作れるようになりたいと思ったんですが、C言語とVC++Expressで作れますか? もし可能ならば解説してるサイトのようなものも教えてもらえれば嬉しいです
何のプラグイン?
スリムタイプで初めてでも安心をプラグインだろ
886 :
デフォルトの名無しさん :2007/02/05(月) 03:37:39
とりあえず、 ハーバート・シルトの、独習Cって本から始めて見る。 ・・・・・・・・・・・・ ・・・・・・・・・・・・ メモ帳で test.c を製作して、コマンドプロンプトを開いて、 ソースファイルを保存したディレクトリに移動して、次のコマンドを入力します。 cl test.c ・・・・・・・・・・・・ メモ帳の方に書けってことですよね? コマンドプロンプトの方に入力して見たら、 cl : fatal error C1083: ソース ファイルを開けません。 とか出てきたけど・・・。 なんだろ? この本判りにくいのか?
コマンドプロンプトの方だよ。 ソースのディレクトリに移動してないとか test.c.txtになってるとか。
888 :
デフォルトの名無しさん :2007/02/05(月) 04:34:44
「ソースファイルを保存したディレクトリに移動して・・・」 って説明だけじゃあ、どうも判りにくいんですけど・・・、 それはどうすればいいんでしょう? やっぱ、以外にカンタンな事なんですかね?
>>888 まず、おまいはコマンドプロンプトの扱い方を勉強したほうがいい
>やっぱ、以外にカンタンな事なんですかね? とりあえず今日はもう寝ろ
つーか、それC言語の話じゃないだろ。 と足蹴にするのもなんなので、windows限定でひとつ。 スタートメニューのアクセサリの中のコマンドプロンプトをソースファイルを保存したフォルダにコピーする。 コピーしたやつを右クリックしてプロパティを選択して開くと作業フォルダの項目に %HOMEDRIVE%%HOMEPATH% と書いてある(ハズ)。これを %CURRENTDIR% に書き変える。「OK」をクリックして閉じる。 それをダブルクリックするとコマンドプロンプトのカレントディレクトリが ソースファイルのフォルダに最初からなっているので移動する手間が省けて便利。
892 :
デフォルトの名無しさん :2007/02/05(月) 17:06:38
アルファベットと日本語が混在した文字列から、特定の日本語1文字の位置を みつけて出力するにはどうすれば良いのでしょうか? 以下では、3が出力して欲しいのですが、実行すると0が出力されます、 日本語は2バイトかと思いmemcmpの1を2にしても同じ0が出力されました。 助けて下さい・・。 char *str="abcのdefgです。"; char *word="の"; for (i=0; i < strlen(str); i++) { if(memcmp(str+i, word, 1)) { break; } } printf("%d\n", i);
>>886 統合開発環境もってるんでしょ
そっち使ったらいいじゃん
memcmpの戻り値を調べてみ
>>894 ありがとうございます全然気が付かなかった
if(0 == memcmp(str+i, word, 1)) {
にしたら3が出力されました!
forとmemcmpを使った泥臭いやり方以外にないですよね・・?
ちゃんと、日本語の文字のバイト数を指定しないと、他の文字でも引っかかるぞ。 strstrは?
>>896 memcmpの第三パラメーターは2ですね!
strstrは「の」のポインタが帰ってくるんでだめでした
>>897 「の」のポインタ - strのポインタ = 君の求める答えではないのかね?
>>898 ポインタの引き算の結果を%dで出力したら3になりました
ポインタ同士の演算は思いつきませんでした
目から鱗です
900 :
デフォルトの名無しさん :2007/02/06(火) 00:01:36
やりたい事は、関数aで変数raに1を設定、関数bで構造体bのcntに1を設定です。 試行錯誤の結果、以下のソースで期待通りの結果が得られたのですが、疑問があります。 なぜ、関数bの引数の型がchar *rbではなくchar **rbになるのでしょうか? 「C言語では関数は値渡しのため、呼び出した関数内で値を変えるためには、アドレスを渡す」 との事なのですが、それならばchar *rbでも正しいと思えます。よろしくお願いします。 #include <stdio.h> #include <memory.h> struct b { int cnt; }; main() { int ra; struct b *rb; ra = 0; rb = (struct b *)malloc(sizeof(rb)); memset(rb, '\0', sizeof(rb)); a(&ra); printf("ra=%d\n", ra); b(&rb); printf("rb->cnt=%d\n", rb->cnt); } a(int *ra) { *ra = 1; } b(char **rb) { ((struct b *)*rb)->cnt = 1; }
b(rb)で呼ぶならchar*rbでも動くような気もする。 なんぜまた一旦char*で受けるのかは解らんが。
902 :
デフォルトの名無しさん :2007/02/06(火) 00:23:44
>>900 それコンパイル通るの?
一応書き直したけど、質問以前に、まだ勉強不足すぎる。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int cnt;
}B;
void a(int *ra);
void b(B *rb);
int main(){
int ra;
B *rb;
ra = 0;
rb = (B *)malloc(sizeof(B));
memset(rb, '\0', sizeof(rb));
a(&ra);
printf("ra=%d\n", ra);
b(rb);
printf("rb->cnt=%d\n", rb->cnt);
return 0;
}
void a(int *ra){
*ra = 1;
}
void b(B *rb) {
rb->cnt = 1;
}
903 :
900 :2007/02/06(火) 00:31:09
ポインタって難しいからねえ。これが理解できずにCを挫折する香具師も多い。 一度、アセンブラとかマシン語の世界に逝ってくると理解しやすいと思う。
というか、その世界ではそれしかないだろ
すいません、お聞きしたいのですが、 コンパイル・リンクで問題なく通っていても、 DOS窓で実行中に特定部分にくると強制終了されてしまいます。 こういうのは、やはりその特定部分のソースがよくないのでしょうか? それと、強制終了は結構よくあることなのでしょうか? コンパイラはBCC++です。
>>906 コンパイルできてもバグがないわけではない
>>902 12行目で警告が出ています、できたa.outを実行すると一見期待通りの結果が出力されました・・。
>>902 で示されたソースについてなのですが、関数bの呼び出し側の引数が&rbではなくrbの理由は、
「rbがB型の構造体へのポインタのため、呼ばれた関数bの中でrbの値を変えることができるから」
の考え方をすればよいのですね。
これとは別に質問がまた出てきました・・次レスに書きます
やりたいことは、関数bの中でB型構造体の領域を1件確保して、
B型構造体のメンバーcntに1を設定、呼び出し側に返却し
呼び出し側で構造体のメンバーcntを出力する。です。
これも試行錯誤の末、以下のソースで期待通りの結果が得られたのですが、
やはり、
>>900 同様可笑しな間違いをしていますでしょうか・・?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int cnt;
}B;
void b(B **rb);
int main(){
B *rb;
b(&rb);
printf("rb->cnt=%d\n", rb->cnt);
return 0;
}
void b(B **rb) {
*rb = (B *)malloc(sizeof(B));
memset(*rb, '\0', sizeof(rb));
((B *)*rb)->cnt = 1;
}
(※
>>902 さんのソースを拝借して変更しました)
>>907 どうもです、色々考えながらバグ取りしてみようと思います。
911 :
デフォルトの名無しさん :2007/02/06(火) 17:59:06
doubleの変数aをfprintfで出力すると、 fprintf(foutfile,"%f\n",a); 小数6位までしか出力されないのですが、小数第10位、有効な桁まで 出力するにはどのように書けばいいのでしょうか?
912 :
デフォルトの名無しさん :2007/02/06(火) 18:26:58
%g
913 :
デフォルトの名無しさん :2007/02/06(火) 19:11:28
コードを5秒程みてみたけど ×totalscore = score[po][i]; ○totalscore += score[po][i]; ここ?
915 :
913 :2007/02/06(火) 21:00:54
変更してやってみたのですが、得点が27になってしまいました>< 正しくは5にならないといけないんですけど(このプログラムでは2になってしまいます)
J[10]=0 とかインデクスがなぜか1からとか意味がわかりません
今みてるけどなんで変数名の意味から考えないかんの
点数のルーチンだけ抜き出してみて。 単純ミスだと思うけどな。 5に成るはずの計算は、1点が5回?
3次元空間で 自機が高度変わらずにx軸移動のみ 敵は x:5 y:5 ポイントに高度1-5に積み重なってたら 最高ポイントは1になるはずじゃねーの?
>>910 コンパイル通るのに強制終了ってことは
アドレス関連で躓いてる可能性が
文字列、配列、メモリ確保、ポインタ等
0で割ってる可能性も高いな。
922 :
913 :2007/02/07(水) 15:55:19
皆さんありがとうです、そしてすみません
>>917 変数名付け足しながらやってたらめちゃくちゃになってしまいました、見苦しくてすみません><
>>919 2次元じゃなくて3次元でした(自機はx,y平面を自由に動く、敵機はz軸方向に降りてくる)
です
上の入力だと途中経過で3点までは普通に出て、3番目に入力された点から見たときに得点が4にならずに2点になっています
このあたりと思うんですが、私の知識ではどこを改善すれば直るのかいまだ見つけきりません
また気づいた点在ったらご教授お願いします
>>920 まさしくそれでした、ポッ抜けることが結構あります。
>>921 悲しいかな、これも経験済みです。
なので、今はポインタ関連徹底させるのと、更に打つのに慣れるために、
ポインタを色々含んでるのを考えながら黙々と打ち込んでます。
んーと、ソース見て間違いを探すのも重要だけど デバッガや変数の内容を実行時に表示して 何がおきてるのか調べるのも重要だよ。 今後、大規模なプログラミングで不可解なバグにあったときは ソース見るよりデバッグのやり方がものを言う、場合もある。
>>924 助言どうもです。
そういえば、変数の内容を逐一表示はさせてませんでした。
ずっとソースと格闘してたので、これは是非やってみようと思います。
実は統合開発環境?とデバッガを入れたのが昨日なので、
デバッグのやり方はまだ全然分かってません。
なので、こっちも並行して覚えていきたいと思います。
業務だと、大規模開発はモジュール単位に成るから、切り分けスキルと、モジュール単位のデバック能力が重要。 古典的なところではprintfデバック。 点数加算ルーチンの変数を適宜表示させてみたら?
927 :
マイコン :2007/02/08(木) 11:10:40
今はマイコンを使ってLEDを点灯させたりしてるのですが、 点灯と消灯を繰り返して明度を減少させるには、具体的にどうしたらいいですか? デューティー比10% とか書いてました。
928 :
デフォルトの名無しさん :2007/02/08(木) 14:13:14
プロトタイプって書いたほうがいいんでしょうか?
929 :
デフォルトの名無しさん :2007/02/08(木) 15:20:07
>>929 今一人なんで書かないことにします
複数でやるときって、どこに書けばいいんでしょうか??
プロトタイプ用のファイル作って、各ソースの頭でインクルードする感じ??
実際に業務でやってるやり方とか知りたいです
↓こう、下位の関数をファイルの前に書いとけば、プロトタイプなしで、 プロトタイプと同じ効果が得られる。 func2() { } func1() { func2(); } main() { func1(); } (最近Cで書いてないから忘れたけど、プロトタイプ無しだと、警告でない?)
>>931 ありがとう
プロトタイプ書いてないけど警告でないです・・
1関数1ファイルにしてるからかなあ
よくわからないけど、
prototype.hに
int a(int, int);
int b(char *, char *);
って書いて各関数で#include "prototype.h"
ってやるのがいいのかなー
a.c のプロトタイプは a.h にいれて、 b.c のプロトタイプは b.h にいれりゃいいだろ
int sample[2][5]のような二次元配列があって for分で列数の5回回したい場合、forのxxxの部分にどうかくのがスマートですか? sizeofもstrlenも試したけどうまくいきません for (i = 0; i < xxx; i++)
要素数を変数に持っておくと確実。
>>935 即レスthx
sample_max = 5
for (i = 0; i < sample_max; i++)って感じですね
sizeof(sample[0])/sizeof(int) これでいけないの?
>>937 どうもです
今日は帰っちゃったんで明日試してみますね
939 :
デフォルトの名無しさん :2007/02/08(木) 22:55:40
え?
初歩的な質問で恐縮なんですけど int型の一次元配列を関数に参照渡しをしたいのですが上手くいきません どうすればいいかご教授お願いいたします
>>941 こんな感じですか?
sub(int *ary);
main(){
int ary[10]={0,1,2,3,4,5,6,7,8,9};
sub(ary);
}
sub(int ary[]); でもいいけどな
っていうか参照渡し以外にどうやって関数に配列を渡すんだろ。
グローバルな宣言をされた配列
値呼び出し
>>940 てか普通に関数プロトタイプの中のパラメータリストにint型の配列を入れておけばいいんじゃね?
void sub(int []);
main(){
int ary[10]={0,1,2,3,4,5,6,7,8,9};
sub(ary);
}
>945 それは関数に渡すとは言わないんじゃ? >946 どうやって?
構造体でくるむとかw
手渡し
うお、ちょっと来ない間について行けなくなってた
>>952 の場合、配列要素を渡すと言った方がいいのか
>952 添え字付いてても参照渡しでしょ?
つか元々Cって、配列の実体はポインタだったような (語弊がある?
>>942-943 のどちらの方法でも渡されてるものは同じだから問題なく動くんじゃ
いい加減スレ違ってきそうだが
>>952 sub(array[0], array[1], array[2], ...);
main内部とかでこうやって呼び出すってこと?
不可能ではないが、一体なんの意味があるのかと。
特定の要素を渡すのなら問題無いと思うけど
いや
>>946 は
>>944 へのレスだから
あくまで可能性を言ったまでで
そこまでマジレスされても困る
>>955 配列全体か配列要素を渡すかケースバイケースだけど意味はあるはず
例えば
・値呼び出しで配列要素を渡した場合、呼び出された関数が元の配列の値を変更できない
・大きな配列全体を頻繁に渡すと実行速度に差がでる
とか
>>958 いや、だからCでは配列を(そのまま)値渡しする手段がないんだってばさ。
以下のwork構造体をaかつbで昇順にqsortする場合、qsortの比較関数は どう書けばいいのでしょうか? struct work { char a[5]; char b[5]; } aだけで昇順ソートなら↓とわかるのですが・・ int cmp (const void *p1, const void *p2) { contst struct work *s1 = p1; contst struct work *s2 = p2; return strcmp(s1->a, s2->a); }
>>960 >aかつbで昇順
ここを詳しく。
例えばaを主キーに、bを副キーにするならこうなる。
int foo = strcmp(s1->a, s2->a);
if (foo < 0 || foo > 0) return foo;
return strcmp(s1->b, s2->b);
>>961 そういうことです!なるほどわかりました
qsort二回呼ぶ必要無かったんですね・・
>>962 逆に、qsort()は非安定なソートで実装されている可能性が高いから二度呼んじゃいけません。
#安定なソートなら副キーでソートしてから主キーでソートすればできるけど。
>>959 構造体なら値渡しできるということでは駄目か。
965 :
デフォルトの名無しさん :2007/02/09(金) 18:56:01
初めまして。最近C言語を勉強し始めた者です。 早速質問なのですが、Visual C++ 6.0で #define max 30; struct _test { int a; int b; int c; }test[max]; とやると 構文エラー : ']' が ';' の前に必要です。 構文エラー : ';' が ']' の前に必要です。 と出てしまいます。 こう言う[]の使い方は出来ないのですか?
#define max 30; ~~~~ すなわち struct _test test[30;];
>>966 ありがとうございました。解決しました。
#defineは;はいらないんですね…。
#define max 30; < 最後の ;(セミコロン)要らないんじゃね?
>>965 #define max 30;
セミコロン要らない
最近もぐらたたきのプログラムに触れてすごいと思ったんですが、少し疑問が。 ソース見て、ん?となり、これってコンピュータは処理が高速だから、 リアルタイムに動いているように見えているだけなんでしょうか? だとすると普通のCで同時に処理する事はできないんでしょうか?
同時に処理する必要性が感じられない。
>>971 どんなコードか判らないが…
「高速に動いている」ことと
「同時に動いている」ことは
直接の関連性は無い。
そのコードが出力(描画含む)結果の反映を
即時(or自動)でやってるならば「高速で処理しているから同時に見える」。
逆に、反映を一度にするよう制御しているなら
「コード上は、本当に同時に動いている」。
>>971 リアルタイムは同時である必要はないし
処理には時間がかかるはずなので完全な同時ということはありえない。
遅れた情報を捨てて最新の情報を常に表示するのがリアルタイム。
操作すると瞬時にモグラを叩いている画像に変わるということか?
昔に比べると画像の作成して表示する処理はとてもなく速くなったね。
十数年前のパソコンだと作成に少し待たされ
しかも描画している様子まで見えたが
今はパソコンで動画を見ることが余裕に出来るくらいの性能になった。
そのもぐらたたきはループ回して入力チェックと描画を交互にやってるんではないかとエスパー 同時に処理とはマルチスレッドのことを言ってるんではないかとエスパー
>976 そのサイトは参考にしてはいけません。 もしブックマークしてるなら速やかに削除してください。
速やかに登録しました
ネットの検索で上位に来るというだけで、いんちき占い師を一途に信じ続ける信者のごとく初心者が惑わされていく。 これまでも、そしてこれからも。 それは誰にも止められない。 願わくば犠牲者の魂の安らかならんことを。
気持ち悪い底の浅い言い回しだなあ・・・
大丈夫なんじゃないっすかね。
アライメントというのがよく理解出来てなく、ネットで検索してみたのですが class TestA { char c; int i; double d; }; class TestB { int i; double d; char c; }; というクラスは並びかたが違うだけだが、オブジェクトのサイズが異なる。(アライメントが8以上の場合。) テスト(実行)する環境がないからサイズがどう違うのかも判りません。 テストAとBのサイズ(バイト数)はどうなっているのでしょうか?
Aが16バイト Bが24バイト
>>985 成る程。変数宣言の時に今までのバイト数(char2つ、int1つ)に組み合わせられない(doubleやint)場合、
以前のサイズは余白を使って8バイトとするといったイメージで宜しいのでしょうか?
Aは
char,int 1+4+余白3バイト
double 8バイト 合計16バイト
Bは
char 1+余白7バイト
double 8バイト
int 4+余白4バイト 合計24バイト
即レス有難う御座いました。
アーキテクチャによっては、例えばdoubleの値は8バイト境界に存在しないといけない。つまり、こういうこと。 ┌───────────────┐ │ double値 │8の倍数のアドレス ├───────────────┤ │ double値 │上記+8 └───────────────┘ こういうアーキテクチャで8バイト境界を無視してアクセスすると異常終了に繋がる。そうでなくてもパフォーマンスが落ちる。例えばこういうこと。 ┌───────┬───────┐ │ 空き │doubleの前半分 │8の倍数のアドレス ├───────┼───────┤ │doubleの後半分 │ 空き │上記+8 └───────┴───────┘ これを踏まえて構造体を考える。TestAは詰めればこうなるかもしれない。 ┌─┬───────┬─────┐ │ c │ i │ d(一部) │8の倍数のアドレス ├─┴───────┼─────┘ │ d(残り) │ 上記+8 └─────────┘ しかし、先程示した通りdouble値は8バイト境界にないといけないとしたら(恐らくはint値も4バイト境界にないといけないだろうから)こうなるだろう。 ┌─┬─────┬───────┐ │ c │ 隙間 │ i │8の倍数のアドレス ├─┴─────┼───────┤ │ d │上記+8 └───────────────┘ 同じように、TestBもこうなると考えられる。 ┌───────┬───────┐ │ i │ 隙間 │8の倍数のアドレス ├───────┴───────┤ │ d │上記+8 ├─┬─────────────┤ │ c │ 空き │上記+8 └─┴─────────────┘
たいていのコンパイラはオプションでパディングを制御できる
>>989 抽象論で批判するなんて随分と矮小な知性をお持ちのようで。
次スレは?
似たようなスレ多いし、要らないんでない?
パディング
膿め
産め
梅
埋め
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。