くだすれC言語(初心者用)
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/07/22(土) 13:27:04他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
C使いが優しくコメントを返しますが、
お礼はC言語の布教と初心者の救済をお願いします。
00021
2006/07/22(土) 13:28:090003(; д;)つロ○あらあらうふふ ◆1xsES22i66
2006/07/22(土) 13:45:550004デフォルトの名無しさん
2006/07/22(土) 14:09:55#include "stdio"
#include "cstdio"
の違いを教えてください
0005デフォルトの名無しさん
2006/07/22(土) 14:46:20namespace でぐぐってみれば?
0006デフォルトの名無しさん
2006/07/22(土) 14:47:39あと<>な
0007デフォルトの名無しさん
2006/07/22(土) 14:49:30と
#include <stdio.h>
の違いを教えてください。
0008デフォルトの名無しさん
2006/07/22(土) 14:50:43floorの存在意義を教えてください
0009デフォルトの名無しさん
2006/07/22(土) 14:51:41まずは名乗ろうな
0010デフォルトの名無しさん
2006/07/22(土) 14:52:220011デフォルトの名無しさん
2006/07/22(土) 15:05:340012デフォルトの名無しさん
2006/07/22(土) 16:56:08>あと<>な
ぷぷぷー
0013デフォルトの名無しさん
2006/07/22(土) 18:44:34自分でstdio.hというヘッダーを作ったとき、
"stdio.h"だとその自分のヘッダーが読み込まれる。
<stdio.h>だと標準のヘッダーが読み込まれる。
0014デフォルトの名無しさん
2006/07/22(土) 18:57:51int型へのキャストでは、小数点部分を単純に捨てるだけ。
floorは、引数の値を超えない最大の整数を返すと定義されており、
負の数のとき、たとえばfloor(-2.5)は-3.0を返す。(int)-2.5では-2になる。
また、結果の値がintで表現できないほど大きかったり小さかったりすることを
想定しなければならない場合ということもある。
0015デフォルトの名無しさん
2006/07/24(月) 01:39:190016デフォルトの名無しさん
2006/07/24(月) 01:53:220017デフォルトの名無しさん
2006/07/24(月) 06:00:28int(x+0.5)
で良いのでしょうか?
0018デフォルトの名無しさん
2006/07/24(月) 07:46:500019デフォルトの名無しさん
2006/07/24(月) 09:24:37正のときだけを考えるのであればそれでよい。
0020デフォルトの名無しさん
2006/07/25(火) 15:47:06(int)(x+0.5)
0021デフォルトの名無しさん
2006/07/25(火) 15:54:00C++なら>>17でもOKだけど。
0022デフォルトの名無しさん
2006/07/25(火) 17:17:08結局17の書き方は使われないと。
0023デフォルトの名無しさん
2006/07/25(火) 18:45:08関数スタイルのキャストは普通に使うだろ。
しかも組み込み型への関数スタイルのキャストは
static_castと同等だと保障されている。
0024デフォルトの名無しさん
2006/07/25(火) 18:51:17組み込み方へのキャストこそstatic_castなどを使えばすむから関数スタイルのキャストは要らない。
むしろコンストラクタ呼び出しになるのでクラスに対して使う方がよっぽど多い。
あと、組み込み型への関数スタイルキャストは、static_castと同等ではなく、Cスタイルキャストと同等。
static/const/reinterpret_cast全てを兼ねる。
0025デフォルトの名無しさん
2006/07/25(火) 18:52:51ここはC言語スレだということを忘れないでくれよ
0026デフォルトの名無しさん
2006/07/25(火) 19:42:49もちつけ。前半は組み込み型について言及したつもりはないぞ。
後半に関しては規格を詳細に読むかTC++PLを読んでくれ。
0027C言語超初心者
2006/07/26(水) 17:19:35のa,b,cを任意に入力したときのxの解を求めるプログラムを作りたいんです。
誰か教えてくれませんか?
ちなみに虚数解iが出る場合にも分けなきゃいけません。
0028デフォルトの名無しさん
2006/07/26(水) 17:36:240029デフォルトの名無しさん
2006/07/26(水) 18:23:36ニュートン砲(重力場を瞬間的に反転させることで膨大なエネルギー量を以て物体を放出する兵器)
0030デフォルトの名無しさん
2006/07/27(木) 00:28:19ニュートン峰(南米最高峰アコンカグアのポーランド氷河ルート第3キャンプとして人気が高い)
0031デフォルトの名無しさん
2006/07/27(木) 22:43:46積み上げなさい。次に、それらすべてを読み出し、それらをを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;
これがよく分かりません><教えてください・・
0032デフォルトの名無しさん
2006/07/27(木) 22:48:280033デフォルトの名無しさん
2006/07/27(木) 23:22:38>>31 は自分で理解したいんじゃないか?
0034デフォルトの名無しさん
2006/07/27(木) 23:40:00#define orz() printf("%d\n",pop())
push(1);push(2);push(3);push(4);push(5);orz();orz();orz();orz();orz();
0035デフォルトの名無しさん
2006/07/27(木) 23:41:400036ど素人
2006/07/28(金) 02:10:042.通常プログラムカウンタはプログラムの実行にしたがって一定の大きさだけ増えていく.
しかし,時に,プログラムカウンタに直前の値とは大きく異なる値がセットされる
時がある.それはどんな時か?
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);
0037デフォルトの名無しさん
2006/07/28(金) 02:13:090038デフォルトの名無しさん
2006/07/28(金) 08:48:590039単位の書けない奴を煮込む俺 ◆1xdL.Dyf.I
2006/07/28(金) 09:25:140040デフォルトの名無しさん
2006/08/20(日) 16:15:27これはどういう役目をしているかわかりません。
誰か教えて下さい。
0041デフォルトの名無しさん
2006/08/20(日) 16:21:320042デフォルトの名無しさん
2006/08/20(日) 17:41:51#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[]={"あ","い","う","え","お","か",
"が","き","ぎ","く","ぐ","け",
"げ","こ","ご","さ","ざ","し",
"じ","す","ず"};
0043デフォルトの名無しさん
2006/08/20(日) 17:42:54{
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");
}
}
0044デフォルトの名無しさん
2006/08/20(日) 17:55:40{
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");
}
}
0045デフォルトの名無しさん
2006/08/22(火) 23:09:23現在以下の内容をC言語で書こうとしています。
∬(x-α)i乗(y-β)j乗f(x,y)dxdy=Mijと記述されます。
ここでα,βは位置の正規化において決まります。
そしてこの値を用い、
大きさの正規化基準:M40+M04=1,傾きの正規化基準:M22=1
と設定するのが標準的な手法であります。
最後にこれについては重心周りのモーメントが必要です。
0046デフォルトの名無しさん
2006/08/23(水) 02:52:59に変換している。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: }
004741
2006/08/23(水) 03:48:22memset() は意味があったのか、残念。
083,084 を
dat64[c_no][dat_no][y][x*8+i]=(dat8&(128>>i))>0;
に変えると memset() はいらないぞ。そして質問には答えない。
0048デフォルトの名無しさん
2006/08/23(水) 22:55:19お願いします。
0049デフォルトの名無しさん
2006/08/23(水) 23:14:38あるファイルを読み込んだデータのビット操作をして文字画像に変換している。
かなり無駄っぽい処理だ。
0050デフォルトの名無しさん
2006/08/23(水) 23:25:33誤解を招くような書き方をしてしまいすみません。
0051デフォルトの名無しさん
2006/08/23(水) 23:30:560052デフォルトの名無しさん
2006/08/24(木) 00:08:110053デフォルトの名無しさん
2006/08/24(木) 02:23:52あと、字下げを適当に使うな。
0054デフォルトの名無しさん
2006/08/28(月) 15:27:23TCHAR MojiData[40][200][32] のような配列を作ると思うんですが、
種別毎の文字データの個数がバラバラで、
最高が198個なのに、殆んどは10個や20個程度という場合、
配列で確保したメモリ領域の殆んどは無駄になってしまうと思います。
領域の無駄は無くして、配列みたいに種別ごとの処理をfor文とかで一括処理したい場合、
どんな方法が一般的なんでしょうか。教えてください。
0055デフォルトの名無しさん
2006/08/28(月) 16:49:03こんな感じでどうでしょ。
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);
}
}
実際には、ファイルか何かから読み込むのかな?
0056デフォルトの名無しさん
2006/08/28(月) 21:40:14偶数部分には○、奇数部分には□を表示する
例えば5と入力した場合、012345→「○□○□○□」と表示。
この程度の問題すら分からない超初心者なんだぜ?
while文を使うとか言われたけど独学じゃさっぱりだぜ
0057デフォルトの名無しさん
2006/08/28(月) 22:07:390058デフォルトの名無しさん
2006/08/28(月) 22:13:04それに宿題スレに出すには次元が低すぎる問題だからガチで困る。
0059物好きな人
2006/08/28(月) 23:30:22臆することはない。宿題スレには、簡単な問題を解きたがる人もいる。
解く人だって初心者に近い人いるからね。次からはテンプレ書いて投げるべし。
以下、解答例(別に模範解答じゃない。ていうか私なら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;
}
0060デフォルトの名無しさん
2006/08/28(月) 23:54:48int main()
{
int ic, num = 0;
scanf("%d", & num);
for (ic = 0; ic < num; ic += 2) {
printf("○□");
}
if (ic == num) {
printf("○");
}
return 0;
}
0061デフォルトの名無しさん
2006/08/29(火) 12:16:18こんなときのためのポポポインタなんですね。
ありがとうございました。
0062デフォルトの名無しさん
2006/08/29(火) 12:41:15何その楽しげな「ポポポインタ」って。
0063デフォルトの名無しさん
2006/08/29(火) 14:10:10Borland C++ Compilerというコンパイラを導入したのですが、
初期設定に悪戦苦闘を強いられて1時間もかかってしまいました。
僕にはプログラミングの才能は無いのでしょうか・・・?
来年からSEとして働くというのに先が思いやられます・・・
0064デフォルトの名無しさん
2006/08/29(火) 14:27:05あと・・・CとC++の違いはなんですか??
00651001
2006/08/29(火) 14:34:06そんなんだと、これから先の人生が思いやられるよねー
でも、良かったじゃないか就職できて。
0066デフォルトの名無しさん
2006/08/29(火) 14:47:370067デフォルトの名無しさん
2006/08/29(火) 15:48:17親プロセスがwaitせずに子プロセスより先に死んだ場合、
子プロセスの親はinitになるのは判ったんですが、
子プロセスの返り値はwaitを待つために親プロセスが死亡するまで
メモリ上に残っているのでしょうか?
そうすると、親がinitになった場合の子プロセスの返り値などはメモリを食い続けるんですか?
その場合、子プロセスの死亡後のメモリ食いを回避する方法はありますか?
0068デフォルトの名無しさん
2006/08/29(火) 15:48:480069デフォルトの名無しさん
2006/08/29(火) 16:06:240070デフォルトの名無しさん
2006/08/29(火) 16:45:380071デフォルトの名無しさん
2006/08/29(火) 17:20:07言語の範疇を超えているので、鼬害ですね。
0072デフォルトの名無しさん
2006/08/29(火) 17:54:51「孤児プロセス」という単語でいろいろ調べるんだ
0073デフォルトの名無しさん
2006/08/29(火) 23:19:28柴田望洋か結城浩のC入門本
中級
前橋和弥「C言語 ポインタ完全制覇」
少しプログラミングができるようになったら
平林 雅英:新ANSI C言語辞典
さらにアルゴリズムやデータ構造が気になりだしたら
紀平拓男・春日信弥:プログラミングの宝箱 アルゴリズムとデータ構造
0074デフォルトの名無しさん
2006/08/30(水) 00:06:25やっぱり厳しいですよね・・・
Java言語は完璧なんですけどね。
>>66
SEはけっこう文系の人が多いんですよね。
接客が中心だからかもしれないですけどね。
0075デフォルトの名無しさん
2006/08/30(水) 00:39:15>Java言語は完璧なんですけどね。
0076万年プ中年
2006/08/30(水) 00:47:10まったくの初心者ならSEの倉薫さんの本(全2巻)をおすすめします。
柴田さんや結城さんの本はそれからのステップアップでいいとおもいます。
0077デフォルトの名無しさん
2006/08/30(水) 01:35:01>Java言語は完璧なんですけどね。
ダウト。
Javaは本当にやり込むと、
多数のOpenSourceのプロダクトやその関連など、
多岐にわたる知識と、それぞれの環境構築、
そしてそれぞれを活用するコーディング能力と、
実際に要求されるスキルはかなり高度なモノになる。
これだけ情報が多いBCCの初期設定に四苦八苦しているようなレベルで
「完璧」とは笑わせてくれる。
0078デフォルトの名無しさん
2006/08/30(水) 01:58:14そっちに行くのもナニだな・・・
おれはJVMの実装とかの話に行くと思ってたんだが
0079デフォルトの名無しさん
2006/08/30(水) 02:15:310080デフォルトの名無しさん
2006/08/30(水) 06:35:150081デフォルトの名無しさん
2006/08/30(水) 07:05:10色んなこと知れば知るほど「完璧」なんて言えなくなるのにな。
0082デフォルトの名無しさん
2006/08/30(水) 08:24:07あるかないのかを聞いているだけだ。
まあ、才能なんか皆無だろうし、現時点でJavaを完璧にこなせると
思いこんでいるような奴は努力しないだろうから今後にも期待できないな。
世のため人のために転職しろ。
0083デフォルトの名無しさん
2006/08/30(水) 10:43:480084デフォルトの名無しさん
2006/08/30(水) 10:57:49008563
2006/08/30(水) 11:17:52大学で1年間Javaの勉強はしたんですけど、
教科書に載っている基礎的なプログラムしか組んでません。
JavaかCのどちらかを選択する時に友達が、
「今の時代の流れはJavaだぜ!」と言うのでJavaにしました。
先生も「今の企業はJavaを使っているところが多いから、
後々役に立つよ!CはJavaが出来るようになれば楽にマスター出来るさ!」
って言ってました。
0086デフォルトの名無しさん
2006/08/30(水) 13:17:460087デフォルトの名無しさん
2006/08/30(水) 13:18:40これもおまえだろ
0088デフォルトの名無しさん
2006/08/30(水) 13:48:24どこの企業も学歴重視ですからね。
>>87
違いますよ!
0089デフォルトの名無しさん
2006/08/30(水) 13:57:04じゃあ、Java 完璧だから C も楽にマスターできたんだね。
0090デフォルトの名無しさん
2006/08/30(水) 14:06:23周囲の期待を裏切った罪でいびられて一生を終えるぞ
初期設定に戸惑ったり釣り宣言したりせずにとっとと勉強しろ
0091デフォルトの名無しさん
2006/08/30(水) 21:53:24未だにcppに実装を書いて、hに定義だけ書くっつースタイルに慣れない。
定義と実装を同じ所に置いておかないと、
interfaceが変わったときとかめんどくさくね?
ファイル数が増えると、管理対象も増えるってことで、結構面倒だし…
別に誰にソース見せるわけでもないから、
全部hに書いて組んじゃってるけど、
これって熟練者からすると、噴飯ものだろうなぁ。
0092デフォルトの名無しさん
2006/08/30(水) 23:45:32歴史的な理由が大きいからしょうがないだろう。
>全部hに書いて組んじゃってるけど
処理系によっては全部インライン展開されちゃうぞ
0093デフォルトの名無しさん
2006/08/30(水) 23:54:21ファイルが増えると、コンパイル時間が馬鹿にならなくなってくる。
個人レベルの規模でも、一瞬でコンパイルが終わるケースなのに数十秒かかったりとか。
0094デフォルトの名無しさん
2006/09/12(火) 23:15:39ばーか
0095デフォルトの名無しさん
2006/09/13(水) 23:35:032週間近く経ってから何を意味のないことを……
0096デフォルトの名無しさん
2006/09/14(木) 15:00:5310*10くらいなら行けそうな気もしますが・・・
0097デフォルトの名無しさん
2006/09/14(木) 15:35:21作れる香具師は作れるし、作れない香具師はいつまでたっても作れない
>10*10くらいなら行けそうな気もしますが
10*10と20*20で何が違うのか述べよw
10*10が稼働していれば、サイズの違いがどれほどコードに影響する?
0098デフォルトの名無しさん
2006/09/14(木) 15:45:3210*10個分並べるんだと思ってるのかもしれん。
「11*10にするには、右端の1列ぶんを全部書き直さなくちゃ!
きゃ〜〜〜たいへ〜ん」
0099デフォルトの名無しさん
2006/09/14(木) 23:05:49何とか自力でやってみます
0100デフォルトの名無しさん
2006/09/14(木) 23:20:150101デフォルトの名無しさん
2006/09/14(木) 23:53:590102デフォルトの名無しさん
2006/09/19(火) 20:27:010103デフォルトの名無しさん
2006/09/19(火) 22:52:58n進数をnで割りまくる方法ですぐ作れると思う。
0105デフォルトの名無しさん
2006/09/20(水) 00:34:230107デフォルトの名無しさん
2006/09/20(水) 23:58:180108デフォルトの名無しさん
2006/10/08(日) 11:46:190109デフォルトの名無しさん
2006/10/08(日) 14:07:520110デフォルトの名無しさん
2006/10/09(月) 12:53:14入門書にあるとおりエスケープ文字を入力するとコンパイルエラーではじかれてしまいます。
例としては
#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の初心者なので環境が悪いのかソースが悪いのかもわかりません。
解決方法がわかりましたらよろしくお願いします。
0111デフォルトの名無しさん
2006/10/09(月) 12:59:18~~
0112デフォルトの名無しさん
2006/10/09(月) 13:03:34しかし、エラーメッセージはprintfが参照できてないと読めるが。
0114デフォルトの名無しさん
2006/10/09(月) 13:08:51ソースのコピペすら出来ていないとすればエラーメッセージの正確なコピペを期待しちゃいかんだろ。
0115デフォルトの名無しさん
2006/10/12(木) 18:45:200116デフォルトの名無しさん
2006/10/12(木) 18:49:310117117
2006/10/12(木) 21:41:39staicを付けて宣言した関数ってのは return 後もメモリ上に配置されたまま
残り続けるんでしょうか?
他のファイルから見えないようにしたいんですが、メモリ上に残り続けるんなら
staticは付けずに、プライベートヘッダファイル内でextern付けて宣言して、
それをincludeするのにとどめておいたほうがいいんでしょうか?
よろしくお願いします。
0118デフォルトの名無しさん
2006/10/12(木) 21:55:070119デフォルトの名無しさん
2006/10/12(木) 21:57:010120デフォルトの名無しさん
2006/10/12(木) 23:08:42staticは付けずに以降のくだりは意味が良くわからないが、
おそらくグローバル変数を使うということだよな。
ならばそんな変数が存在する期間はstaticを付けた変数と同じ。
どちらもプログラム開始から終了まで存在し続ける静的記憶期間を持つ。
0121デフォルトの名無しさん
2006/10/12(木) 23:16:59> staicを付けて宣言した関数
欲嫁
0122デフォルトの名無しさん
2006/10/12(木) 23:34:470123117
2006/10/13(金) 00:33:03あ、そうなんですか。
気にせず使えってことですよね? たぶん。
ありがとうございます。
>>119
すみません。ちょっとよく分からないです。
>>120
すみません、はしょり過ぎて意味不明な書き方をしてしまって。
目的は、他のファイルに公開する関数と、そうでない関数とに区別を付けながら書くことです。
staticを付けた関数は、他のファイルからは見えないらしいので、これを利用しようと思いました。
でも、staticと聞くと、ついつい局所変数につけるstaticみたいに
静的領域に割り当てられて、プログラム実行中に常に値を保持するという連想をしてしまったので、
無闇に関数にstaticをつけるのもメモリの無駄遣いかなと思ったわけです。
(>>118さんによるとメモリとは関係ないらしいので杞憂ですが)
そこで、浅はかですが、他のファイルに公開しない関数のプロトタイプ宣言を、
ヘッダファイルに書いて、それをincludeするモジュールとincludeしないモジュールとで区別をつけて、
コンパイラの「暗黙の宣言エラー」を頼りに、手動で管理しようと思ったわけです。
これでは、実際には他のファイルからも呼び出せちゃいますけど、
気持ちとしては他のファイルに公開してるつもりかどうかを意識しながら書けると思ったもので・・。
長文ですみません。
0124デフォルトの名無しさん
2006/10/13(金) 00:38:090125デフォルトの名無しさん
2006/10/13(金) 00:45:00もしかしたら、インライン展開によって痕跡さえも消えてなくなっているかもしれない。
>>123
と言う話はさておき、一般に関数はプログラムがロードされている間はメモリ上に存在し続けるぞ。
つまり、staticをつけない方が寧ろメモリを消費すると言えるかもしれない。
従って、公開したくない関数にstaticをつけるのは、いろんな意味で正しい姿勢だ。
0126デフォルトの名無しさん
2006/10/13(金) 02:21:22☆☆
☆☆☆
☆☆☆☆
☆☆☆☆☆
↑
これを再帰ってやつを使って表示させたいんです。
お願いします。
0127117
2006/10/13(金) 02:27:17最終的にはライブラリみたいなのを作りたいんですが、
そのライブラリを作るために書いているソースファイルが複数(たとえばa.c, b.c, ...)あって、
ソース間の関数の呼び出し合いが入り乱れて混乱するのを避けるため、
a.cの中には、「a.cの中の関数だけに利用させたい関数」と「b.cが呼び出す関数」もあるという状態です。
この例では、上手く伝わらないかもしれませんが・・。
>>125
極端なことを言えば、コンパイラによっては、関数を呼び出してる部分を
ジャンプとリターンの形じゃなくて、インライン展開しまくりで実現するかもしれないから
サイズが大きくなる場合もあるってことで合ってるのかな?
とにかく
>と言う話はさておき、一般に関数はプログラムがロードされている間はメモリ上に存在し続けるぞ。
>つまり、staticをつけない方が寧ろメモリを消費すると言えるかもしれない。
>従って、公開したくない関数にstaticをつけるのは、いろんな意味で正しい姿勢だ。
とのことなので、公開したくない関数にはstaticを付けていこうと思います。
丁寧な回答ありがとうございました。
0128117
2006/10/13(金) 02:33:51というのは、ソースを書いているうちにどのファイルにどの関数があったかとか、ファイルの管理で自分が混乱するということです。
すれ汚ししてしまって、すみません。
0129デフォルトの名無しさん
2006/10/13(金) 03:14:32a.cとb.cを特に分ける必要も無いのに分けてるとか。
複数のファイルがお互いに参照しあってるという状況になってるとしたら、それは分けすぎかも。
あるいは、a.cとb.cが参照する関数は、mylib_util.cとかにまとめて、a.cとb.cはそれをincludeするとか。
0130デフォルトの名無しさん
2006/10/13(金) 05:32:59if (n>1) func(n-1);
for ...
0131デフォルトの名無しさん
2006/10/13(金) 16:57:10#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とか使わないで
再帰だけでやるやつをお願いします。
0132デフォルトの名無しさん
2006/10/14(土) 12:32:27宿題シネ
0133デフォルトの名無しさん
2006/10/15(日) 05:29:38という記述で、自分で構造体を定義しました。
このとき
void function (original *)
という関数を作って、main関数から呼び出したのですが
function( a ) ではうまくいかず function ( &a ) ではうまくいきました。
構造体の変数名はポインタを表すと思うんですが、この場合はなぜ&が必要なのでしょうか?
0134133
2006/10/15(日) 05:47:02typedef struct {....} original;
original a;
です。
0135デフォルトの名無しさん
2006/10/15(日) 06:02:29なぜそう思うのか、理由を100字以上30字未満で述べよ。
0136デフォルトの名無しさん
2006/10/15(日) 09:40:350137133
2006/10/15(日) 10:09:40あっー!そこがそもそも間違いだったんですねorz
>>136
はい、その通りです…
以前、構造体の配列を扱ったときは&がいらなかったので、
配列の場合と混同してました。
どうもありがとうございました。
0138デフォルトの名無しさん
2006/10/15(日) 16:23:120139デフォルトの名無しさん
2006/10/15(日) 18:35:38どこに、どのように書くのが普通でしょうか?
ヘッダにstaticで定義する?
どこかの.cファイルに定義して、ヘッダにextern宣言する?
0141デフォルトの名無しさん
2006/10/17(火) 11:46:59C言語はさっぱりなので、プログラムの意味がよくわからんです。
入力された数から、マイナス1して入力された数とビット演算すると言うことでしょうか?
bool powOFTwo(int num)
{
return !(num & (num-1));
}
教えて下さい。
0142デフォルトの名無しさん
2006/10/17(火) 12:49:17そんな感じ。
(入力した数) と (-1した数) とでANDをとって
全ビット0だったら関数の戻り値としてtrue(1)を返す
0143デフォルトの名無しさん
2006/10/17(火) 21:30:400145デフォルトの名無しさん
2006/10/17(火) 22:33:582進数で考えれば?
0146141
2006/10/18(水) 10:31:32お恥ずかしい。
0147デフォルトの名無しさん
2006/10/19(木) 13:59:350148デフォルトの名無しさん
2006/10/19(木) 15:05:350149デフォルトの名無しさん
2006/10/20(金) 09:38:050150デフォルトの名無しさん
2006/10/20(金) 12:16:27それのどこがCなのかと……
0151デフォルトの名無しさん
2006/10/20(金) 12:47:060152デフォルトの名無しさん
2006/10/20(金) 13:14:490153デフォルトの名無しさん
2006/10/20(金) 15:32:28まぁ、gettimeofday()が使える環境は多いが。
0154デフォルトの名無しさん
2006/10/20(金) 22:19:12signal(SIGFPE, sighandle);
を使って、その場所を調べようとしているのですが、signalが発生しません。
ためしに、
double a=1/0;
とか入れると、その場所でsignalが発生するのですが。
計算がうまくいっていない場所を調べるにはどうすればよいのでしょうか。
システムはDebian Linux, コンパイラはgcc4.1です。
0155デフォルトの名無しさん
2006/10/21(土) 02:10:19FPUが例外を出さない設定になっているとか、たまたまFPUを使わないで演算しているときに発生しているとか。
0156デフォルトの名無しさん
2006/10/23(月) 22:21:05フォルダの自動検索・設定を実行しても未検索で終了になってしまいます。
これはインストール方法が悪かったのでしょうか?それともPC上にMeだからでしょうか?
できれば手動での設定の仕方か解決方法を教えてください
0157デフォルトの名無しさん
2006/10/23(月) 23:56:37http://www.enri.go.jp/~fks442/K_MUSEN/bcc.htm
まあ今はBorland C++以外にも、無料のコンパイラは色々あるけどな。
0158デフォルトの名無しさん
2006/10/24(火) 01:50:37Cもちょっくら勉強しようかと思います。
なんか目的がないとつまらないので、作るものを決めてそれに向かってがんばろうかと思ってんだけど
Cで作れそうなものが思い浮かばないんだよね。
WEBだったらこんなサービスあったらおもしろそう =>つくろう!ってなるんだけど。
Cだと何作っていいのかわからん。
おもしろそうなものあったら教えて。
0159デフォルトの名無しさん
2006/10/24(火) 02:45:520160デフォルトの名無しさん
2006/10/24(火) 05:50:32結局のところ自分がそれをはっきりと自覚していない限り
他人に自分のそれを求めるのは理不尽というものではないだろうか。
0161デフォルトの名無しさん
2006/10/24(火) 19:46:260162デフォルトの名無しさん
2006/10/28(土) 15:23:52char str1[]="hello";
char str2[]="begin";
char str3[]="wacth";
char (*ptr[])[6]={&str1,&str2,&str3};
のようにやる以外にやりようはないですか?
0163デフォルトの名無しさん
2006/10/29(日) 18:40:42fgets(hoge,10,stdin);
fgets(foo,10,stdin);
としたときに、最初のfgetsで半角で9文字以上入力したときに二番目のfgetsが飛ばされてしまう(というか最初の出オーバーした分を受け取って次へ行ってしまう)
のですが、どのように回避すればいいのでしょうか?
0164デフォルトの名無しさん
2006/10/29(日) 19:26:360165デフォルトの名無しさん
2006/10/29(日) 19:46:160166デフォルトの名無しさん
2006/10/29(日) 19:46:20他に何がやりたい?
0167162
2006/10/29(日) 20:39:12普通の配列と同じように事前に何かを用意しなくてもいきなり定義できないのかな、と
例えば
char str[][6]={"hello","begin","wacth"}
みたいにです
必要性無視した単なる可能不可能を知りたいだけの質問で申し訳ないんですが…
0168デフォルトの名無しさん
2006/10/29(日) 21:42:46>167のようにただの配列の配列(の配列……)なら普通に初期化できる。
>162のようにポインタが介在すると、そのポインタを初期化するために、別途初期化された変数が必要になる。
それだけのこと。
0169デフォルトの名無しさん
2006/10/29(日) 21:44:28while (fgetc(stdin) != '\n') ;
とすれば改行まで読み捨てられる。
#但し、入力が閉じられるなどの異常に対応していないので、必要なら対策すべし。
0170デフォルトの名無しさん
2006/10/29(日) 21:48:25char str[][6]={{"hello"},{"begin"},{"wacth"}};
データの境界を教えてあげるために、{} でくくるだけなんですよね。
0172デフォルトの名無しさん
2006/10/29(日) 22:07:20ありがとうございます
char hoge[10],foo[10];
fgets(hoge,10,stdin);
while (fgetc(stdin) != '\n') ;
fgets(foo,10,stdin);
そこで以上のようにしてやってみたのですが、最初のfgetsで9文字以下の入力をされたとき
while (fgetc(stdin) != '\n') ;
で一度エンターをおさないと二番目のfgetsに進まなくなったのですが、使い方間違ってるのでしょうか・・?
0173デフォルトの名無しさん
2006/10/29(日) 22:15:42読み捨てる必要がないときには読み捨てるな。
0174デフォルトの名無しさん
2006/10/29(日) 22:32:55strlenあたりで判定するんでしょうか
やってみます、ありがとうございました
0175デフォルトの名無しさん
2006/10/30(月) 07:11:03最後に改行があれば読み捨てる必要がないのだろう。
0176デフォルトの名無しさん
2006/11/01(水) 20:19:520177デフォルトの名無しさん
2006/11/02(木) 01:30:350178デフォルトの名無しさん
2006/11/02(木) 17:22:450179デフォルトの名無しさん
2006/11/07(火) 02:50:230180デフォルトの名無しさん
2006/11/07(火) 03:28:15ついでに、C言語ってぐぐればどっかでてくるんじゃね?
0181デフォルトの名無しさん
2006/11/07(火) 04:08:290182デフォルトの名無しさん
2006/11/07(火) 05:20:530183デフォルトの名無しさん
2006/11/16(木) 09:03:29他のシステムに以下のような関数があり
void foo(const void *prm);
実際にはprmには構造体のポインタを渡しています。
constなのでこのポインタが指す先の構造他はfooでは変更できないという認識なのですが、関数を呼び出し終わって構造体を見てみるとメンバが書き換わっている場合があります。
fooのソースがないので、その関数内で書き換えているのかいないのか定かではなく、問い合わせをしようと思っているのですが、constがあるのに中身を書き換えていませんか??と問い合わせるのは抵抗があります。
constの付いた引数がポインタだった場合、ポインタの指す先が書き換えられないんですよね?
0184デフォルトの名無しさん
2006/11/16(木) 11:27:380185デフォルトの名無しさん
2006/11/16(木) 16:43:34関数内部で書き換えるのに、引数にconstをつける理由ってなに?
0186デフォルトの名無しさん
2006/11/16(木) 17:51:45ライブラリ設計時点では内部を書き換える予定はなかったが、
実装段階で書き換える必要が出た場合。
0187デフォルトの名無しさん
2006/11/16(木) 20:02:220188わからないので教えてください
2006/11/16(木) 21:51:31ぜひ、よろしくお願いします・・・
問題
配列su(要素数:12)に任意の数値をランダムに初期値設定し、逐次決定法によって
整列(昇順)させ、結果を表示させるプログラムを作成してください。
0189デフォルトの名無しさん
2006/11/16(木) 22:09:490190189を
2006/11/16(木) 22:14:260191デフォルトの名無しさん
2006/11/19(日) 00:49:46アドバイスか罵声、誰かたのむ
0192デフォルトの名無しさん
2006/11/19(日) 01:00:350193デフォルトの名無しさん
2006/11/19(日) 01:22:390194デフォルトの名無しさん
2006/11/19(日) 05:19:14同じとこやってたから書いてみた
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とシフト演算子使ってどうにかならないのかな
0195デフォルトの名無しさん
2006/11/19(日) 11:34:32%xで十六進法で入力させれば除算・剰余算をシフト・ビット積にできる。
0196デフォルトの名無しさん
2006/11/19(日) 11:54:370197デフォルトの名無しさん
2006/11/19(日) 18:12:30for(i=0,dec=0; bin; i++) {
if(bin%10) dec += pow(2, i);
bin /= 10;
}
やりたいことはこういうこと?
0198194
2006/11/19(日) 19:11:51調べたところpowはこの場合(2のi乗)を返すということなので、おそらくそういうことです。
ただ本の進行度として、for文と関数powを使用していません。
197さんのソースを参考にして、作り直してみたところ、実行することができました
while (bin)
{
if (bin % 10)
{
dec += i;
}
i *= 2;
bin /= 10;
}
ありがとうございます。
0199191
2006/11/19(日) 23:09:29自分も同じように任意の桁の二進整数を入力した時の
変数宣言後の反復構造の扱いに苦慮していました
参考にさせて頂きます
0200デフォルトの名無しさん
2006/11/20(月) 21:05:57data[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次元配列で表したいんですがどうすればよいですか?
0201デフォルトの名無しさん
2006/11/20(月) 21:42:25Ex.
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;}
0202デフォルトの名無しさん
2006/11/20(月) 23:35:19>>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;
}
0203デフォルトの名無しさん
2006/11/20(月) 23:38:19構造体そのもの、メンバにはconstがついて変更できないが、
構造体のメンバが指すもの(hoge->s[2])についてはconstにならない。
0204デフォルトの名無しさん
2006/11/21(火) 01:41:13それらのペアを配列を使って読んで、
それぞれの四則演算を別のファイルに書き出しなさい。
5.0 3.0
2.5 1.0
4.0 1.5
って課題が授業で出てサッパリわかんなくて困ってるんですが、
どなたか助けていただけないでしょうか?
0205デフォルトの名無しさん
2006/11/21(火) 10:22:230〜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まで扱えるのでしょうか?
ヘタレですいませんが、どなたかお願いします。
0206デフォルトの名無しさん
2006/11/21(火) 10:51:35変数がそこまで扱えていても、出力で制限しちゃダメだべ。
long intは%ld、unsigned long intは%luで出力すべし。
0207デフォルトの名無しさん
2006/11/21(火) 11:04:47あぁ、ナルホド!
出力時のtypeが悪かったんですね。。。
ありがとうございます〜。
0208デフォルトの名無しさん
2006/11/21(火) 14:07:19#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のまま変わりません
どなたかアドバイスお願いします
0209デフォルトの名無しさん
2006/11/21(火) 14:23:02nを算出するループの外側で、printf("%.20g, %d\n", e, n);として見給え。
要は、nがある程度大きくなるとfloatの精度では数値が変わらなくなるし、更に大きくなるとそれ自体がオーバーフローする。
#そもそもその近似式はあっているのか?
0210デフォルトの名無しさん
2006/11/21(火) 14:42:37・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;
}
0211デフォルトの名無しさん
2006/11/21(火) 15:41:23ありがとうございます
>>209のようにプリントした結果、n導出後にnの初期化を忘れていたようです
くどいプログラムとなりましたが、>>210と併せて参考にさせていただきます
0212デフォルトの名無しさん
2006/11/22(水) 15:45:140213212
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;
}
0214デフォルトの名無しさん
2006/11/22(水) 19:01:25そりゃ無理だ。だが、環境とやりたいことによっては似たようなことはできる。
0215212
2006/11/22(水) 19:22:11どのようなものでしょう?ただ興味があるだけで活用法はパッと思いつかないんですが、できれば教えていただきたいです
標準入力の入力バッファとかストリームと呼ばれるものはstdinが指す先にあるFILE構造体にあるんですよね
ファイルの状態としてはfopen("stdin","r")みたいに読み取り専用になってるでしょうか?
0216デフォルトの名無しさん
2006/11/24(金) 11:19:110217212
2006/11/24(金) 12:27:59すみません、OSはWindowsXP、コンパイラはVC++Toolkit2003を使っています。
キーボードからの入力以外に、直接文字配列を標準入力に入力することは出来るのか
出来るとしたらどのように実現しているのかが、さわりだけでも興味があったので
環境依存で自分の環境ではできなくても特に不満はないです
0218デフォルトの名無しさん
2006/11/24(金) 13:34:31勿論これはfooが事前に決定できる文字列の話なので、
自前で文字列を用意して自分自身の標準入力で受けるのならパイプでも使わないと無理だが。
0219212
2006/11/24(金) 16:29:31パイプってまさしくそういうことだったんですね、ありがとうございます
パイプがやってる処理を自前でソースの中に組み込むことは出来るんでしょうか?
0220デフォルトの名無しさん
2006/11/24(金) 16:52:47今話題の用途には使いにくいが、お手軽にはpopen()も。
0221デフォルトの名無しさん
2006/11/24(金) 16:57:04vc++で動かしたいのですがlinuxでやってたリンク編集とかが分からなくて、
できればVCでの手順などを教えていただけませんか?
0222212
2006/11/24(金) 17:20:55おお、こんな関数があったんですね、ありがとうございます
ぐぐったところには出力の方はあっても入力の方がなかったのでおぼろですが
fprintf(stdin,"hogehoge");みたいなことをしたいのならこんな感じでしょうか?
int filedes[2];
char buf[256];
pipe(filedes);
close(STDIN_FILENO);
dup2( fd[0] , STDIN_FILENO );
write( fd[0] , "hogehoge" , 256 );
0223212
2006/11/24(金) 17:30:23char buf[256];は省いて、writeの第3引数は9にして下さい
0224デフォルトの名無しさん
2006/11/25(土) 01:01:25大体あってる、でも、ひとつ間違いがあって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);
}
0225212
2006/11/25(土) 16:44:17レス遅れてすみません、理解するのに時間掛かってました
dup2( fd[0] , STDIN_FILENO );でキーボードからの入力を無効にして
write( fd[1] , "hogehoge" , 9 );で本来なら画面に出力されるところをパイプが受け止めて
read( fd[0] , buf , 9 );でキーボードからの入力を受け取るところ、すでにパイプに
保持されている文字列を受け取っている、という理解でいいでしょうか?
そうなると、パイプがバッファリングに使う領域=標準入力がバッファリングされる領域=標準出力がデータを取ってくる領域
ということなんでしょうか?
0226デフォルトの名無しさん
2006/11/25(土) 21:04:050227デフォルトの名無しさん
2006/11/25(土) 21:33:010228デフォルトの名無しさん
2006/11/25(土) 21:59:160229デフォルトの名無しさん
2006/11/25(土) 22:09:42単にそうすれば0以外の値にどんなエラーだったのかそれぞれ意味を付加ことができるから?
0230デフォルトの名無しさん
2006/11/25(土) 22:10:240231デフォルトの名無しさん
2006/11/25(土) 22:35:41そのアプリケーションを呼び出すシェルでは逆に0が真で0以外が偽なんだと。
シェルスクリプトでバッチ処理とかする際に対応がきちんとしてるとバグの混入を防げる。
0232デフォルトの名無しさん
2006/11/25(土) 22:42:13あ、なるほど。トンクス
0233212
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は普通のファイルポインタとはちょっと違うみたいですね
無理なものは無理だとしてとりあえず先に進むことにします、付き合っていただいてありがとうございました
0234デフォルトの名無しさん
2006/11/29(水) 14:02:530236デフォルトの名無しさん
2006/11/29(水) 14:39:26なんとなく探す場所に導く(lead)って意味なのかなと…
0237デフォルトの名無しさん
2006/11/29(水) 17:47:31これ演習の答えがないと答えがあってるか不安になるなorz
チラ裏でスマソ
0238デフォルトの名無しさん
2006/11/29(水) 19:06:38location seek じゃないかなあ?
0240デフォルトの名無しさん
2006/11/29(水) 20:23:12read <-> fread
write <-> fwrite
close <-> fclose
なのにseekは
lseek <-> fseek
なんだよね。
昔システムコールにseekがあってlseekに拡張されてseekがobsoleteになったとかなのかね?
0241デフォルトの名無しさん
2006/11/30(木) 04:53:400242デフォルトの名無しさん
2006/11/30(木) 09:41:20オフセットの型がintなseekが最初にあってlongに拡張されたlseekに置き換わった?
そして今やオフセットの型はoff_tなんだよね。longに結び付けられてたりするけど。
でもシステムによってはintだったりすることもある。
0244デフォルトの名無しさん
2006/11/30(木) 21:28:290245デフォルトの名無しさん
2006/12/01(金) 10:29:33具体的には例を出すとあたり番号が「012345」というのがあったら入力が出来ないということです
ですので、文字列としてやって見ようと思うのですが6文字(1等は6桁のため)と言う風に定義が出来ない・・・
タスケテ・・・
0246デフォルトの名無しさん
2006/12/01(金) 10:36:430247デフォルトの名無しさん
2006/12/01(金) 11:00:390248デフォルトの名無しさん
2006/12/01(金) 11:14:39初めて作ったんですけどどうすか?
EXIT_**** 定数ってみなさんは使います?
0249デフォルトの名無しさん
2006/12/01(金) 14:48:16別に先頭が0でも数字として入力できないわけじゃないだろ?
当選番号の桁数は決まってるんだから、入力された数字から12345を引いて
1000000で割った余りが0なら当選ってすればいいじゃん。
http://hoge.2ch.net/test/read.cgi/hogehoge/9桁または10桁の数字/l50とかオマケ
の形で入力してもらって
http;//2ch.dumper.jp/9桁または10桁の数字/とか
http;//makimo.to/2ch/hoge_hogehoge/9桁または10桁の数字の先頭4桁/9桁または10桁の数字.html
のような形でファイルに出力するにはどうしたらいいでしょうか
0251デフォルトの名無しさん
2006/12/01(金) 20:05:040252デフォルトの名無しさん
2006/12/01(金) 20:08:58とりあえず、個別に入力してもらって
http;//2ch.dumper.jp/9桁または10桁の数字/を出すところまでやってみました
http://jbbs.livedoor.jp/bbs/read.cgi/computer/21256/1164941934/3
>>252
正規表現は(ご本人には否定されたけど)
Javascriptでhttp://www.geocities.jp/mirrorhenkan/でやられてるみたいなんですね
できたら他の方法でできないものでしょうか
…てこれは最初に書くべきでしたね。申し訳ない
0254デフォルトの名無しさん
2006/12/03(日) 00:38:56この関数に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);
}
0255デフォルトの名無しさん
2006/12/03(日) 00:43:10あと何年かすると8で当たり前じゃんこのじじぃがとかいう時代になるのかも
0256デフォルトの名無しさん
2006/12/03(日) 00:45:19おそらくsizeof (char*)ということになっているのだろう。
0257デフォルトの名無しさん
2006/12/03(日) 00:52:14strlenって関数で長さを知ることが出来る。
0258254
2006/12/03(日) 01:08:31内部的に配列になってないんじゃないかと心配したんですが、そういうことじゃなかったんですね。
一応自分で作ってみたのですが無限ループらしく落ちてしまいます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;
}
/*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;
}
ここに貼っておきました
http://jbbs.livedoor.jp/bbs/read.cgi/computer/21256/1164941934/28-30
0262デフォルトの名無しさん
2006/12/03(日) 20:11:20strtok()何ぞを使っている段階で読む気が失せた。
sscanf()で、%[^/]でも使えば?
0263デフォルトの名無しさん
2006/12/03(日) 20:57:04int 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エラーなので、誰か手本を下さい。
ポインタをよく分かってなさそうなので参考にもしたいです。
0264デフォルトの名無しさん
2006/12/03(日) 21:38:570265デフォルトの名無しさん
2006/12/03(日) 21:45:31つーか、ちゃんとaをポインタとして使っているジャン。
>264がヒントを書いているけれど、Cでは配列を配列のまま参照することはないからね。
0266デフォルトの名無しさん
2006/12/03(日) 21:50:06それぞれの文字が入っているアドレスを出力しなさい。
また、整数データの列を定義してそれぞれの整数が入っている
アドレスを出力しなさい 。
という問題を考えているんですが、C言語をまだ習い始めたばかりで、
どのように示せばいいのか悩んでいるので、
解答もしくはヒントを提示していただけないでしょうか?
よろしくお願いします。
0267デフォルトの名無しさん
2006/12/03(日) 22:00:17ありがとうございます。
分かってるのか分かってないのか・・
0268デフォルトの名無しさん
2006/12/03(日) 22:28:24配列の各要素にアクセスするにはどうしたら良いか?
変数のアドレスを取得するにはどうするか?
後は、>264とかも参考になる。
0269デフォルトの名無しさん
2006/12/03(日) 22:48:13コンパイラborlandをインスコしたのですが
メモ帳で作ったファイルの入れ方(コンパイル)がわかりません・・・
お願いします
0270デフォルトの名無しさん
2006/12/03(日) 23:58:44http://pc8.2ch.net/test/read.cgi/tech/1164079451/l50
0271デフォルトの名無しさん
2006/12/04(月) 00:05:29例えば曜日を入力したらその中の同じ曜日の物だけを表示するプログラムを作りたいです。
なんかアドバイス貰えませんか?
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);
}
こんな関数を利用するんですが。
0272デフォルトの名無しさん
2006/12/04(月) 00:21:27分からない所はどこ?
0273デフォルトの名無しさん
2006/12/04(月) 00:57:56bcc32 ファイル名.c
で出来ない?
0274デフォルトの名無しさん
2006/12/04(月) 01:00:53このC言語ファイルをコンパイルして、実行した後に、
"search"と入れて学籍番号(1〜10)を入力すると「セグメンテーション違反です」と出てしまいます。
どこが悪いのか全くわからないので、教えていただけないでしょうか?
0275デフォルトの名無しさん
2006/12/04(月) 02:11:09sの初期化を
0276デフォルトの名無しさん
2006/12/04(月) 02:22:44ありがとう
ちょっとやってみてから
また質問します( ^ω^)
0277デフォルトの名無しさん
2006/12/04(月) 02:32:28lesson {a1,a2...ai...an}
曜日を入力
for(i:1->n)
if(曜日=ai.day) printf_lesson
i++
0278デフォルトの名無しさん
2006/12/04(月) 03:12:11==
0279デフォルトの名無しさん
2006/12/04(月) 09:36:45ありがとうございます。
こんな簡単なことに気づけないなんて、情けないです。
もっと勉強します!
0280271
2006/12/04(月) 12:25:01その曜日の入力のやり方がいまいち分かりません。
scanf("%d",&ai.day);とかでいいんですか?
あとよかったらfor(i:1->n) の意味を説明してほしいです。
0281271
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の物を全部出すようにしたいです。
0282274
2006/12/04(月) 14:45:30>>274に追加で、"avarage"と入力することによって各教科の平均を表示したいのですが、
途中までやってみたもののよくわからなくなってしまいました。
ご教授のほどよろしくお願いいたします。
0283デフォルトの名無しさん
2006/12/04(月) 21:17:04構造体の配列を使えば良いジャマイカ
0284デフォルトの名無しさん
2006/12/04(月) 21:34:05とりあえず課題はelse ifとか使って無理やり結果は出るようにしたんですが
やっぱ題意と違うからこのまま出したら減点される。。
構造体の配列がいまいち分かりません。
本に書いてある通りだと配列全部同時に出力とかになるんですが
応用して選んだやつだけ、それも配列番号じゃなくて
中のデータの一部を汲み取って表示とかは分からないです。
0285デフォルトの名無しさん
2006/12/04(月) 22:44:36減点を気にするとはいやはや
0286デフォルトの名無しさん
2006/12/04(月) 22:50:50自分でやった方法だと配列が使われてない(><; のが問題だと思いまして
0287デフォルトの名無しさん
2006/12/04(月) 23:08:560288デフォルトの名無しさん
2006/12/04(月) 23:33:22>>280はちょっと違って、一旦別の変数xに入れてからxとa[i].dayの比較をする
for(i:1->n)は iを1〜nまで を適当に書いただけ
あとは>>287と同じ
0289デフォルトの名無しさん
2006/12/04(月) 23:51:33s=0 としてから ave_m = avarage_math(s); としているがどうなるか、sとは何か
sum=0 として sum += sum; としているがどういう意味の式か
0290デフォルトの名無し
2006/12/05(火) 12:53:281: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
0291デフォルトの名無しさん
2006/12/05(火) 12:58:39マイドキュメントにあるtest.cを
C:\borland\bcc55\Bin\bcc32.exeでコンパイルして別のフォルダに出力する方法ってありますか?
出来れば簡単に出来るといいのですが・・・
変なところあるかもしれませんがよろしくお願いしますm(__)m
0292デフォルトの名無しさん
2006/12/05(火) 13:39:31出力ファイル名を指定するオプションは、たぶんパス指定も受け付けると思う。
0293デフォルトの名無しさん
2006/12/05(火) 13:53:54-eFilePath
スペース空けたら駄目
0294デフォルトの名無しさん
2006/12/05(火) 18:58:15という本を買ってやり始めようと思ったんですが・・・
初めのパスやPATHの設定の仕方が書いてありません!
設定のやり方がkwsk載っているサイトありましたら
教えて下さいorz
0295デフォルトの名無しさん
2006/12/05(火) 19:07:17パスやPATHって何?
http://www.google.com/search?num=50&lr=lang_ja&q=PATH+%E8%A8%AD%E5%AE%9A
0296デフォルトの名無しさん
2006/12/05(火) 19:19:15ありがとうございます(*´∀`*)
なんとか設定できたみたいです。
"bcc32.cfg"を作れ、とかいてあり作ろうとしたらなぜかもう作ってありました・・・。
こういうのはなぜ作るのか教えて下さいorz気になる、、、
猿でもわかるようにorz
0297デフォルトの名無しさん
2006/12/05(火) 19:29:01まだC言語に触ったことないなら説明しても解からないと思うが
インクルードパスやライブラリパスを指定するためにbcc32.cfgを作る
0298デフォルトの名無しさん
2006/12/05(火) 19:39:47・・・
よくわかりませんが、ありがとうございます⊂二二二( ;^ω^)二⊃ブーン
0299デフォルトの名無しさん
2006/12/06(水) 21:22:220300デフォルトの名無しさん
2006/12/06(水) 21:36:06関数定義でvoidを書かない場合は上と同じ。
プロトタイプ宣言でそれを書かない場合、引数の指定が全くないことを意味する。
なお、C++では常に引数を取らないことを意味する。
0301デフォルトの名無しさん
2006/12/06(水) 21:53:34ど〜してもエディタが気に入りません。
どうしたらいいですか。
0302デフォルトの名無しさん
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で使用してます。
よろしくお願いします。
0303デフォルトの名無しさん
2006/12/06(水) 22:07:51それでも気に入らないなら、使わなければいい。
コンパイルはコマンドプロンプトからするも良し、
他のエディタでコマンドを呼び出すようにするも良し。
0304デフォルトの名無しさん
2006/12/06(水) 22:15:19bccだけ斜め上行くね
VC++,gccは問題なかった
なんでだろ
0305デフォルトの名無しさん
2006/12/06(水) 22:16:26また、C言語にも色々と種類があるようなのですが、どれから勉強していけばよいのでしょうか?
0306デフォルトの名無しさん
2006/12/06(水) 22:22:17#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;
}
これでちょっとやってみて。
0307デフォルトの名無しさん
2006/12/06(水) 22:23:500308デフォルトの名無しさん
2006/12/06(水) 22:30:22>>302じゃないけどgetchでは問題なかった
0309デフォルトの名無しさん
2006/12/06(水) 22:35:42独習CからC++やC#なりに行けばいいと思いますが、
もし、基礎的なことを理解しているのであれば、
http://www.amazon.co.jp/gp/product/489471115X/sr=8-1/qid=1165411940/ref=sr_1_1/503-3871966-3793501?ie=UTF8&s=books
がいいと思います。C言語をしらないことを前提に書かれています。
ただし、第2版でもnamespaceのことはおざなりな説明ですのであしからず。
C++がわかればいいというのであればこれで勉強するといいと思います。
0311デフォルトの名無しさん
2006/12/06(水) 22:40:14ありがとうございます。
>独習CからC++やC#なりに行けばいいと思いますが
とありますが、C言語自体は独学でも十分に習得できるものということでしょうか?
またプログラムのプの字も知らない状態なので、
フリーのコンパイラとともに「猫にもわかるプログラミング」というサイトで勉強しようと思っているのですが
なんとかなりますか?
0312302
2006/12/06(水) 22:41:01CRLFが原因だとすると解決方法は
あるのでしょうか?
0313デフォルトの名無しさん
2006/12/06(水) 22:44:41BCC Developer でビルドしたら普通に動いたよ。
素人だからわからんけど、引数じゃ無いかな?
0314デフォルトの名無しさん
2006/12/06(水) 22:51:55思い出した
DOS窓の行数が増えていくと表示がおかしくなる現象
新たにDOS窓開くと問題ないと思う
0315デフォルトの名無しさん
2006/12/06(水) 23:00:14ホントだ。
再現できた。
コンソール起動してすぐなら異常ないけど、
行数稼いでから実行すると異常を起こす。
0316デフォルトの名無しさん
2006/12/06(水) 23:00:18ありがとうございます
0317デフォルトの名無しさん
2006/12/06(水) 23:08:15bccのconioまわりがおかしいのかもね
カーソル位置を指定するgotoxyも同じように行数増えるとおかしくなるはず
0318デフォルトの名無しさん
2006/12/06(水) 23:52:030319デフォルトの名無しさん
2006/12/06(水) 23:55:40入力ミスが多くなりますよ (^^
0320デフォルトの名無しさん
2006/12/07(木) 01:09:49プログラムしたことないんですが?
0321デフォルトの名無しさん
2006/12/07(木) 09:25:01略
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)に変わってしまいました・・・。
0322デフォルトの名無しさん
2006/12/07(木) 09:43:27j = atoi(&(expr[i]));
何をしようとしているかぐらい話のネタとして書いてくれないとつまらない
0323デフォルトの名無しさん
2006/12/07(木) 10:06:15これがやりたい?そのコードで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);
}
}
0324デフォルトの名無しさん
2006/12/07(木) 10:19:45何故「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) こんなふうに要素数を溢れない様にしないと。
0325デフォルトの名無しさん
2006/12/07(木) 11:37:03ありがとうございます。逆ポーランド式の計算プログラムを作っています。
sizeofというのは演算子なんですね。初めて見ました。
「’\n’」が来た時にiに10より大きい数字を代入してループを抜けようと考えていたのですが、むちゃくちゃすぎるでしょうか?
今は期限がせまっているのであとでじっくり考えてみます!
0326デフォルトの名無しさん
2006/12/07(木) 11:53:20文字数ぶんループしたいなら↓の様にすればいいよ。
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)
0327デフォルトの名無しさん
2006/12/07(木) 12:09:23strlen()も初めて見ました。\0という表現(?)も。あとで調べてみます。
expr[i] != '\n' ← なるほど!と思いました。なぜ気づかなかったんだろう。
どうにかプログラムがうまく動くようになってよかったです。本当にありがとうございました(^^)
0328デフォルトの名無しさん
2006/12/07(木) 13:30:36それらはatoi()と違って、変換終了点が判るのだから。
0329デフォルトの名無しさん
2006/12/07(木) 23:45:220330デフォルトの名無しさん
2006/12/08(金) 02:09:47初心者というかアルゴリズムがわからなくって・・。
# cat aaa
1
2
3
これを
1 2 3
に並べ替えるってどうすりゃいいのか
0331デフォルトの名無しさん
2006/12/08(金) 04:31:51awkじゃ完全にスレ違いだ。ちゃんとawkスレはあった気がする。
並べ替えっていうより複数行をまとめるってことじゃないの?
そうなら、アルゴリズム以前の問題だ。
ヒント:BEGIN{ORS=" "}{print}
0332デフォルトの名無しさん
2006/12/08(金) 10:15:45ライブラリは探せば出てくるから、とくにこれといって優れたものというのはないと思う。
0333デフォルトの名無しさん
2006/12/08(金) 19:10:450334デフォルトの名無しさん
2006/12/08(金) 19:17:11ハメ撮りクイズをインディーズで出すってこと?
0335デフォルトの名無しさん
2006/12/09(土) 14:20:24fwrite() とかの、size と count ってのは何のために用意されてるんでしょう?
fwrite(hoge, 2, 4, fp);
0336デフォルトの名無しさん
2006/12/09(土) 14:21:13fwrite(hoge, 2, 4, fp);
fwrite(hoge, 1, 8, fp);
の違いが分かりません。
メモリ上のデータと書き込み先のデータでインディアンが違うときとか、そういう時のため?
0337デフォルトの名無しさん
2006/12/09(土) 14:32:21簡単なプログラムで作りたいのですが……
よろしくおねがいします
0338デフォルトの名無しさん
2006/12/09(土) 14:37:28printf(" 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");
0339デフォルトの名無しさん
2006/12/09(土) 14:39:53こちらからはこんな答えしか書きようがないってことだ。
0340デフォルトの名無しさん
2006/12/09(土) 14:44:05http://www.fireproject.jp/feature/c-language/basic-library/date-time.html
0341デフォルトの名無しさん
2006/12/09(土) 14:46:17#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;
}
0342デフォルトの名無しさん
2006/12/09(土) 15:05:17せめてネタでも改行くらいしようや。
>>336
戻り値の違いに注意。
0343デフォルトの名無しさん
2006/12/09(土) 15:14:16南米ではインディオだな。
0344デフォルトの名無しさん
2006/12/09(土) 15:16:56>読み書きに成功した要素の個数を返す。エラーが生じた場合や、end-of-file(ファイルの最後)に達した場合、
>返り値は指定した個数よりも小さい値(またはゼロ)となる。
とありました。
fwrite(buf, sizeof(int), 8);
とした場合に8より小さい値が返ってきたらエラーかどうかの区別がつかない気がするのですが、
エラーかどうかをどうやって判断したらよいのでしょうか?
0345デフォルトの名無しさん
2006/12/09(土) 15:17:120346デフォルトの名無しさん
2006/12/09(土) 15:43:11そこでferror()ですよ。
まぁ、大抵fwrite()で4*8程度ではバッファ内に収まってしまうから実際の書き出しは行なわれず、
エラーなんぞ起きやせんのだが。
#そしてfclose()で書き出しが行なわれてエラーになったりする罠。
いや、ferror()で調べればいいけどさ。
ない場合がありえるって話を読んだことがあるな。。。
fwrite()もそうなのか?
まあ、どちらにしてもferror()で調べるようにすればいい話だけど。
0349デフォルトの名無しさん
2006/12/09(土) 17:45:230351デフォルトの名無しさん
2006/12/09(土) 19:04:24自分の持ってるANSI Cの辞書にはfwrite()の項にこう書いてある。
返却値
�@書き込みに成功した値を返す.
�A書き込みエラーが発生したときのみ,nより小さくなる.
0352346
2006/12/09(土) 19:59:38エラーの種類の判断とミスリードした。確かに、少ない時点でエラーだね。
#それさえも起きない可能性が高いことは>346に書いた通り。
0353デフォルトの名無しさん
2006/12/09(土) 20:11:29まだ手をにぎったことしかないんですけど、
セックスのときってなにかとくべつな言葉をつかうものなのですか?
0354デフォルトの名無しさん
2006/12/09(土) 22:47:41for(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
という風に表示させたいのですが、どのようにしたら良いでしょうか?
0355デフォルトの名無しさん
2006/12/09(土) 23:09:41自分で答えかいてるようなものじゃん
for(i=0;i<12;i++)
{
printf("%d",a[i]);
}
0356デフォルトの名無しさん
2006/12/09(土) 23:10:11\nね
0357354
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;
}
0358デフォルトの名無しさん
2006/12/09(土) 23:36:07a[i]はdoubleだから%lfだな
0359354
2006/12/09(土) 23:37:19%dを%lfに変えるの忘れてました。
ありがとうございました!!
0361デフォルトの名無しさん
2006/12/09(土) 23:43:55確認するプログラム」を作りました。
(3次元のインベーダーみたいなのを想像してください)
これから拡張してどの経路をたどれば最高得点か、というところまで
行きたいのですがどのように作っていけばいいでしょうか?
0362デフォルトの名無しさん
2006/12/09(土) 23:49:44移動の仕組みはどうなっているのか、
撃てば必ず当たるの?
その際の得点は?
など説明が足りなさ過ぎる。
0363361
2006/12/09(土) 23:53:06そして、迎撃方法は時機が敵機に体当たりするという変なプログラムですw
だから迎撃可能範囲が円錐になる感じですね
当たり判定は今のところ点です.
0364361
2006/12/09(土) 23:59:15得点はどれもおなじ
です
0365デフォルトの名無しさん
2006/12/10(日) 00:00:15なんだかよくわからないが、得点が固定ならMST(最小木)を調べてみたらどうだろう
0367デフォルトの名無しさん
2006/12/10(日) 10:18:05サンプルかき集めたら何か出来そう
0368デフォルトの名無しさん
2006/12/10(日) 11:01:08手術費をどうするかでもめてる。orz
0369デフォルトの名無しさん
2006/12/10(日) 13:43:10結果がどうなるかは処理系によります
0370デフォルトの名無しさん
2006/12/11(月) 03:16:060371デフォルトの名無しさん
2006/12/11(月) 11:31:04オマエのレスはなんの参考にもならんな
0372372
2006/12/13(水) 16:34:32変数を引数して、変数名と値を出力する関数を作りたいです!
変数から、その変数名の文字列をとりだす方法ってありますか?
//ソース
void DebugOut(int value);
void main(){
int value = 100;
DebugOut(value);
}
//実行結果
value:100
って感じになる関数を作りたいんです!よろしくお願いします!
0373デフォルトの名無しさん
2006/12/13(水) 17:00:580374デフォルトの名無しさん
2006/12/13(水) 17:03:41#define DebugOut(variable) (fprintf(stderr, "%s : %d\n", #variable, (int)(variable)))
0375372
2006/12/13(水) 17:53:50それでできるんだろうけど、めんどくさかったんです!
<<374
すげー!できました。
お二方とも、ありがとうございました!
0376デフォルトの名無しさん
2006/12/13(水) 20:14:54画像を読み込んで、すべてのピクセルで、
getpixel(img,x,y,&r,&g,&b);
printf("座標(%d, %d)のRGB値は(%d, %d, %d)です.\n",x,y,r,g,b);
を繰り返したいのですが、
for文などの繰り返し文をどのように書けばいいのかわかりません。
よろしくお願いします。
0377デフォルトの名無しさん
2006/12/13(水) 20:26:49for
とか?
0378デフォルトの名無しさん
2006/12/13(水) 20:27:410379デフォルトの名無しさん
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);
}
}
と書いてみたのですが、エラーで実行できませんでした。
おかしいところを指摘していただけたら嬉しいです。
0380デフォルトの名無しさん
2006/12/13(水) 22:17:210381379
2006/12/13(水) 22:49:19#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;
}
0382379
2006/12/13(水) 22:55:27expected `;'before')'token
could not convert `cvShowImage(((const char*)"Image"),((const CvArr*)((void*)img)))' to `bool'
expected `)'before';'token
0383デフォルトの名無しさん
2006/12/13(水) 22:56:230384デフォルトの名無しさん
2006/12/14(木) 00:06:01取り敢えず、forの書式を直せ。
0385デフォルトの名無しさん
2006/12/14(木) 01:17:20for(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個
0386デフォルトの名無しさん
2006/12/14(木) 01:21:37>384
0387デフォルトの名無しさん
2006/12/14(木) 01:23:21もっと大きな問題があるだろ。
コピペしといて気づかないのか?
0388デフォルトの名無しさん
2006/12/14(木) 01:23:380389デフォルトの名無しさん
2006/12/14(木) 01:28:19ファイルをループさせるにはどうすれば良いのですか?
0390385
2006/12/14(木) 01:33:04みんな目ぇいいな。
0391歩歩
2006/12/14(木) 01:33:209〜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:}
よろしくお願いします。
0392デフォルトの名無しさん
2006/12/14(木) 01:41:11新規で作るなら連番でfor回せば良いけど。
0393デフォルトの名無しさん
2006/12/14(木) 01:44:231.ファイル名を連番で用意する
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);
}
0394デフォルトの名無しさん
2006/12/14(木) 01:46:49返答ありがとうございます。
ファイル名をtest1.txt test2.txt …… test20.txt としたら
for文でどう書いたらよいのですか?
0395歩歩
2006/12/14(木) 01:48:06すごい助かりました
0396デフォルトの名無しさん
2006/12/14(木) 01:52:30ファイルへの書き込みの仕方はわかる?
for(i=1;i<21;i++)の中で、ファイルへの書き込みを回すだけ。
書き込む式のファイル名の部分を、test[i]とすれば、中身が同じな連番ファイルの出来上がり。
0397デフォルトの名無しさん
2006/12/14(木) 01:52:31という問題がまったくわかりません。どなたか教えてください・・
0398デフォルトの名無しさん
2006/12/14(木) 01:58:45for(i=0; i<20; i++) {
sprintf(filename, "test%d.txt", i+1);
fp = fopen(filename,
0399デフォルトの名無しさん
2006/12/14(木) 01:59:101以上の整数nが素数であるかどうかは、
n%2,n%3,n%4,n%…とやっていって、
n%(n-1)まで繰り返して(本当はもっと少なくて良いんだけど)、
一度も余りが0にならなかったら(つまり一度も割り切れなければ)素数。
ここから考えていけば作れると思うよ。
0400デフォルトの名無しさん
2006/12/14(木) 01:59:29キーボードからの入力と画面への出力
http://www.media.osaka-cu.ac.jp/~k-abe/2001-JS-OSAKA-U/C.html
素数を求めるアルゴリズム
http://www.tsg.ne.jp/TT/tsg/c/mansaku/P01.html
さぁ作れ。
0401デフォルトの名無しさん
2006/12/14(木) 02:00:12返答ありがとうございます。まだできません。
私はファイルからデータを読み込んで処理をしたいのです。
for(i=1; i<=20; i++){
fp = fopen(test[i] , "r");
処理
fclose(fp);
}
これで良いのでしょうか?
0402399
2006/12/14(木) 02:00:271より大きい整数ね・・・
0403デフォルトの名無しさん
2006/12/14(木) 02:02:440404デフォルトの名無しさん
2006/12/14(木) 02:05:441行に12個表示するということは、12個表示したら改行するということ。
カウンタを用意して素数を表示するたびに+1して12になったら改行すればいい。
0405デフォルトの名無しさん
2006/12/14(木) 02:09:20あぁ、ごめん。
398さんの方法でお願い。
惑わせまくってる・・・ちょっと吊って来る。
0406歩歩
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);
}
ほんとお願いします。
0407デフォルトの名無しさん
2006/12/14(木) 02:14:02初期設定部をwhileの前に置く。
条件判定部をwhileの括弧内に入れる。
インクリメント部をwhileブロック内の最後に入れる。
0408デフォルトの名無しさん
2006/12/14(木) 09:27:19あえて関数を使うとすると、次のどちらのプログラムの方がよいのでしょうか?
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);
}
0409408
2006/12/14(木) 09:28:27#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);
}
0410デフォルトの名無しさん
2006/12/14(木) 18:10:20http://d.hatena.ne.jp/yaneurao/20061205
conitune以外で、forとwhileが等価でない箇所ってわかります?
0411デフォルトの名無しさん
2006/12/14(木) 18:42:270412デフォルトの名無しさん
2006/12/14(木) 20:31:22場合によっては広義にMFCを使ったり.NET Frameworkを使ったものも含まれることがある。
0413デフォルトの名無しさん
2006/12/14(木) 20:48:41どうもです
0414デフォルトの名無しさん
2006/12/14(木) 23:47:12それだけではどちらともいえない。
それはさておき、fopen()直後のfeof()は無意味だ。
0415デフォルトの名無しさん
2006/12/14(木) 23:47:54#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;
}
0416デフォルトの名無しさん
2006/12/16(土) 01:59:58そのaaaでもX=5だと認識させるにはどうすればいいのですか?
0417デフォルトの名無しさん
2006/12/16(土) 02:14:110418デフォルトの名無しさん
2006/12/16(土) 11:40:480419デフォルトの名無しさん
2006/12/16(土) 18:46:31keybd_eventのことについて全く知識がなく、検索かけてみたんですが、
あまり詳しく載っている所がありません。
加えて、文字を打ち込みたい箇所をアクティブにする操作も分からないので、
どなたか詳しく紹介されてあるページか、操作そのものを教えていただけると幸いです。。。。
0420デフォルトの名無しさん
2006/12/16(土) 19:01:140421デフォルトの名無しさん
2006/12/19(火) 15:15:01書いてみたんですがうまく動きません。アドバイス頂けますか?
/* 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");
0422421続き
2006/12/19(火) 15:15:55if( ( 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;
}
0423デフォルトの名無しさん
2006/12/19(火) 16:12:36元のswitch使った方がどういうものかは知らないが、
if,else ifに入るたびにgetcharしてるのは問題ないのか?
0425デフォルトの名無しさん
2006/12/20(水) 04:12:410426デフォルトの名無しさん
2006/12/23(土) 13:34:14今は
a=1/0;
のようにやっているんですが、スマートな記述法があったらご教授ください。
0427デフォルトの名無しさん
2006/12/23(土) 17:56:061/0ではNaNにならないだろ。
それにそのコードは警告を出すコンパイラが多いだろうし、
場合によっては実行時に0除算の段階で異常終了する。
1./0.でも無限大であってNaNにはならない。
「NaNを変数に直接代入」ってのがNaNのリテラルが欲しいっていう意味なら、
処理系によってはNANみたいに定義されていることもあるので、
使ってる処理系のmath.h辺りを探してみ。
最近の処理系ならあると思うが、無ければ例えばIEEE754形式のNaNの表現に従って、
仮数部を非0、指数部を255にしたビットパターンを作って自分で定義してやればいい。
0428デフォルトの名無しさん
2006/12/24(日) 19:27:13とりあえず色んなサイト見つつプログラム書いてみた。
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の書き方を勘違いしてるからなんだろうけど、誰かエロいひとおせーて。
0429デフォルトの名無しさん
2006/12/24(日) 19:53:52Hzがdoubleなのにscanf()で%dを指定しているから、まともに値を拾うことができていない。
その値がたまたま負となったために件のエラーが起きたのだろう。
従って、scanf()の指定を%lfにでもすればいい。
勿論、printf()も%g辺りにしておかなければいけないのは言うまでもない。
0430デフォルトの名無しさん
2006/12/24(日) 20:30:09ありがとう。ああ、%dとかにも種類があるんだね。
精進するよ。
0431デフォルトの名無しさん
2006/12/24(日) 21:52:55#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
0432デフォルトの名無しさん
2006/12/24(日) 21:56:54100 / 8192 == 0
でゼロ除算
100.0 / 8192.0にしる
0433デフォルトの名無しさん
2006/12/24(日) 22:05:36サンクス。
0434デフォルトの名無しさん
2006/12/25(月) 17:09:12最初は何となく、Cはコンソール、C++はそれにウィンドウ表示ができるものと思っていたんですが、それも違うようです。
あと、ウィンドウを表示するアプリケーション(API?)の作り方が詳しく解説されてるサイトってありませんか?
それとも素直にVC++に移行した方がいいんでしょうか…?
0435デフォルトの名無しさん
2006/12/25(月) 22:57:35違いはCで言う構造体のパワーアップしたクラスというものと
コンテナという便利な物やその他Cで書くとめんどくさいアルゴリズム等
を用意してくれてる。
でもCだろうとC++だろうと、精度の高いプログラムを作れるかどうかは
結局本人のスキル次第
0436デフォルトの名無しさん
2006/12/25(月) 23:18:400437デフォルトの名無しさん
2006/12/25(月) 23:24:03本買え。
0438デフォルトの名無しさん
2006/12/26(火) 04:10:23C を基にしつつ、オブジェクト指向言語として新しく作られたのが C++
C でもオブジェクト指向「っぽい」記述は出来るけれども、あくまで「っぽい」しか出来ない
435 が書いてる通り、C で Windows でウインドウを扱うプログラムは作れるし
C++ でコンソールアプリを作る事も出来る
WIN32API を使えば Windows でウインドウアプリを作る事は充分可能だが
ちょっと面倒だぞ
http://wisdom.sakura.ne.jp/system/winapi/win32/index.html
http://www.geocities.jp/ky_webid/win32c/index.html
この辺を通読して試せば、だいたいは分かるようになるが・・・
0439デフォルトの名無しさん
2006/12/26(火) 09:44:52scanfの練習をしていたんですが、上手く動いてくれません。
手本によれば、100と入力すると100.000000が表示される筈なのですが
何を入力しても、0.000000が表示されます。orz
見比べて入力間違いは無いと思うのですが…
どこに間違いが有るか教えて下さい。お願いします。
#include <stdio.h>
int main(void)
{
double data;
scanf("%If",&data);/*入力*/
printf("%f\n",data);
return 0;
}
0440デフォルトの名無しさん
2006/12/26(火) 09:53:300441439
2006/12/26(火) 10:14:17解決しました。私の使っているエディターで『I』、『l』の
表示が同じだったので気付きませんでした。orz
どうもありがとうございました!
0442デフォルトの名無しさん
2006/12/26(火) 10:23:000443デフォルトの名無しさん
2006/12/26(火) 10:35:490444デフォルトの名無しさん
2006/12/26(火) 13:57:43ありがとうございます。
理解できました。
ウインドウアプリは少し面倒そうですが、がんばってみます。
0445デフォルトの名無しさん
2006/12/26(火) 19:34:08プログラミングはJavaを少しかじった程度なのでどれを選んだら良いのかさっぱり分かりませんorz
0446デフォルトの名無しさん
2006/12/26(火) 19:41:580447デフォルトの名無しさん
2006/12/26(火) 19:49:09Visual C++ Express
0448デフォルトの名無しさん
2006/12/26(火) 19:50:550449デフォルトの名無しさん
2006/12/26(火) 19:51:140450445
2006/12/26(火) 20:00:11とりあえず>>447を使ってみようと思います。
0451デフォルトの名無しさん
2006/12/26(火) 21:13:53wc -l ソースファイル名
上記のコマンドでUNIX(?)では調べられるらしいんですが・・・
windowsMeではだめでした。
0452デフォルトの名無しさん
2006/12/26(火) 21:48:10それはともかくとして、行数数えるプログラムくらい自分で作ってみろよ。
0453デフォルトの名無しさん
2006/12/26(火) 21:53:18あやや!そう言われればそうでした!
ナイスですw
0454デフォルトの名無しさん
2006/12/26(火) 21:56:13findコマンドを応用すれば出来るから自分で考えれ
0455デフォルトの名無しさん
2006/12/26(火) 22:42:15C以外の事でしたね。すみません
ところでこの手の質問はどこにしたらいいのでしょうか?
探して見ましたが余り適当な所が見当たらなかったです。
0456デフォルトの名無しさん
2006/12/26(火) 23:27:56wcはcの入門書の例題によく出てくるから、まあ範疇でいいじゃない。
wc sed grep lsなど簡単なunixコマンドは大抵win32版がgnuその他のフリーウェアで
転がっているから、ググレば拾えるよ。
0457デフォルトの名無しさん
2006/12/26(火) 23:58:43>>455
Win板で見つからないなら探し方が悪いだけ
0458デフォルトの名無しさん
2006/12/27(水) 00:10:29了解です。只、あれば使って見ようって発想だったんで。プログラム世界のガキ状態ですw
>>457
何かを作るというより、何かを利用して試したいという段階なんでこれ以上の思惑はないですよ。
只、wcと等価なプログラムを自分で作れっていいうその発想自体が刺激的で勉強になりました。
三四郎じょうたいですねw
0459デフォルトの名無しさん
2006/12/27(水) 00:22:25会社の新人に、wc -l相当を作らせた。
できてきたから今度は各行の桁数をカウントさせた。
#wcにはない機能だ。
「wcを自力で拡張した」気になって楽しかったそうだ。
0460デフォルトの名無しさん
2006/12/27(水) 11:13:44#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;
}
0461デフォルトの名無しさん
2006/12/27(水) 15:29:45関数を二つ使うプログラムで変数を共有する方法を教えてください
大局変数で出来るかと思ったのですが、
同じ変数は使えるけど値が共有されてなかったみたいなので・・・
0462デフォルトの名無しさん
2006/12/27(水) 15:39:39もしかして別ファイルで変数定義をヘッダに入れて static つけたりしてないか?
0463デフォルトの名無しさん
2006/12/27(水) 15:41:17大局変数でできます。
0464デフォルトの名無しさん
2006/12/27(水) 15:42:36マルチスレッドとかはやってないよね?
0465461
2006/12/27(水) 15:47:26あれ・・できるんですかorz
すいませんもうちょっと見直してきます
staticやマルチスレッドがどういうものなのかも分からん初心者ですいません
0466デフォルトの名無しさん
2006/12/27(水) 16:21:320467デフォルトの名無しさん
2006/12/27(水) 17:29:090468461
2006/12/27(水) 19:32:36実は学校で出された課題で
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);
}
0469デフォルトの名無しさん
2006/12/27(水) 19:47:58それ、何を持って違うと判断した?
tはグローバル変数だから、0に初期化されてるが
printf の引数は右から積むから、printfにはtが0のままセットされるよ
関数fib()を呼び出すのはその後だから、違うように見える
0470デフォルトの名無しさん
2006/12/27(水) 19:52:04おおおお!ありがとうございます!!
順番のことなんてまったく思いつきませんでした
printfは右からだったなんてまったく知りませんでしたorz
おかげで動きました!!
0471デフォルトの名無しさん
2006/12/27(水) 19:54:51関数の引数は評価の順番に依存してはいけない
0472デフォルトの名無しさん
2006/12/27(水) 22:12:29任意の変数名や関数名を取り出して表示することって出来ますか?
0473デフォルトの名無しさん
2006/12/27(水) 22:30:01デバッグオプション付きでコンパイル + デバッガ
0474デフォルトの名無しさん
2006/12/27(水) 22:44:26そっか、確かにそういう作業ってデバッグだと必要ですよね、ありがとうございます
まずは使えるようにするところからか…
0475デフォルトの名無しさん
2006/12/28(木) 01:05:53色々なってない。特に酷いのはCRだ。
0476デフォルトの名無しさん
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] その他の制限:まだ何も習っていません。具体的に回答を提示してくれると助かります。
0477デフォルトの名無しさん
2006/12/28(木) 13:17:170478デフォルトの名無しさん
2006/12/28(木) 13:26:090479デフォルトの名無しさん
2006/12/28(木) 16:02:130480デフォルトの名無しさん
2006/12/28(木) 22:36:47という技法はC言語の範囲で実現可能ですか?
昔はゲーム等でよく使われてた方法みたいですが
0481デフォルトの名無しさん
2006/12/28(木) 22:43:120482デフォルトの名無しさん
2006/12/28(木) 22:59:07別の関数をロードするなど、今からすれば考えられないような
汚いテクニックが当たり前のように使われていた時代がある。
家庭用ゲーム機には仮想記憶がないので、未だにオーバーレイが
使われている。
0483デフォルトの名無しさん
2006/12/29(金) 03:01:240484デフォルトの名無しさん
2006/12/30(土) 21:40:53任意の長さの正方形をプリントする関数を書いているのですが、
以下のコードを実行すると、数字以外の文字は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");
}
}
0485デフォルトの名無しさん
2006/12/30(土) 22:11:39> scanf("%d", &fillCharacter);
おかしいだろ。
0486デフォルトの名無しさん
2007/01/01(月) 08:25:50%dは数値を扱う時な。
マルチバイト文字考えないなら
変数fillCharはchar型で足りるし%cでいい
0487デフォルトの名無しさん
2007/01/01(月) 09:35:04おまいら義務教育で英語習ったよな?
0488デフォルトの名無しさん
2007/01/01(月) 09:39:090489デフォルトの名無しさん
2007/01/01(月) 16:19:350490デフォルトの名無しさん
2007/01/02(火) 00:35:16日本語学校に通って、卒業証書貰えよ。
0491デフォルトの名無しさん
2007/01/02(火) 00:49:370492デフォルトの名無しさん
2007/01/02(火) 01:23:05邪魔だ
0493デフォルトの名無しさん
2007/01/02(火) 03:00:37ありがとうございます >>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言語になるとサッパリです・・
0494デフォルトの名無しさん
2007/01/02(火) 04:22:05バッファに残った改行文字を文字として読み込んじゃってるから。
scanf("%c", &fillCharacter); → scanf(" %c", &fillCharacter);
にすれば改行文字を読み飛ばせる。
0495デフォルトの名無しさん
2007/01/02(火) 04:46:12ありがとうございます
この手のミスは参考書だけでなかなか身に付くものではないので参考になりました
0496デフォルトの名無しさん
2007/01/02(火) 13:55:020497デフォルトの名無しさん
2007/01/02(火) 18:57:44言いたいことは分かるけど
0498デフォルトの名無しさん
2007/01/04(木) 02:01:32int 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に変えると、今度はちゃんと計算しやがらねえ…。
これどこが悪いん?サンプル値や目標値にも小数点使う場合があるんで、
そういう風に修正するにはどうすればいいだろう。
0499デフォルトの名無しさん
2007/01/04(木) 02:16:42一番簡単で、単純な方法だと、
int mokuhyou...のところをdouble型にする
入力書式%dを%lfにする
最後に、出力書式%dを%fにする
でおk。
0500デフォルトの名無しさん
2007/01/04(木) 02:48:52ごめん、調べても分からなかったんだけど、double型にするにはどうしたらいいの?
本を読んでも、どーも計算させるプログラムについて深く説明してくれてないから
よく分からん…。
んで%lfってのは%fとかと同じく小数点を扱う書式制御文字ってことでおk?
0501デフォルトの名無しさん
2007/01/04(木) 02:49:030502デフォルトの名無しさん
2007/01/04(木) 02:59:25int 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;
}
0503デフォルトの名無しさん
2007/01/04(木) 04:00:50おおっ、ありがとん!これだよ俺が求めてたものはー。
ってか職場でW-ZERO3に入れて使おうと思ってたんだが、
W-ZERO3でC言語動かすソフトが見当たらねorz
でも勉強になった。ほんとありがとう。
0504デフォルトの名無しさん
2007/01/04(木) 08:53:28W-ZERO3ってExcel載ってなかった? >502程度の内容ならExcelで充分でしょ。
#VBAさえ必要なかろうし。
0505デフォルトの名無しさん
2007/01/12(金) 14:28:39b->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); ←(う)
}
0506デフォルトの名無しさん
2007/01/12(金) 14:30:16×:(b + 1)-> = 1; ←(い)
○:(b + 1)->i = 1; ←(い)
0507デフォルトの名無しさん
2007/01/12(金) 14:37:13正しく動作していると何故判断できる?
正しく動作しているように見えるが、実は正しく動作していないかもしれないじゃないか。
つまり、その辺りは「動いたからOK」と判断せず、正しいプログラムを書くように心掛けなければならないと言うことだ。
0508デフォルトの名無しさん
2007/01/12(金) 14:41:55助かります即レスありがとうございます
やはり、(い)、(う)行が動作したのは偶然と考え、(あ)行で2件mallocするのが
規格に則ったC言語の処方なのでしょうか?
疑問に思ったのは、実行時にセグメンテーションエラーが出なかったことなのです。
メモリ上に存在しない(b+1)領域を参照してるのに、なぜプログラムが落ちないのか、
それが不思議でなりません。
0509デフォルトの名無しさん
2007/01/12(金) 14:53:03それはね、ライブラリとしては1個分*だけ*確保した積もりでも、
環境(OS)の都合で4個分とか8個分も確保してくれちゃったからなのよ。
#b[4].i = 1;で落ちるかb[8].i = 1;で落ちるか、或いはもっといけるか試してみるといい。
0510デフォルトの名無しさん
2007/01/12(金) 14:53:53mallocの最小単位のサイズがそこでとった量より大きいのかもしれんし
0511デフォルトの名無しさん
2007/01/12(金) 15:05:30>>510
疑問が解けました、本当にありがとうございます。
試してみたところ(b + 33789)でセグメンテーションエラーが出て落ちました!
mallocってメモリを余分に確保するんですね、
Cの参考書に書いてないし全然知らなかった・・。
0512デフォルトの名無しさん
2007/01/12(金) 16:16:48参考のために聞いておきたいんだけど、コンパイラは何を使ってるの?
0513デフォルトの名無しさん
2007/01/12(金) 16:33:21こ の 書 き 込 み を 見 た 人 は 三 年 後 に イ ン ポ に な り ま す 。
イ ン ポ に な っ て オ ナ ニ ー が 出 来 な く な る の が 嫌 な 人 は
こ の 書 き 込 み と 同 じ 文 章 を 三 時 間 以 内 に
違 う ス レ に 五 回 以 上 コ ピ ペ し て く だ さ い 。
五 回 書 き 込 ま な か っ た 男 子 学 生 が
書 き 込み を 見 た 後 三 年 後 に イ ン ポに な り ま し
0514デフォルトの名無しさん
2007/01/12(金) 17:41:340515デフォルトの名無しさん
2007/01/12(金) 17:47:450516デフォルトの名無しさん
2007/01/12(金) 17:48:34同じ文字列でもアドレスは違うし
0517514
2007/01/12(金) 18:08:55K&RのP229、UNIXの記憶割り当てのところで確保したブロックへのポインタが
意味のある形で比較できることが前提になっているのですが
「標準規格が許すのは配列の中でのみのポインタの比較である。
したがってこの版のmallocは、一般的なポインタ比較に意味がある
マシンの間でのみ同じように通用する。」
とあって、意味がない場合と言うのが気になりました
>>515
メモリマップドI/Oがまだ良く分からないのですが、
ポインタがメモリアドレスを指しているわけではない場合ということですか
>>516
説明不足ですみません、マシンの方の問題らしいです
0518デフォルトの名無しさん
2007/01/12(金) 18:27:31本の前提やコードが判らんからなんとも言えんが、
malloc()で確保したメモリ同士を比較することに意味がない環境は在り得る。
例えば次の結果は予想不可能だ。
int main()
{
void * p1 = malloc(1);
void * p2 = malloc(1);
printf("p1 %s than p2.\n", p1 < 2 ? "less" : "greater");
return 0;
}
0519517
2007/01/12(金) 18:58:26検索したら丁度本の内容ががこのサイトにありました
ttp://math.ut.ee/~soolo/knr2/chapter8.html
8.7節の二枚目の画像の下辺りからです、何度も後出しですみません…
0520デフォルトの名無しさん
2007/01/12(金) 19:07:500521デフォルトの名無しさん
2007/01/12(金) 19:29:19あ、最初からそういう風に言えばよかったんですね…orz
0522デフォルトの名無しさん
2007/01/12(金) 19:36:240523517
2007/01/12(金) 20:11:45比較しても意味がない環境はあり得るって意味でしたか
自分が変に難しく考えてただけっぽいですね、ありがとうございました
0524デフォルトの名無しさん
2007/01/13(土) 05:11:432枚の画像を任意の場所で重ねて一枚の画像として
出力するにはどのように考えればよいのでしょうか?
環境
winXP Visual C++.NET 2003 コンパイラ(?)→コマンドプロンプト
0525デフォルトの名無しさん
2007/01/13(土) 05:14:27すいません。
0526デフォルトの名無しさん
2007/01/13(土) 07:02:07スレ違い。
Visual Studioスレに行け。
0527デフォルトの名無しさん
2007/01/13(土) 12:47:08Visual Studioうんぬんというより、c言語を使って上記の作業を行う場合、
基本的にどのような流れを組むかアドバイスしてほしいです。
初心者ですいません。
0528デフォルトの名無しさん
2007/01/13(土) 12:57:34画像や画像表示はJavaのように言語や標準のライブラリ等の機能としてあれば説明できるが、
C言語の場合言仕様語にも標準のライブラリにも含まれない。
このため画像表示に関しては多くの場合プラットフォームや外部のライブラリに依存することになる。
そうであるためVSやVCスレでいう結論になる。
これでいい?
0529デフォルトの名無しさん
2007/01/13(土) 13:55:59【初心者歓迎】C/C++室 Ver.33【環境依存OK】
0530527
2007/01/13(土) 15:16:25ありがとうございます!
0531デフォルトの名無しさん
2007/01/14(日) 08:38:430532デフォルトの名無しさん
2007/01/14(日) 10:22:19system()
0533デフォルトの名無しさん
2007/01/14(日) 10:22:490534デフォルトの名無しさん
2007/01/14(日) 10:49:33fork exec とか spawnは環境依存。
0535デフォルトの名無しさん
2007/01/14(日) 14:05:09どなたか教えてください
0536デフォルトの名無しさん
2007/01/14(日) 14:52:48関数f内でnをつかっていろいろ処理して
戻り値もint型なのでそのいろいろ処理した結果をint型で戻す
0537デフォルトの名無しさん
2007/01/14(日) 15:03:04ありがとうございます!!!
もう1つあるのですが、よかったら教えてください。
for(p=2; p*p<=n; ++p)
for(;n%p==0; n/=p)
というfor文なんですが
上の行は /*pを2から1つずつ増やしていき、p*p がn以下の時、以下を計算*/
という意味でいいでしょうか?
下の行はよくわかりません。。。
0538デフォルトの名無しさん
2007/01/14(日) 15:10:21pを2から始めて、p*pがn以下であるという判定が正しい時、以下を計算し、pを1増やして、判定以降を繰り返す。
nをpで割った余りが0であるという判定が正しい時、以下を計算し、nをpで割ったものをpに代入し、判定以降を繰り返す。
0539デフォルトの名無しさん
2007/01/14(日) 15:14:16すごく論理的でわかりやすいです。
助かりました、ありがとうございました。
0540デフォルトの名無しさん
2007/01/14(日) 21:41:18VC++2005です。
Mezegisのような、加速器を作りたいと考えています。
一応、資料等を探してはみたのですが、全くありませんでした。
どなたか資料等や、必要なAPIや、サンプルコード等を教えて頂けませんでしょうか。
よろしくお願いいたします
Mezegisというのはttp://hp.vector.co.jp/authors/VA017297/のRagud Mezegisです。
0541デフォルトの名無しさん
2007/01/14(日) 21:46:410542デフォルトの名無しさん
2007/01/14(日) 21:51:58それが、Delphi製ということなので・・・
何かしらのヒントにはなると思っていますが・・・。。すみません
0543デフォルトの名無しさん
2007/01/14(日) 22:07:38http://pc10.2ch.net/test/read.cgi/tech/1166172047/
http://pc10.2ch.net/test/read.cgi/tech/1168708801/
とかで訊いてみるのがいいかも。
0544デフォルトの名無しさん
2007/01/14(日) 23:38:53ありがとうございます。
本文コピペですが、そちらに貼らせて頂きます..
0545デフォルトの名無しさん
2007/01/15(月) 00:25:11プロの人は、「今ココでスタックを256バイト使っている」とか、計算しながら書いたりするのでしょうか。
デバッグ中に、スタックの使用量を求めることは出来るのでしょうか。
0546デフォルトの名無しさん
2007/01/15(月) 00:44:350547デフォルトの名無しさん
2007/01/15(月) 01:54:13今はどうか知らんが
0548デフォルトの名無しさん
2007/01/15(月) 19:11:47main(int argc, char *argv[])
の*argv[]が**argvでもいいみたいなんですが、
*argvでなく**argvなのはなぜでしょうか?
0549デフォルトの名無しさん
2007/01/15(月) 19:55:55だと文字列いっこじゃね?
0550デフォルトの名無しさん
2007/01/15(月) 22:03:20配列とポインタの関係が理解できてない。
参考書があるなら、配列の項目をしっかり読むといい。
0551デフォルトの名無しさん
2007/01/15(月) 22:35:39getch0()というのはどういう意味なんでしょうか?
getch()がキーボードから1文字読み込むものだというのは分かったのですが
0っていうのがさっぱり分かりません・・・
0552548
2007/01/15(月) 23:16:52ありがとうございます。
アドバイスを参考に復習してきます。
インターネットで調べつつやっているんですが、
参考書みたいなものはあったほうがいいんでしょうか?
0553デフォルトの名無しさん
2007/01/15(月) 23:36:33その関数を作った香具師に聞け。
0554デフォルトの名無しさん
2007/01/16(火) 00:15:44俺もインターネットで学習した人だけど、やっぱり参考書があったほうがいい。
資金がつぎ込まれているものはやはり完成度、確かさが違う。
金を出すのがイヤなら、学校や町の図書館で借りるのがいいかと。
0555デフォルトの名無しさん
2007/01/16(火) 00:17:35C言語の本は星の数ほどあるけれど、これ以外読む必要はない
SEでこの本を読んでない奴はモグリ
ちなみに>>548の回答もズバリ「5.10コマンド行の引数」に書かれている
プログラミング言語C ANSI規格準拠 (単行本)
B.W. カーニハン (著), D.M. リッチー (著), 石田 晴久 (翻訳)
0556デフォルトの名無しさん
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[%]
0558548
2007/01/16(火) 01:01:17argvには直接文字が直接わたってくると勘違いしていたみたいです。
argvには文字列へのアドレスが渡ってきて、
*argv=argv[0]=文字列へのアドレス(プログラムのあるアドレスの文字列)、
そして、**argvで文字列の最初の文字を見られる。
最初にポインタがわたってくる(?)から**argvということでいいんでしょうか。
0559デフォルトの名無しさん
2007/01/16(火) 01:01:49If you understand English,you can get a PDF copy of the origina English text
for free on a website.
http://www.fis.cinvestav.mx/~jccorona/manuales/ProgrammingLanguageAnsiC.pdf
0560555
2007/01/16(火) 01:03:16ごめん偉そうな事書いたけど
頭ごなしに信用して買うんじゃなくて、一応中確認してから買ってね
やっぱ生理的に合わない文体もあるから
でも俺は今のところ、この本を読んで解決しなかった謎はないよ
(理解できる範囲で)
あと周りの人必ず誰か持ってると思うんで、借りてみるのもいいよ
0561デフォルトの名無しさん
2007/01/16(火) 01:13:37概ねそれで正解。
argvで渡されるのは、複数の文字列のポインタが詰まった配列。
最初のポインタは、最初のコマンドライン引数の一文字目ということになる。
したがって、i番目のコマンドライン引数にアクセスする場合は、arg[i]となる。
その中のj番目の文字にアクセスする場合は、arg[i][j]となる。
理解するのが面倒だが、がんばれ。
0562548
2007/01/16(火) 01:41:26>>559
英語はあまりできないので、時間はかかりそうですが少しずつ読んでみたいと思います。
むしろ、英語の勉強になりそうです。
>>560
プログラミングに関係ない環境にいるので、持ってる人はいないと思います。
でもかなりいい本みたいなので買ってみたいと思っています。
>>561
なるほど、すっきりしました。
argv[0]には文字が入ってると勘違いしていて1日くらいずっとループしてました。
もっともっと勉強して、いろいろなプログラムが書けるよう頑張りたいと思います。
みなさん本当にありがとうございました。おやすみなさい。
0563デフォルトの名無しさん
2007/01/16(火) 16:47:39argvの最初のポインタは、最初のコマンドライン引数へのポインタでなく、
コマンドそのものの文字配列へのポインタ。
したがって、
> i番目のコマンドライン引数にアクセスする場合は、arg[i]となる。
は正しい。argvの添字は0から始まるから。
0564デフォルトの名無しさん
2007/01/16(火) 17:46:51ジャンプテーブルとはどういう意味、モノですか?
0565デフォルトの名無しさん
2007/01/16(火) 18:10:47処理の行き先を定義したテーブルのこと。
#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;
}
関数へのポインタの配列を用意して、その配列の要素を関数として呼び出す。
このポインタの配列を関数のポインタを利用したジャンプテーブルという。
テーブルの内容を途中で書き換えるような使い方もできるし、
呼び出し先から戻ってこないようにすることもできる。
0566デフォルトの名無しさん
2007/01/16(火) 20:26:56int 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」となってしまい、うまくいきません。どう改善すればいいのか教えてもらえないでしょうか。
0567デフォルトの名無しさん
2007/01/16(火) 20:29:08↑
0568デフォルトの名無しさん
2007/01/16(火) 21:12:02初心者のうちは、for文やif文の中身が単文であっても、
できるだけ{}で囲う癖をつけておいた方がいいよ。
そうすればそういう凡ミスは防げる。
0569566
2007/01/16(火) 21:21:34アー!!
ifに気をとられてました・・・。いつもこんなんで詰まっちゃう(TT
>>568
そうですか〜。教科書の例題なんかのをよくわからずに真似しちゃってました
回答ありがとうございました。
0570デフォルトの名無しさん
2007/01/16(火) 21:25:09printfをいろんなところに入れてデバッグする癖をつけろ
さらにバグ出すかもしれんが
0571デフォルトの名無しさん
2007/01/16(火) 21:45:36画像を扱うとき、バックバッファはどうやって作ればよろしいでしょうか?
0572デフォルトの名無しさん
2007/01/17(水) 06:09:250573デフォルトの名無しさん
2007/01/17(水) 06:32:030574デフォルトの名無しさん
2007/01/17(水) 08:13:590575デフォルトの名無しさん
2007/01/17(水) 11:42:58using 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の文字をそのまま整数として吐き出せるんでしょうか?
0576デフォルトの名無しさん
2007/01/17(水) 12:06:34もう何がしたいのかわからねぇ
C++したいの?
Cしたいの?
どっちなのーーーーーー
0577デフォルトの名無しさん
2007/01/17(水) 12:16:020578デフォルトの名無しさん
2007/01/17(水) 12:22:480579デフォルトの名無しさん
2007/01/17(水) 12:34:23'1'を 1 にしたいってことかな
x -= '0';
y -= '0';
0580デフォルトの名無しさん
2007/01/17(水) 15:17:31include math.hってのはわかるんですが、
sin(2*3.14*f)ってすればいいんですか?
πをあらわすのって無理なんでしょうか
0581デフォルトの名無しさん
2007/01/17(水) 15:19:23M_PI
0582デフォルトの名無しさん
2007/01/17(水) 15:23:37math.hの中を検索して定義されていなければ、
自分で定数として定義するか、そのまま値を式に書くかする。
0583デフォルトの名無しさん
2007/01/17(水) 15:25:150584デフォルトの名無しさん
2007/01/17(水) 16:31:180585デフォルトの名無しさん
2007/01/17(水) 18:06:08年寄りは奇妙な無理数であると信じているから困る。
ソース http://ja.uncyclopedia.info/wiki/%E5%86%86%E5%91%A8%E7%8E%87
0586デフォルトの名無しさん
2007/01/17(水) 18:07:07double MY_PI = 4 * atan(1);
0587デフォルトの名無しさん
2007/01/17(水) 20:17:18C勉強し始めて半年くらいたつんだが
ここの質問の内容がほとんど理解できない
これって才能ないんですか?
みなさんプログラミング学習し始めてどのくらい経っているんですか?
ちなみに、プログラマ目指している62歳です
0588↑
2007/01/17(水) 20:18:000589デフォルトの名無しさん
2007/01/17(水) 21:15:49別に良いんじゃねーの〜
人それぞれペースってのがあるし
そりゃ才能や素質があればそれにこしたことはないけど
日々勤しめば成らざるを得やんや
ゆっくり行こうや
0590デフォルトの名無しさん
2007/01/17(水) 21:51:14例えば、
struct table dat[10000];
の10000を変数で定義できないんでしょうか?
ファイルサイズに合わせて構造体の要素数を決めたいです。
0591デフォルトの名無しさん
2007/01/17(水) 21:54:51malloc() & free()
スタックが十分にあるならalloca()でもいい
0592デフォルトの名無しさん
2007/01/17(水) 22:19:49即レスありがとうございます。
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を構造体に適用する場合どう書けばいいのでしょうか?
0593デフォルトの名無しさん
2007/01/17(水) 22:39:29#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;
}
0594デフォルトの名無しさん
2007/01/17(水) 22:45:38ありがとうございます。大変参考になります。
先がようやく見えました気がします。
0595デフォルトの名無しさん
2007/01/17(水) 22:57:12目から鱗がばさばさと落ちた。感動した。いままでの理解は何だったのだろう?
0596デフォルトの名無しさん
2007/01/17(水) 23:36:19つーか、ネタとしても詰まらんのだけど、そのWikiもどき。
0597デフォルトの名無しさん
2007/01/17(水) 23:50:130598デフォルトの名無しさん
2007/01/18(木) 00:16:370599デフォルトの名無しさん
2007/01/18(木) 00:48:04int[10][10] f(){return a); //コンパイルエラー
void g(int a[10][10]); //引数ならできた
この関数fの戻り値の型ってどうすればエラー消えますか
0600デフォルトの名無しさん
2007/01/18(木) 01:10:21構造体にするかポインタで
0601デフォルトの名無しさん
2007/01/18(木) 01:11:00戻り値にint[10][10]としてるが、例えばその戻り値のaの値はint[10][10]のどこに入る?
ま、簡単に言えば、構文として成り立ってない。
適切な戻り値の型以前にその関数が何をしたいのかが分からない。
まだ、その関数の用途が分かれば返答も出来るけどね
0602デフォルトの名無しさん
2007/01/18(木) 01:15:33なるほど、ありがとうございます
>>601
すみません、特に用途があるわけではなくちょっと疑問におもっただけです
0603デフォルトの名無しさん
2007/01/18(木) 01:17:59としたらエラー消えないか?
0604デフォルトの名無しさん
2007/01/18(木) 01:19:30struct B {
int a[10][10];
} b;
struct B f() { return b; }
0605デフォルトの名無しさん
2007/01/18(木) 01:36:01うーん、これはだめでした
>>604
できました!ありがとうございました
0606デフォルトの名無しさん
2007/01/18(木) 01:40:18int a[10][10]; /* hoge_t a[10];と同じ */
hoge_t *f() {return a;}
0607デフォルトの名無しさん
2007/01/18(木) 19:47:32コインの識別はコインセレクター(自販機とかにある500,100,50を識別する機械)で判別させようと思うんだけど…
わかる頭が良い人教えてください
0608デフォルトの名無しさん
2007/01/18(木) 19:49:00コインの識別はコインセレクター(自販機とかにある500,100,50を識別する機械)で判別させようと思うんだけど…
わかる頭が良い人教えてください
0609デフォルトの名無しさん
2007/01/18(木) 20:01:34エラーでcoreを出力したときの中身の見方が分かりません。
ぐぐってもいまいち見つからなかったので・・・
0610デフォルトの名無しさん
2007/01/18(木) 20:25:18dbx hoge core
0611デフォルトの名無しさん
2007/01/18(木) 20:41:04レスどうもです。dbxでぐぐってみました。
コンパイル時に -g オプションを付けて
dbx (ファイル名).c core.**
とすれば良いのでしょうか?
0612デフォルトの名無しさん
2007/01/18(木) 20:43:100613デフォルトの名無しさん
2007/01/18(木) 22:28:45A.cでつくった構造体のデータをB.cでも使えるようにする方法ってあります?
0614デフォルトの名無しさん
2007/01/18(木) 22:52:55インクルードファイルに構造体を書いて、両方でインクルードする。
0615デフォルトの名無しさん
2007/01/18(木) 23:01:17ありがとうございます
しかし、宣言に記憶クラスが多すぎる
というエラーがでるのですが
0616デフォルトの名無しさん
2007/01/19(金) 02:50:38変数に格納したいのですが、どのようにすればいいのでしょうか?
いろいろ試してみたのですが、実行中に突然エラーになってしまったり
して、どうすればいいのか困っています。
わかる方 教えてください。
ちなみに具体的に説明すると
while(c=fgetc(fp))!=EOF){}のchar型変数cに格納された
文字をほかに用意した変数(a[200])に一回一回格納して
いくにはどうすればいいのか?
ということです。
よろしくお願いします。
0617デフォルトの名無しさん
2007/01/19(金) 03:14:580618デフォルトの名無しさん
2007/01/19(金) 03:19:480619デフォルトの名無しさん
2007/01/19(金) 03:28:280620デフォルトの名無しさん
2007/01/19(金) 03:48:030621デフォルトの名無しさん
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--;
}
}
0622デフォルトの名無しさん
2007/01/19(金) 05:32:44{
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);
0623デフォルトの名無しさん
2007/01/19(金) 05:33:21printf("昨日の日付と明日の日付どちらを表示するか入力してください\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);
}
よろしくお願いします
0624デフォルトの名無しさん
2007/01/19(金) 05:46:37Cプログラミングの練習をしているならともかく、
time.hにあるtm構造体や各種関数を使った方が綺麗にまとまるんじゃないか?
0625デフォルトの名無しさん
2007/01/19(金) 05:53:300626デフォルトの名無しさん
2007/01/19(金) 06:11:41もういいです
ありがとうございました
0627デフォルトの名無しさん
2007/01/19(金) 09:19:57while(c=fgetc(fp))!=EOF){
a[i] = c;
i = i + 0;
};
これじゃだめ?
あと実行中のエラーは、a[200]の場合、読み込んだ文字列が
200文字超えた時に起きてるのじゃないかな。
このエラーは、mallocとreallocを使って、読み込みながらメモリを
取得していくことで解決できるよ。
0628はじめまして
2007/01/19(金) 09:38:32コンパイラの設定を誤り、正しくコンパイルしてくれません。ちなみにbcc32です。購入した本はXPを使った演習で、こちらは98です(古いorz)
プロンプトはMS-DOSでコンパイラの場所はC:>\windows\borland\bcc55\bioです。本には正しくコンパイラが動作するようにpathが付けようとか書いてるけど、その本には環境変数をどうたらかんたら……。でも98にはそんな項目が見当たらない……。
※本の題名は「10日でC言語〜」著:坂下 夕里
0629デフォルトの名無しさん
2007/01/19(金) 10:11:32環境変数の設定が必要。
少なくとも、PATH、INCLUDE、LIB は入れないと。
98の環境変数はSET コマンドで設定する
毎回同じものを設定するならBATファイルに設定
AUTOEXEC.BATに入れとけばずっと設定される。
0630デフォルトの名無しさん
2007/01/19(金) 11:06:17早速…と、思ったら…
なになに!?
クラスタスキャン!?
なんだよこれ!!!
0631デフォルトの名無しさん
2007/01/19(金) 11:54:03realloc()を使うようなプログラムなら、malloc()は不要だろ。
初回だけmalloc()を使うなんて扇子ないぞ。
0632デフォルトの名無しさん
2007/01/19(金) 12:01:530633デフォルトの名無しさん
2007/01/19(金) 12:12:390634デフォルトの名無しさん
2007/01/19(金) 13:32:25>i = i + 0;
ここに突っ込もうぜ。
0635デフォルトの名無しさん
2007/01/19(金) 13:36:150636デフォルトの名無しさん
2007/01/19(金) 15:28:56十日で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
がんばってください
0637デフォルトの名無しさん
2007/01/19(金) 15:53:18来世に期待しろ。
0638はじめまして
2007/01/19(金) 17:13:12応援ありがとうございます。
XPを持っている叔父の家で練習します。
その後、その参考資料をもとにレベルアップをはかります!
0639デフォルトの名無しさん
2007/01/19(金) 21:41:49もういいです
ありがとうございました
0640デフォルトの名無しさん
2007/01/19(金) 21:49:33を解決する方法についてお教えください。
よろしくお願いします。
0641デフォルトの名無しさん
2007/01/19(金) 22:09:29よくわからないがこういう答えでええの?
1.安定なソートアルゴリズムを使う。
2.順番に番号を振ってからクイックソートする。
0642デフォルトの名無しさん
2007/01/19(金) 22:22:25ありがとうございます。
参考になります。
0643デフォルトの名無しさん
2007/01/19(金) 22:48:450644デフォルトの名無しさん
2007/01/20(土) 14:58:39初期値設定、文字関数、シフト演算、論理演算の順の問題
配列、判定、継続条件、値の更新の順の問題
初期値設定、入力の書式、判定条件、値の更新、最終カウント値の順の問題ってどれですか教えてくださいお願いします
↓で見ていたんですがわかりませんでした
ttp://www.rs.kagu.tus.ac.jp/infoserv/j-siken/
0645デフォルトの名無しさん
2007/01/20(土) 20:09:27次に示すように、二つの整数値を読み込んで、前者の値が後者の何%であるかを表示するプログラムを作成せよ。
の問題をこういう形で答えたいんですが・・・
2つの整数を入力してください。
整数A:○
整数B:○
Aの値はBの○%です。
説明下手ですみません・・・
0646デフォルトの名無しさん
2007/01/20(土) 20:18:42部分的に聞きたいのなら、どこがわかってどこがわからないのか、自分の中で切り分けろ。
0647デフォルトの名無しさん
2007/01/20(土) 20:42:480648644
2007/01/21(日) 01:58:120649デフォルトの名無しさん
2007/01/21(日) 23:00:18int *a = (int *)malloc(1024);
とキャストしているのをよく見るんですが、何故キャストしているんでしょうか?
0650デフォルトの名無しさん
2007/01/21(日) 23:06:111. 昔のCにはvoid*がなくchar*で代用していたためキャストが必要だった。
2. 実はC++としてコンパイルしている:C++では型安全性のためvoid*から他のポインタ型への変換にはキャストが必要になった。
もちろん好みでやっていると言う可能性もあるが、そういう人も上に挙げた理由の影響を少なからず受けていると思う。
0652デフォルトの名無しさん
2007/01/22(月) 01:23:400653デフォルトの名無しさん
2007/01/22(月) 19:16:18unsigned charとcharの違いをざっくりと教えてもらえませんか
0654デフォルトの名無しさん
2007/01/22(月) 19:23:53char -127〜127
0655デフォルトの名無しさん
2007/01/22(月) 19:33:47>>653です
ありがとさんです
unsigned charもcharも文字型の変数ということには変わりないですよね?
0656デフォルトの名無しさん
2007/01/22(月) 19:40:58間違い。
charはsignedであってもunsignedであってもいい。
0657デフォルトの名無しさん
2007/01/22(月) 19:43:54頭固すぎ
0658デフォルトの名無しさん
2007/01/22(月) 20:05:36規格ではそのように定められているので、>>656が正しい。
(ISO/IEC 9899:1999 6.2.5 Types 15)
区別は<limits.h>で定義されているCHAR_MINの値が0かSCHAR_MINかによって
可能であるとされている。
(ISO/IEC 9899:1999 footnote 35)
0659デフォルトの名無しさん
2007/01/22(月) 20:09:37とりあえず>>654にレスするのは検討違いもいいところ
おまえの屁理屈なら>>653の質問につっこむべき
0660デフォルトの名無しさん
2007/01/22(月) 20:12:06だから>>654でも正解といえるな。
0661デフォルトの名無しさん
2007/01/22(月) 20:13:36みなさんどうもありがとうございます
ANSI Cであることを明示しなくて申し訳なかったです
結論としては
unsigned charとcharの区別は無く、同じ文字型の変数を表すという事と理解しました。
0663デフォルトの名無しさん
2007/01/22(月) 20:27:36(1)unsigned charとsigned charの違いをざっくりと教えてもらえませんか
(2)unsigned charとunsigned charの違いをざっくりと教えてもらえませんか
それを確認しないで、回答した>>654は早とちり。
さらに>>654に突っ込む>>656も早とちり。
(1)の場合は>>654が正解。(2)はありえない。
0664デフォルトの名無しさん
2007/01/22(月) 20:47:55次の質問をさせて下さい
この様なmain関数とfor文が出てきたのですがこのfor文はどんな振舞いをするのでしょうか?
さっぱり理解できません、宜しくお願いします。これもANSI Cです
void main(int argc, char *argv[])
{
int i = 0;
for (--argc, ++argv; argc > 0; --argc, ++argv, i++) {
//処理
}
}
0665デフォルトの名無しさん
2007/01/22(月) 21:05:29unsigned charとsigned charとcharは各々異なる型なんだが、
signed charとcharが同じものだと勘違いしてないか?
>>664
すべてのargvに対して処理をしている。
ただしargv[0]、すなわち"program name"(自身のパスのことが多い)を除く。
0666デフォルトの名無しさん
2007/01/22(月) 21:10:53iを定義したなら
for(i=1; i<argc; i++) {
で処理内でargv[i]を使う方が普通じゃないか?
0667デフォルトの名無しさん
2007/01/22(月) 21:25:23>>663です
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200205/02050091.txt
ここ見てたら何となく分かってきました
charは文字変数で
shortより小さい整数型が欲しいときに,
unsigned charやsigned charを使います。
それぞれ3つの型は違うものと書いてありました。
0668デフォルトの名無しさん
2007/01/22(月) 21:27:28unsigned charとsigned charとcharが各々異なる型なのはC++の場合。
Cの場合charはsigned charまたはunsigned charと同じとされている。
だから663は一見おかしく見えるが、おかしいことは言っていない。
0669デフォルトの名無しさん
2007/01/22(月) 21:58:24ANSI Cです。
0670デフォルトの名無しさん
2007/01/23(火) 00:26:240671デフォルトの名無しさん
2007/01/23(火) 00:28:27charは、signed charとunsigned charとのいずれとも、異なる型であり、compatibleではない。
(ISO/IEC 9899:1999 footnote 35)
0672デフォルトの名無しさん
2007/01/23(火) 00:30:06/ / ヽ ::: \
| (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ,,ノ(、_, )ヽ、,, | < まーたC99か!!
| ,;‐=‐ヽ .:::::| \_______
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\
0673デフォルトの名無しさん
2007/01/23(火) 00:46:580674デフォルトの名無しさん
2007/01/23(火) 01:11:02char/signed char/unsigned charってどう違うの??
0675デフォルトの名無しさん
2007/01/23(火) 06:22:12charがsignedかunsignedかは処理系定義。
実際、コンパイラオプションで切り替えられるのが一般的。
従って、>654では不充分。
0676デフォルトの名無しさん
2007/01/23(火) 07:57:37>>654が不十分かどうかじゃ答えになってないぞ
0677デフォルトの名無しさん
2007/01/23(火) 08:26:20>675の1行目は読めませんか?
0678デフォルトの名無しさん
2007/01/23(火) 10:15:32>>653の「ざっくり」が読めてないのか?
0679デフォルトの名無しさん
2007/01/23(火) 10:17:370680デフォルトの名無しさん
2007/01/23(火) 10:22:19>charがsignedかunsignedかは処理系定義。
charをunsignedでコンパイルしている奴には今までお目にかかった事はないな実務としてだけど
初心者スレ程度なら>>654でざっくり覚えておけばいいだろ、というかいい加減にしろ
0681デフォルトの名無しさん
2007/01/23(火) 10:47:09で、charが処理系定義であることを認めない香具師は何でそんなに必死なの?
0682デフォルトの名無しさん
2007/01/23(火) 10:50:47規約云々ばかり言ってるとあたまでっかちに思われるから注意した方がいいよ
0683デフォルトの名無しさん
2007/01/23(火) 16:15:04LSI C-86はcharをunsignedにしていたはず。
0684デフォルトの名無しさん
2007/01/23(火) 16:20:43unsigned charとcharの違いをざっくりと教えてもらえませんか
0685デフォルトの名無しさん
2007/01/23(火) 16:27:540686デフォルトの名無しさん
2007/01/23(火) 16:29:210687デフォルトの名無しさん
2007/01/23(火) 16:47:32うまくインクルードする方法はないでしょうか?
0688デフォルトの名無しさん
2007/01/23(火) 16:56:43OSなやIDEどの環境とコンパイラの種類とヴァージョンくらい書こうな。
1つのファイルで20M?それともトータル?
0689デフォルトの名無しさん
2007/01/23(火) 17:12:19++(a->c);
これがどういう動きをしてるのか詳しく教えて下さい。
2行続けてソース内に入力されています。
0690デフォルトの名無しさん
2007/01/23(火) 17:38:22a->cをインクリメント
0691デフォルトの名無しさん
2007/01/23(火) 19:16:28#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が
かえってきました。なぜでしょうか。
0692デフォルトの名無しさん
2007/01/23(火) 19:25:13そしてコンパイラに依存するコードは書いてはいけない
0693デフォルトの名無しさん
2007/01/23(火) 19:29:440694デフォルトの名無しさん
2007/01/23(火) 19:40:17Cのソースをライブラリにして、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++についてはあまりよく知りません。
アドバイスをよろしくお願いします。
0695デフォルトの名無しさん
2007/01/23(火) 20:06:47KIAIダ
0696デフォルトの名無しさん
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
0697デフォルトの名無しさん
2007/01/23(火) 20:22:29どこのテンプレかしらないけど、そこまで書式整えてんなら、素直に宿題スレ行けよw
0698デフォルトの名無しさん
2007/01/23(火) 20:27:270699694
2007/01/23(火) 20:29:58を使うとうまくいくようです。
失礼しました。
0700デフォルトの名無しさん
2007/01/23(火) 20:54:06配列などのデータを変更するような関数が作りたくて、以下のようなプログラムを作ったのですがうまく動きません。
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です。
0701デフォルトの名無しさん
2007/01/23(火) 21:03:09ttp://www.kouno.jp/home/c_faq/c3.html#2
0702デフォルトの名無しさん
2007/01/23(火) 21:21:050703デフォルトの名無しさん
2007/01/23(火) 21:33:21その関数使ってみたけど、ちゃんとコピーできたよ。
0704デフォルトの名無しさん
2007/01/23(火) 21:52:34スレ汚しすいませんでした
0705デフォルトの名無しさん
2007/01/23(火) 23:39:35かきくけこ,1,2,3,4,5 ...... ,50
・
・
・
上のような、カンマで区切られたtxtファイルを
構造体配列に格納したいのですが
1行あたり50個程データが有り
一つ一つ格納していくと、どうしてもコードが長くなってしまいます・・・
配列のように簡単に格納出来るような良い方法は無いでしょうか?
0706デフォルトの名無しさん
2007/01/24(水) 00:02:160707デフォルトの名無しさん
2007/01/24(水) 01:42:25各行の各項目を全部文字列として格納しちまえ。
もし、各項目の文字列の最大長があまり変わらないなら、長さの決まった文字配列に、
最大長を決められないとかなら、ヒープからでもメモリを割り当てて、それにそれぞれを格納する。
そうすれば、構造体じゃなく行番号と項目番号と項目内容の各文字の位置をインデックスとする三次元文字配列か、
行番号と項目番号をインデックスとする文字配列へのポインタの二次元配列で済むぞ。
ループで楽に回せる。
0708デフォルトの名無しさん
2007/01/24(水) 12:11:18なるほど、わざわざ構造体にせずとも、多次元配列+ループを使えばいいわけですね
そっちの方向で練り直してみます、ありがとうございました
0709デフォルトの名無しさん
2007/01/24(水) 18:34:22非常に関心があります、具体的なコードを書いてみてもらえますか?
0710デフォルトの名無しさん
2007/01/24(水) 18:38:12配列にするか構造体にするか変わってくるんじゃね?
0711デフォルトの名無しさん
2007/01/25(木) 01:35:18ソースは以下の通りです。
#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;
}
改善点を教えていただけないでしょうか。
0712デフォルトの名無しさん
2007/01/25(木) 01:38:35>if (argv[1] == "-a"){
間違い
コンパイル時に出力されたエラーも書けよ
0713デフォルトの名無しさん
2007/01/25(木) 01:45:27エラーはでない。
警告なら出るが、うまくいかないのとは無関係。
0714711
2007/01/25(木) 02:53:51条件文をどのようにすればいいんでしょうか・・・?
0715デフォルトの名無しさん
2007/01/25(木) 03:00:520716711
2007/01/25(木) 03:25:06ありがとうございます。解決しました。
strcmpには大小関係を比べるイメージしかなかったのですが、こういった使い方がありましたか。
うーん、理解が足りてない。精進せねば・・
0717デフォルトの名無しさん
2007/01/25(木) 09:37:08こういうあげあし取りのレスって恥ずかしいよな・・・w
0718デフォルトの名無しさん
2007/01/25(木) 09:54:230719デフォルトの名無しさん
2007/01/25(木) 09:59:21うまくいかないって何?
0720デフォルトの名無しさん
2007/01/25(木) 15:36:470721デフォルトの名無しさん
2007/01/25(木) 16:56:40そもそも、こっちの使い方のが多いと思う。
大小も比較するなんてほとんどソートの時だし
0722デフォルトの名無しさん
2007/01/25(木) 20:46:190723デフォルトの名無しさん
2007/01/26(金) 19:41:20どのような違いがあるのでしょうか??
0724デフォルトの名無しさん
2007/01/26(金) 19:48:350725デフォルトの名無しさん
2007/01/26(金) 20:38:20>>723
違いなんて別にない。処理しやすいほうを選べ。
0726デフォルトの名無しさん
2007/01/26(金) 20:53:52LF、CRは1バイト、CRLFは2バイトですが何か
0727デフォルトの名無しさん
2007/01/26(金) 20:57:330728デフォルトの名無しさん
2007/01/27(土) 09:48:11ありがとうございます
一行の方にします
0729デフォルトの名無しさん
2007/01/27(土) 15:09:09ソースを全部コピーして別ディレクトリに別の名前で保存とか
0730デフォルトの名無しさん
2007/01/27(土) 15:20:050731デフォルトの名無しさん
2007/01/27(土) 15:32:36C言語にファイル操作の小技なんてない。
0732デフォルトの名無しさん
2007/01/27(土) 19:25:36どのようにしたらよいのでしょうか
0733デフォルトの名無しさん
2007/01/27(土) 20:18:30fclose
fread
fgets
fscanf
0734デフォルトの名無しさん
2007/01/27(土) 20:24:05ありがとうございました
0735デフォルトの名無しさん
2007/01/29(月) 01:43:51#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"が出てしまいます。どうすればいいんでしょうか?
0736デフォルトの名無しさん
2007/01/29(月) 02:00:20printfは"%s",bufを使いなさい。
そして関数のマニュアルを読みなさい
それはあなたのプログラムをよりよくする助けです。
0737735
2007/01/29(月) 02:08:28解決しました。
いつもは%sを使っていたんですが、今回はわけもわからずお手本を真似ていた次第です。
ありがとうございました。
0738デフォルトの名無しさん
2007/01/29(月) 09:57:390739デフォルトの名無しさん
2007/01/29(月) 16:13:43int 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)の所で入力を待たずに終了してしまうのですが何が問題なのでしょうか?
0740デフォルトの名無しさん
2007/01/29(月) 16:21:43>494
0741デフォルトの名無しさん
2007/01/29(月) 16:27:53なんでスペース入れると改行文字を読み飛ばせるの?
0742デフォルトの名無しさん
2007/01/29(月) 16:34:06scanf()系のフォーマット指定における空白とは、「ホワイトスペース文字(空白、改行、タブ)の読み飛ばし」と言う意味だからです。
0743デフォルトの名無しさん
2007/01/29(月) 17:23:021から10まで加算する時、どう書けばいいか教えてください!
0744デフォルトの名無しさん
2007/01/29(月) 17:27:140745デフォルトの名無しさん
2007/01/29(月) 17:30:290746デフォルトの名無しさん
2007/01/29(月) 17:36:380747デフォルトの名無しさん
2007/01/29(月) 17:36:430748デフォルトの名無しさん
2007/01/29(月) 17:41:570749デフォルトの名無しさん
2007/01/29(月) 17:48:020750デフォルトの名無しさん
2007/01/29(月) 18:16:48(char*)a
この二つの違いを教えてください
0751デフォルトの名無しさん
2007/01/29(月) 18:21:220752750
2007/01/29(月) 18:21:38char *a
(char*)a
この二つの違いを教えてください
0753デフォルトの名無しさん
2007/01/29(月) 18:23:070754750
2007/01/29(月) 18:23:49ありがとうございます。
0755デフォルトの名無しさん
2007/01/29(月) 18:26:08それらが現れる文脈によって異なります。
0756750
2007/01/29(月) 18:50:14void *base;
size_t nmemb;
size_t size,
char *p1;
int end = (int)base + nmemb * size;
for(p1 = (char*)base; p1 < (char*)end; p1 += size){
上の二つの文はそれぞれどういう意味なのでしょうか?
できるだけ詳しく教えてください
0757デフォルトの名無しさん
2007/01/29(月) 19:07:16void*型(もしくはvoidへのポインタ型)
ポインタ演算
これがこのコードで理解してほしいところだと思うんだけど、上に挙げた言葉のうちわからないのはどれ?
0758デフォルトの名無しさん
2007/01/29(月) 19:29:47ノートでは式を立てられるのですが、C言語で解く方法を知りたいです。
0759デフォルトの名無しさん
2007/01/29(月) 19:54:400760デフォルトの名無しさん
2007/01/29(月) 20:12:54ヒント:2つの式をy=ax+bの形に変形してyを除去
0761予想される反応
2007/01/29(月) 20:13:16中学校レベル、できれば小学校レベルで教えてください。
0762デフォルトの名無しさん
2007/01/29(月) 20:17:550763デフォルトの名無しさん
2007/01/29(月) 20:22:13小学校じゃ連立方程式はやらん。
0764758
2007/01/29(月) 20:32:06MATLAB では解けるんですが、Cが分かりません。
具体的に言うと、線分ABの両端に、点A、点Bを中心にした円を描いて、
円と線分ABの交点を求めるだけなんです。
点A、点Bの座標、円の半径はわかっています。
これを片方ずつ解くだけなのですが、Cでの求め方がわかりません。
0765デフォルトの名無しさん
2007/01/29(月) 20:35:59マクロはプログラムの軸構造を無惨に変更する(?)#defineは使わず、
enumを使うべきだと習いました。
無惨に変更するって、#defineはCソースでよく使われていると
思いますが、問題を抱えているんでしょうか?
0766デフォルトの名無しさん
2007/01/29(月) 20:40:41初心者用じゃない
0767765
2007/01/29(月) 20:43:45わかりました。他に行きます。
0768デフォルトの名無しさん
2007/01/29(月) 20:59:59enumで列挙することで、一つのグループとしてまとめて定義できるから
わかりやすいからじゃないかな??
例えばなんらかの関連のある定数A、B、Cを
enum teusu { A=0, B=1, C=2 }
とするのと
#define A 0
#define B 1
#define C 2
とするのではenumの方がわかり易いとか・・
0769デフォルトの名無しさん
2007/01/29(月) 21:09:010770デフォルトの名無しさん
2007/01/29(月) 21:48:370771デフォルトの名無しさん
2007/01/30(火) 00:01:20なぜでしょうか。今、CASL�Uを勉強しています。
将来は組み込みのプログラマになりたいです。
0772デフォルトの名無しさん
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量になるなんて、
そんな都合のいいようになるわけが・・・と思ったら普通になったわけですが、どうなってるんでしょうか?
0773デフォルトの名無しさん
2007/01/30(火) 00:15:45何を言っているのかさっぱり分からない。
JAVA使いだと勝手に推測してみる。
0774デフォルトの名無しさん
2007/01/30(火) 00:19:08アセンブラはよりハードに近いプログラミングを行うので、ハードとソフトの関係を理解できる。
ハードとソフトの関係を最初に習っておけば、C言語のような高等言語の裏で何が行われているのか、
よく分かるようになり、学習、理解の幅が広がる。
いわば基礎固め。
重要。
遠回りと思えるけれど、勉強して損になることは全くない。
0775デフォルトの名無しさん
2007/01/30(火) 00:23:32JAVA使いではありません。というより、プログラム自体
今日まさに始めたばかりなので拙い表現で申し訳ないのですが、
まぁ要するに、コップに入った水っていうクラスを作ってみて、
その初めにある水の量と、dasuという関数で捨てる量をどっちもxで
表しているのにどうしてごちゃごちゃにならずに実行されるのかが
分からないわけであります。
0776デフォルトの名無しさん
2007/01/30(火) 00:28:34JAVA使いではありません。というより、プログラム自体今日始めたばかりなので
拙い表現で申し訳ないのですが、要するに、
水の入ったコップというクラスを作って、その最初から入っている水の量と、
関数によって捨てていく水の量をどっちもxで表しているのに、
ごちゃごちゃにならずに普通に実行されるのはなんでかなぁというわけであります。
0777デフォルトの名無しさん
2007/01/30(火) 00:29:190778デフォルトの名無しさん
2007/01/30(火) 00:32:36あのー、もしやこの質問はC言語ではなくC++の方に
するべきでしたでしょうか・・・?
0779デフォルトの名無しさん
2007/01/30(火) 00:38:140780デフォルトの名無しさん
2007/01/30(火) 00:48:59アセンブラの次は、Cの場合だとCコンパイラの生成する実行ファイルの解析って感じ。
VCでも、gccでもiccでも違うし。
0781デフォルトの名無しさん
2007/01/30(火) 00:56:18なんかもう、そういうのは10年くらい前にあきらめました。
素直に書いて、あとはコンパイラの最適化におまかせ。
0782デフォルトの名無しさん
2007/01/30(火) 01:10:450783デフォルトの名無しさん
2007/01/30(火) 01:14:23そういうノウハウはあるね。
0784デフォルトの名無しさん
2007/01/30(火) 01:18:07素直でない書き方ってのは、16bit時代には通用してた速い書き方。
0785デフォルトの名無しさん
2007/01/30(火) 02:05:41int 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 スキップ ==========
と出てしまいます
どこがおかしいのですか?
0786デフォルトの名無しさん
2007/01/30(火) 06:16:14それはC言語の問題ではないのでVisualStudioの初心者向けのスレへどうぞ。
0787デフォルトの名無しさん
2007/01/30(火) 12:52:43win環境で新たにC言語を勉強しようと思っていますが、
無料で手に入る、ボーランド社のコンパイラと
マイクロソフトのVC++は、どちらを使えばよいのでしょうか?
そんなに大差があるわけでもないのでしょうか?
お願いします
0788デフォルトの名無しさん
2007/01/30(火) 12:56:580789デフォルトの名無しさん
2007/01/30(火) 13:01:420790デフォルトの名無しさん
2007/01/30(火) 14:39:27何故か C/C++ では #include されるファイルを
ヘッダファイルと実装ソースに分けるようですが
直接、実装 .c ファイルを読み込むのではいけないのでしょうか?
0791デフォルトの名無しさん
2007/01/30(火) 14:43:062ヶ所から実装を読み込んだら困るだろ
0792デフォルトの名無しさん
2007/01/30(火) 14:49:39また変換された16進数の文字列を元に戻すにはどうすればいいでしょう?
0793デフォルトの名無しさん
2007/01/30(火) 14:52:58戻すのは strtol() とか
0794デフォルトの名無しさん
2007/01/30(火) 16:26:06hは宣言、c( → cpp ?)で定義って
オブジェクト指向のことを言いたいの?
たまに、ヘッダに書くような関数のプロトタイプ宣言や
構造体とかをcppに各会社があるね!
0795デフォルトの名無しさん
2007/01/30(火) 16:40:56ありがとうございます。
こんな風にしてみたんですが「あいう」に戻ってくれません。。。
たくさん間違ってると思いますが、どうすればいいんでしょう?
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);
}
0796795
2007/01/30(火) 16:41:44fuga[i*2] = strtol(c, NULL, 16);
でした。
0797デフォルトの名無しさん
2007/01/30(火) 16:51:49その際、チャンク単位でサイズを変更すること、とあります。
チャンクってなんでしょうか?(ググったんですけどイマイチわかりません)
0798デフォルトの名無しさん
2007/01/30(火) 17:31:340799デフォルトの名無しさん
2007/01/30(火) 17:38:25%02Xは1バイトだけだから、バイト数分繰り返せ。
0800790
2007/01/30(火) 17:41:21しかし申し訳ないのですが疑問はうまく晴れません…
>791
???
実装が2ヶ所から読まれることがあるのですか?
どういう場合にそうなるのか解らないのですが…
>794
いいえ、C言語のスレなので、関数の宣言のことです。
もちろん C++ のクラスのことも含まないわけではないですが
C言語でそうなっている理由が解れば
C++ でそうなっている理由も解ると思ったので…
0801デフォルトの名無しさん
2007/01/30(火) 17:43:21複数のソースで同じヘッダファイルを読むだろう
0802デフォルトの名無しさん
2007/01/30(火) 17:59:57#ifndefで回避できないの?
0803デフォルトの名無しさん
2007/01/30(火) 18:05:04#ifndef (以下略)
> cat mainbar.c
#include "libfoo.c"
0804デフォルトの名無しさん
2007/01/30(火) 18:09:54int 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++;
}
0805804
2007/01/30(火) 18:11:24typedef struct Nameval Nameval;
struct Nameval
{
char *name;
int value;
};
struct NVtab{
int nval;/* 値の現在の個数 */
int max;/* 割り当て済みの値の個数 */
Nameval *nameval;/* 名前-値ペアの配列 */
} nvtab;
enum{NVINIT = 1, NVGROW = 2};
0806デフォルトの名無しさん
2007/01/30(火) 18:15:11ひょっとして、全プロジェクトを単一の翻訳単位ですますのはどうか、
という疑問なのか?
0807デフォルトの名無しさん
2007/01/30(火) 18:15:52分割コンパイルがあたかも上級テクニックのように本の後ろのほうに載ってて、
子供だった自分には何か大げさで込み入った仕掛けのように思えたものだ。
時を経て今に至ってGUIのIDEは分割コンパイルをユーザがたとえ何も分からなくても自動的に行っている。
これもまた時代の流れの中でのソフトウェアの進歩の一つなのかもとしばし感慨にふける。
0808デフォルトの名無しさん
2007/01/30(火) 18:20:420809デフォルトの名無しさん
2007/01/30(火) 18:21:370810デフォルトの名無しさん
2007/01/30(火) 18:22:550811デフォルトの名無しさん
2007/01/30(火) 18:35:40おっしゃる通りにやってみたつもりですが、たぶん違うので答えがめちゃめちゃです。
どうすればいいんでしょうか・・・。
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';
}
0812811
2007/01/30(火) 18:38:18char hoge[] = "abc";
と、元の文字列が1バイトのものであれば正しく復元できます。
0813790
2007/01/30(火) 18:39:28何となくですが疑問が晴れた気がします。
多分、毎回全ソースをコンパイルしたら
(例えば stdio.c があったとすればそれ+それ以下のソース全て含めて)
コンパイル時間が膨大になってしまうので
分割でコンパイルしたいと。
その為には extern 等が必要だが
それを毎回コピペするのは行儀が悪いので
そこを .h で補完するという認識で良いでしょうか?
開始アドレスでなく名前と引数さえ判ればリンクまで出来るのに
バイナリだけでは呼べないってのも変な気がしますが
イメージが掴めた感じなので今回の質問はここまでに留めます。
2度もお手数をおかけしてすみませんでした。
ありがとうございました。
0814デフォルトの名無しさん
2007/01/30(火) 19:01:46char hoge を unsigned char hoge にしてみ。
それに付随するエラーはキャストでおさえればいい
0815デフォルトの名無しさん
2007/01/30(火) 19:07:13符号拡張してるのが
0816812
2007/01/30(火) 21:01:37ありがとうございます、無事に目的を達成できました。
unsigned char を char にキャストするのが何故大丈夫なのかが
いまいち納得いかないのですが、色々デバッガで追ってみようと思います。
0817デフォルトの名無しさん
2007/01/31(水) 16:22:01time.hを使うのだろうという所まではわかったのですが、実際の使い方がわかりません・・・。
Sun Sep 03 11:56:11 1988
Sun Sep 16 01:03:52 2007
0818デフォルトの名無しさん
2007/01/31(水) 16:26:55出た秒数を日数と時分秒にするとか
0819デフォルトの名無しさん
2007/01/31(水) 17:55:48Visual C++ 2005 で、コンソールアプリケーションを組むと、
「デバッグ無しで開始」の場合は
「続行するには何かキーを押してください...」
と出て、そこでプログラムが止まります。
が、Debugファイルの中にあるexeを直接実行してみると、
停止せずすぐに消えてしまいます。
これはどうしてなんでしょうか? また停止せず表示したままにするにはどうすればいいでしょうか?
0820デフォルトの名無しさん
2007/01/31(水) 18:07:49ブレークポイント入れてっけどな
0821デフォルトの名無しさん
2007/01/31(水) 18:12:57すぐ消えないようにIDEが仕込んでるから。
コンソールアプリは元々は
コマンドプロンプトやバッチファイルから起動するものだしな。
一つは、同じフォルダにバッチファイルを作り、そこから起動する方法。
例えば「hello.exe」を起動するバッチファイルならテキストエディタで
hello.exe
pause
と書いたものを拡張子「.bat」で保存。
後はバッチファイルを開けば hello.exe を実行した後に一旦止まるハズ。
後は >820 や、最後に標準入力を待つように書くとか、方法は色々。
0822デフォルトの名無しさん
2007/01/31(水) 18:22:27どうもありがとうございます。
消えるのが普通なんですね。
ありがとうございます。ちょっと両方とも試してみます。
0823デフォルトの名無しさん
2007/01/31(水) 18:28:01というchar型の配列があるとき、
最初のn文字を取り出すには strncpy(char *, const char *, n) でできますが、
最初の5文字目から7文字目(上記例だと 567)を取り出すにはどうすればいいんでしょうか?
やはり地味にポインタ進めて取得する方法ですか?
0824デフォルトの名無しさん
2007/01/31(水) 18:28:02MSのTweakUI 入れて、command window hire を使えるようにして
EXEのあるディレクトリで右クリックでそれ実行して
コマンドプロンプトから直接キーボード入力でファイル名叩くっててもあるぞ
コマンドプロンプトでcdコマンドで深い階層まで到達してもいいけどな
0825デフォルトの名無しさん
2007/01/31(水) 18:30:52それも strncpy() でできるけどな。
引数のsrcのポインタに4足して、nを3にすればいい。
0826デフォルトの名無しさん
2007/01/31(水) 18:33:47ありがとうございます。ちょっと調べてみます。
0827デフォルトの名無しさん
2007/01/31(水) 18:37:31すてき!ポインタってかっこいい!!
ありがとう!!
0828デフォルトの名無しさん
2007/01/31(水) 19:12:11検索の部分を抜き出すと
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( "指定されたデータを発見しました" );
}
}
0829828
2007/01/31(水) 19:12:57{
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;
}
このような感じです。この中におかしい部分はありますか??
0830828
2007/01/31(水) 19:16:15>>828の
struct tnode *root;
struct tnode *search(struct tnode *,char *);
の次がmain関数です。int main()が抜けました。
0831デフォルトの名無しさん
2007/01/31(水) 19:35:35それだと一回しか検索してない。
再帰でp->leftかp->rightを引数に渡したいんじゃないの?
0832デフォルトの名無しさん
2007/01/31(水) 19:38:280833デフォルトの名無しさん
2007/01/31(水) 19:48:130834828
2007/01/31(水) 19:49:47int 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;
}
0836デフォルトの名無しさん
2007/01/31(水) 19:56:04あと、最初の40文字分は飛ばしちゃっていいの?
0837828
2007/01/31(水) 23:26:20リストの中身は
tanaka_tarou 26
isida_junichi 1
kurima_tasumi 17
こんな感じのランダムな文字列が数十行ほどならべてあるものです。
確かに一行とんでいました!
while ((c != NULL)) {
root=gentree(root,dat);
c = fgets(dat,40,fp);
}
こうすべきでしたね。ご指摘ありがとうございます。
0838デフォルトの名無しさん
2007/02/01(木) 00:14:210839デフォルトの名無しさん
2007/02/01(木) 01:52:28strncpy()はナル文字を詰めてくれないからsprintf()の方がいいぞ。
5文字目から7文字目ならこんな感じだ。
sprintf(extractedString, "%.*s", (7 - 5) + 1, moji + (5 - 1));
0840デフォルトの名無しさん
2007/02/01(木) 05:12:04コマンドプロンプトの環境の作り方を教えていただけないでしょうか?
また、コンパイラはフリーで提供されているんでしょうか?
0841デフォルトの名無しさん
2007/02/01(木) 06:00:200842デフォルトの名無しさん
2007/02/01(木) 08:18:560843デフォルトの名無しさん
2007/02/01(木) 14:42:07環境の作り方っつーと、どういう事が言いたいか判らんが
コマンドプロンプトでプログラミングする時知っておくべき事は
・コマンドの実行の仕方
・カレントディレクトリと 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 を扱うならコレだろうな。
0844デフォルトの名無しさん
2007/02/01(木) 15:02:040845デフォルトの名無しさん
2007/02/01(木) 17:04:19これってどういう意味ですか?
0846デフォルトの名無しさん
2007/02/01(木) 17:08:52無限ループの一つ
0847デフォルトの名無しさん
2007/02/01(木) 17:21:12無限ループ
0848デフォルトの名無しさん
2007/02/01(木) 17:22:27無限ループに決まってるだろ
0849845
2007/02/01(木) 17:26:240850デフォルトの名無しさん
2007/02/01(木) 17:28:57無限ループかもしれない
0851デフォルトの名無しさん
2007/02/01(木) 17:29:13http://pc10.2ch.net/test/read.cgi/tech/1133058478/l50
185 名前: デフォルトの名無しさん [sage] 投稿日: 2006/08/18(金) 14:26:43
for ( ; ; );
186 名前: デフォルトの名無しさん 投稿日: 2006/08/18(金) 21:30:48
>>185
おまいさん死なないのかw
0852デフォルトの名無しさん
2007/02/01(木) 19:43:430853デフォルトの名無しさん
2007/02/01(木) 20:02:13#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]が???です。
0854デフォルトの名無しさん
2007/02/01(木) 20:11:38AElig, Ascute, Acirc
↓ で間違いないですか?
AElig Acirc Ascute
プログラミング作法でツリーの説明のページで、
AElig Ascute Acirc
となっていたので疑問に思いました。
0855デフォルトの名無しさん
2007/02/01(木) 20:48:210856デフォルトの名無しさん
2007/02/01(木) 20:51:12どっかからダウンロードできるんじゃないの?
0857デフォルトの名無しさん
2007/02/01(木) 20:52:380858デフォルトの名無しさん
2007/02/01(木) 20:59:31自分のPCでダウンロードして、それを学校側に移せばいいんですかね?
学校のPC、フロッピーしか入れられないけど。
0859デフォルトの名無しさん
2007/02/01(木) 21:05:330860デフォルトの名無しさん
2007/02/01(木) 21:07:140861デフォルトの名無しさん
2007/02/01(木) 21:10:110862デフォルトの名無しさん
2007/02/01(木) 21:11:16しかも実行可能ファイルを作るには各種インポートライブラリも必要。
結局フロッピーディスク1枚に収まる量にならない。
おとなしくPlatform SDKのISO版をダウンロードしてCD-Rか何かにISO焼きして持っていけ。
CDドライブもないようなPCだったら諦めろ。
0863デフォルトの名無しさん
2007/02/01(木) 21:11:33>>843
0864デフォルトの名無しさん
2007/02/01(木) 21:13:51自分のPCには何もありません。
学校のもよく分からないけどウルトラ.cって言うの使ってます。
0865デフォルトの名無しさん
2007/02/01(木) 21:18:560866デフォルトの名無しさん
2007/02/01(木) 21:20:450867デフォルトの名無しさん
2007/02/01(木) 21:28:18これでしょ。どうみても直接Win32APIをたたけるとは思えないな。
0868デフォルトの名無しさん
2007/02/01(木) 22:43:38>>843さん、回答ありがとうございます。
えっと、ボーランド社からダウンロードしてインストールしたんですけど、
あとは、
・コマンドの実行の仕方
・カレントディレクトリと cd コマンド
・PATH(パス)の通し方
に注意して、コマンドプロンプトで入力したらいいんでしょうか??
メモ帳に書いて貼ったんですが、最初のHello World!が表示できません・・・。
0869デフォルトの名無しさん
2007/02/01(木) 22:52:15苦Cでも見とけ
http://homepage3.nifty.com/mmgames/c_guide/
0870デフォルトの名無しさん
2007/02/01(木) 23:56:56qsort()の方が明らかに早く整列されるんです。
この差は何が原因なんでしょうか?
0871デフォルトの名無しさん
2007/02/02(金) 00:13:070872デフォルトの名無しさん
2007/02/02(金) 00:14:52分割点の選択方式が優れているんじゃないの。
0873デフォルトの名無しさん
2007/02/02(金) 07:57:300874デフォルトの名無しさん
2007/02/02(金) 09:41:520875デフォルトの名無しさん
2007/02/02(金) 10:35:440876デフォルトの名無しさん
2007/02/02(金) 10:47:47プログラムだけやってりゃわからんが・・・
0877デフォルトの名無しさん
2007/02/02(金) 11:05:300878デフォルトの名無しさん
2007/02/02(金) 11:46:59オナヌーだけやってりゃわからんが・・・
0879デフォルトの名無しさん
2007/02/02(金) 14:19:041
12
123
1234
12345
123456
1234567
12345678
123456789
と表示されるにはどうしたらいいですか
#include <stdio.h>
void main( void )
{
int i,j
こっからお願いします
0880デフォルトの名無しさん
2007/02/02(金) 14:28:01for(i = 1;i <= 9;i++){
for(j = 1;j <= i;j++){
printf("%d", j);
}
printf("\n");
}
0881879
2007/02/02(金) 14:35:25つまらないものですがどうぞ
http://www2.j-phone.coco.jp/l-mmf-l/21003.mmf
http://www2.j-phone.coco.jp/l-mmf-l/21002.mmf
0882デフォルトの名無しさん
2007/02/02(金) 15:24:49http://pc10.2ch.net/test/read.cgi/prog/1169812216/
0883デフォルトの名無しさん
2007/02/02(金) 18:08:10もし可能ならば解説してるサイトのようなものも教えてもらえれば嬉しいです
0884デフォルトの名無しさん
2007/02/02(金) 18:15:260885デフォルトの名無しさん
2007/02/02(金) 18:33:260886デフォルトの名無しさん
2007/02/05(月) 03:37:39ハーバート・シルトの、独習Cって本から始めて見る。
・・・・・・・・・・・・
・・・・・・・・・・・・
メモ帳で test.c を製作して、コマンドプロンプトを開いて、
ソースファイルを保存したディレクトリに移動して、次のコマンドを入力します。
cl test.c
・・・・・・・・・・・・
メモ帳の方に書けってことですよね?
コマンドプロンプトの方に入力して見たら、
cl : fatal error C1083: ソース ファイルを開けません。
とか出てきたけど・・・。 なんだろ?
この本判りにくいのか?
0887デフォルトの名無しさん
2007/02/05(月) 03:48:27ソースのディレクトリに移動してないとか
test.c.txtになってるとか。
0888デフォルトの名無しさん
2007/02/05(月) 04:34:44って説明だけじゃあ、どうも判りにくいんですけど・・・、
それはどうすればいいんでしょう?
やっぱ、以外にカンタンな事なんですかね?
0889デフォルトの名無しさん
2007/02/05(月) 04:39:16まず、おまいはコマンドプロンプトの扱い方を勉強したほうがいい
0890デフォルトの名無しさん
2007/02/05(月) 04:40:58とりあえず今日はもう寝ろ
0891デフォルトの名無しさん
2007/02/05(月) 05:05:20と足蹴にするのもなんなので、windows限定でひとつ。
スタートメニューのアクセサリの中のコマンドプロンプトをソースファイルを保存したフォルダにコピーする。
コピーしたやつを右クリックしてプロパティを選択して開くと作業フォルダの項目に
%HOMEDRIVE%%HOMEPATH%
と書いてある(ハズ)。これを
%CURRENTDIR%
に書き変える。「OK」をクリックして閉じる。
それをダブルクリックするとコマンドプロンプトのカレントディレクトリが
ソースファイルのフォルダに最初からなっているので移動する手間が省けて便利。
0892デフォルトの名無しさん
2007/02/05(月) 17:06:38みつけて出力するにはどうすれば良いのでしょうか?
以下では、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);
0893デフォルトの名無しさん
2007/02/05(月) 17:11:14統合開発環境もってるんでしょ
そっち使ったらいいじゃん
0894デフォルトの名無しさん
2007/02/05(月) 17:12:000895デフォルトの名無しさん
2007/02/05(月) 17:58:36ありがとうございます全然気が付かなかった
if(0 == memcmp(str+i, word, 1)) {
にしたら3が出力されました!
forとmemcmpを使った泥臭いやり方以外にないですよね・・?
0896デフォルトの名無しさん
2007/02/05(月) 18:05:03strstrは?
0897デフォルトの名無しさん
2007/02/05(月) 18:31:27memcmpの第三パラメーターは2ですね!
strstrは「の」のポインタが帰ってくるんでだめでした
0898デフォルトの名無しさん
2007/02/05(月) 18:38:09「の」のポインタ - strのポインタ = 君の求める答えではないのかね?
0899デフォルトの名無しさん
2007/02/05(月) 19:16:45ポインタの引き算の結果を%dで出力したら3になりました
ポインタ同士の演算は思いつきませんでした
目から鱗です
0900デフォルトの名無しさん
2007/02/06(火) 00:01:36試行錯誤の結果、以下のソースで期待通りの結果が得られたのですが、疑問があります。
なぜ、関数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;
}
0901デフォルトの名無しさん
2007/02/06(火) 00:08:58なんぜまた一旦char*で受けるのかは解らんが。
0902デフォルトの名無しさん
2007/02/06(火) 00:23:44それコンパイル通るの?
一応書き直したけど、質問以前に、まだ勉強不足すぎる。
#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;
}
0904デフォルトの名無しさん
2007/02/06(火) 01:40:53一度、アセンブラとかマシン語の世界に逝ってくると理解しやすいと思う。
0905デフォルトの名無しさん
2007/02/06(火) 06:51:470906デフォルトの名無しさん
2007/02/06(火) 13:55:31コンパイル・リンクで問題なく通っていても、
DOS窓で実行中に特定部分にくると強制終了されてしまいます。
こういうのは、やはりその特定部分のソースがよくないのでしょうか?
それと、強制終了は結構よくあることなのでしょうか?
コンパイラはBCC++です。
0907デフォルトの名無しさん
2007/02/06(火) 14:35:54コンパイルできてもバグがないわけではない
0908デフォルトの名無しさん
2007/02/06(火) 14:58:5412行目で警告が出ています、できたa.outを実行すると一見期待通りの結果が出力されました・・。
>>902で示されたソースについてなのですが、関数bの呼び出し側の引数が&rbではなくrbの理由は、
「rbがB型の構造体へのポインタのため、呼ばれた関数bの中でrbの値を変えることができるから」
の考え方をすればよいのですね。
これとは別に質問がまた出てきました・・次レスに書きます
0909デフォルトの名無しさん
2007/02/06(火) 15:06:34B型構造体のメンバー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さんのソースを拝借して変更しました)
0910デフォルトの名無しさん
2007/02/06(火) 15:18:46どうもです、色々考えながらバグ取りしてみようと思います。
0911デフォルトの名無しさん
2007/02/06(火) 17:59:06fprintf(foutfile,"%f\n",a);
小数6位までしか出力されないのですが、小数第10位、有効な桁まで
出力するにはどのように書けばいいのでしょうか?
0912デフォルトの名無しさん
2007/02/06(火) 18:26:580913デフォルトの名無しさん
2007/02/06(火) 19:11:28http://www.uploda.org/uporg682980.cpp.html
http://www.uploda.org/uporg682990.txt.html
環境 XP Borland c++
コンパイルはできているのですが、答えが正しくないのでご指南をお願いしたいです
最大得点がおかしいのでそこを直したいのと、最大得点のルートを求めるのもまだ未完成なので
そこもできたらお願いしたいです
プログラムは縦シューの制限がついたものと考えてください、制限として
�@自機、敵機とも弾は打たず体当たりでのみ倒すことができる。
�A自機の移動はx軸のみ、敵機の移動はy軸のみ(敵は直線に落ちてくる)
日本語下手ですみません><分からないことあったら聞いてください
0914デフォルトの名無しさん
2007/02/06(火) 20:43:04×totalscore = score[po][i];
○totalscore += score[po][i];
ここ?
0915913
2007/02/06(火) 21:00:54正しくは5にならないといけないんですけど(このプログラムでは2になってしまいます)
0916デフォルトの名無しさん
2007/02/06(火) 21:31:43とかインデクスがなぜか1からとか意味がわかりません
0917デフォルトの名無しさん
2007/02/06(火) 21:40:250918デフォルトの名無しさん
2007/02/06(火) 21:47:15単純ミスだと思うけどな。
5に成るはずの計算は、1点が5回?
0919デフォルトの名無しさん
2007/02/06(火) 22:19:00自機が高度変わらずにx軸移動のみ
敵は x:5 y:5 ポイントに高度1-5に積み重なってたら
最高ポイントは1になるはずじゃねーの?
0920デフォルトの名無しさん
2007/02/07(水) 03:17:27コンパイル通るのに強制終了ってことは
アドレス関連で躓いてる可能性が
文字列、配列、メモリ確保、ポインタ等
0921デフォルトの名無しさん
2007/02/07(水) 03:34:270922913
2007/02/07(水) 15:55:19>>917 変数名付け足しながらやってたらめちゃくちゃになってしまいました、見苦しくてすみません><
>>919 2次元じゃなくて3次元でした(自機はx,y平面を自由に動く、敵機はz軸方向に降りてくる)
です
上の入力だと途中経過で3点までは普通に出て、3番目に入力された点から見たときに得点が4にならずに2点になっています
このあたりと思うんですが、私の知識ではどこを改善すれば直るのかいまだ見つけきりません
また気づいた点在ったらご教授お願いします
0923デフォルトの名無しさん
2007/02/07(水) 16:30:45まさしくそれでした、ポッ抜けることが結構あります。
>>921
悲しいかな、これも経験済みです。
なので、今はポインタ関連徹底させるのと、更に打つのに慣れるために、
ポインタを色々含んでるのを考えながら黙々と打ち込んでます。
0924デフォルトの名無しさん
2007/02/07(水) 16:35:44デバッガや変数の内容を実行時に表示して
何がおきてるのか調べるのも重要だよ。
今後、大規模なプログラミングで不可解なバグにあったときは
ソース見るよりデバッグのやり方がものを言う、場合もある。
0925デフォルトの名無しさん
2007/02/07(水) 16:49:28助言どうもです。
そういえば、変数の内容を逐一表示はさせてませんでした。
ずっとソースと格闘してたので、これは是非やってみようと思います。
実は統合開発環境?とデバッガを入れたのが昨日なので、
デバッグのやり方はまだ全然分かってません。
なので、こっちも並行して覚えていきたいと思います。
0926デフォルトの名無しさん
2007/02/07(水) 17:02:13古典的なところではprintfデバック。
点数加算ルーチンの変数を適宜表示させてみたら?
0927マイコン
2007/02/08(木) 11:10:40点灯と消灯を繰り返して明度を減少させるには、具体的にどうしたらいいですか?
デューティー比10%
とか書いてました。
0928デフォルトの名無しさん
2007/02/08(木) 14:13:140929デフォルトの名無しさん
2007/02/08(木) 15:20:07一人でやる分にはいらないかもな
0930デフォルトの名無しさん
2007/02/08(木) 16:39:02今一人なんで書かないことにします
複数でやるときって、どこに書けばいいんでしょうか??
プロトタイプ用のファイル作って、各ソースの頭でインクルードする感じ??
実際に業務でやってるやり方とか知りたいです
0931デフォルトの名無しさん
2007/02/08(木) 16:51:02プロトタイプと同じ効果が得られる。
func2()
{
}
func1()
{
func2();
}
main()
{
func1();
}
(最近Cで書いてないから忘れたけど、プロトタイプ無しだと、警告でない?)
0932デフォルトの名無しさん
2007/02/08(木) 18:42:16ありがとう
プロトタイプ書いてないけど警告でないです・・
1関数1ファイルにしてるからかなあ
よくわからないけど、
prototype.hに
int a(int, int);
int b(char *, char *);
って書いて各関数で#include "prototype.h"
ってやるのがいいのかなー
0933デフォルトの名無しさん
2007/02/08(木) 18:55:050934デフォルトの名無しさん
2007/02/08(木) 20:37:25for分で列数の5回回したい場合、forのxxxの部分にどうかくのがスマートですか?
sizeofもstrlenも試したけどうまくいきません
for (i = 0; i < xxx; i++)
0935デフォルトの名無しさん
2007/02/08(木) 20:40:070936デフォルトの名無しさん
2007/02/08(木) 20:47:03即レスthx
sample_max = 5
for (i = 0; i < sample_max; i++)って感じですね
0937デフォルトの名無しさん
2007/02/08(木) 20:52:41これでいけないの?
0938デフォルトの名無しさん
2007/02/08(木) 21:31:56どうもです
今日は帰っちゃったんで明日試してみますね
0939デフォルトの名無しさん
2007/02/08(木) 22:55:400940デフォルトの名無しさん
2007/02/08(木) 23:23:38int型の一次元配列を関数に参照渡しをしたいのですが上手くいきません
どうすればいいかご教授お願いいたします
0941デフォルトの名無しさん
2007/02/08(木) 23:32:41普通にポインタで渡せば?
0942デフォルトの名無しさん
2007/02/08(木) 23:42:38こんな感じですか?
sub(int *ary);
main(){
int ary[10]={0,1,2,3,4,5,6,7,8,9};
sub(ary);
}
0943デフォルトの名無しさん
2007/02/09(金) 09:59:26でもいいけどな
0944デフォルトの名無しさん
2007/02/09(金) 10:36:280945デフォルトの名無しさん
2007/02/09(金) 12:19:390946デフォルトの名無しさん
2007/02/09(金) 12:20:200947デフォルトの名無しさん
2007/02/09(金) 12:30:14てか普通に関数プロトタイプの中のパラメータリストにint型の配列を入れておけばいいんじゃね?
void sub(int []);
main(){
int ary[10]={0,1,2,3,4,5,6,7,8,9};
sub(ary);
}
0948デフォルトの名無しさん
2007/02/09(金) 12:33:25それは関数に渡すとは言わないんじゃ?
>946
どうやって?
0949デフォルトの名無しさん
2007/02/09(金) 12:41:090950デフォルトの名無しさん
2007/02/09(金) 12:42:150951デフォルトの名無しさん
2007/02/09(金) 12:42:230952デフォルトの名無しさん
2007/02/09(金) 12:42:26添え字付きの配列を引き数にする
0953デフォルトの名無しさん
2007/02/09(金) 12:44:240954デフォルトの名無しさん
2007/02/09(金) 12:48:40添え字付いてても参照渡しでしょ?
0955デフォルトの名無しさん
2007/02/09(金) 12:49:28>>942-943のどちらの方法でも渡されてるものは同じだから問題なく動くんじゃ
いい加減スレ違ってきそうだが
>>952
sub(array[0], array[1], array[2], ...);
main内部とかでこうやって呼び出すってこと?
不可能ではないが、一体なんの意味があるのかと。
特定の要素を渡すのなら問題無いと思うけど
0956デフォルトの名無しさん
2007/02/09(金) 12:52:14あくまで可能性を言ったまでで
そこまでマジレスされても困る
0957デフォルトの名無しさん
2007/02/09(金) 12:57:31( д) ゚ ゜ >>956
↑
めろこ
0958デフォルトの名無しさん
2007/02/09(金) 13:09:48配列全体か配列要素を渡すかケースバイケースだけど意味はあるはず
例えば
・値呼び出しで配列要素を渡した場合、呼び出された関数が元の配列の値を変更できない
・大きな配列全体を頻繁に渡すと実行速度に差がでる
とか
0959デフォルトの名無しさん
2007/02/09(金) 15:46:14いや、だからCでは配列を(そのまま)値渡しする手段がないんだってばさ。
0960デフォルトの名無しさん
2007/02/09(金) 16:25:37どう書けばいいのでしょうか?
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);
}
0961デフォルトの名無しさん
2007/02/09(金) 16:32:57>aかつbで昇順
ここを詳しく。
例えばaを主キーに、bを副キーにするならこうなる。
int foo = strcmp(s1->a, s2->a);
if (foo < 0 || foo > 0) return foo;
return strcmp(s1->b, s2->b);
0962デフォルトの名無しさん
2007/02/09(金) 16:41:41そういうことです!なるほどわかりました
qsort二回呼ぶ必要無かったんですね・・
0963デフォルトの名無しさん
2007/02/09(金) 17:52:38逆に、qsort()は非安定なソートで実装されている可能性が高いから二度呼んじゃいけません。
#安定なソートなら副キーでソートしてから主キーでソートすればできるけど。
0964デフォルトの名無しさん
2007/02/09(金) 18:33:21構造体なら値渡しできるということでは駄目か。
0965デフォルトの名無しさん
2007/02/09(金) 18:56:01早速質問なのですが、Visual C++ 6.0で
#define max 30;
struct _test
{
int a;
int b;
int c;
}test[max];
とやると
構文エラー : ']' が ';' の前に必要です。
構文エラー : ';' が ']' の前に必要です。
と出てしまいます。
こう言う[]の使い方は出来ないのですか?
0966デフォルトの名無しさん
2007/02/09(金) 18:59:00~~~~
すなわち
struct _test test[30;];
0967デフォルトの名無しさん
2007/02/09(金) 19:33:00ありがとうございました。解決しました。
#defineは;はいらないんですね…。
0968デフォルトの名無しさん
2007/02/09(金) 19:54:580969デフォルトの名無しさん
2007/02/09(金) 20:18:29#define max 30;
セミコロン要らない
0970デフォルトの名無しさん
2007/02/09(金) 20:31:34ワロタ
0971デフォルトの名無しさん
2007/02/10(土) 15:55:16ソース見て、ん?となり、これってコンピュータは処理が高速だから、
リアルタイムに動いているように見えているだけなんでしょうか?
だとすると普通のCで同時に処理する事はできないんでしょうか?
0972デフォルトの名無しさん
2007/02/10(土) 16:10:000973デフォルトの名無しさん
2007/02/10(土) 17:47:03どんなコードか判らないが…
「高速に動いている」ことと
「同時に動いている」ことは
直接の関連性は無い。
そのコードが出力(描画含む)結果の反映を
即時(or自動)でやってるならば「高速で処理しているから同時に見える」。
逆に、反映を一度にするよう制御しているなら
「コード上は、本当に同時に動いている」。
0974デフォルトの名無しさん
2007/02/10(土) 17:57:23リアルタイムは同時である必要はないし
処理には時間がかかるはずなので完全な同時ということはありえない。
遅れた情報を捨てて最新の情報を常に表示するのがリアルタイム。
操作すると瞬時にモグラを叩いている画像に変わるということか?
昔に比べると画像の作成して表示する処理はとてもなく速くなったね。
十数年前のパソコンだと作成に少し待たされ
しかも描画している様子まで見えたが
今はパソコンで動画を見ることが余裕に出来るくらいの性能になった。
0975デフォルトの名無しさん
2007/02/10(土) 18:01:05同時に処理とはマルチスレッドのことを言ってるんではないかとエスパー
0976デフォルトの名無しさん
2007/02/10(土) 23:59:21レスありがとう&分かり辛くてすみませぬ
確かfor(;;)ループ内で何個かループ処理がありました
マルチスレッドはまだ分かりません
もぐらたたきのソースを見たのはこのhpです
ttp://www.geocities.co.jp/SiliconValley-Bay/7437/index.html
0977デフォルトの名無しさん
2007/02/11(日) 08:38:45そのサイトは参考にしてはいけません。
もしブックマークしてるなら速やかに削除してください。
0978デフォルトの名無しさん
2007/02/11(日) 10:26:310979デフォルトの名無しさん
2007/02/11(日) 10:47:52http://pc10.2ch.net/test/read.cgi/tech/1170064980/501-
0980デフォルトの名無しさん
2007/02/11(日) 12:24:39これまでも、そしてこれからも。
それは誰にも止められない。
願わくば犠牲者の魂の安らかならんことを。
0981デフォルトの名無しさん
2007/02/11(日) 12:30:130982デフォルトの名無しさん
2007/02/11(日) 12:49:43ここは大丈夫ですか??
0983デフォルトの名無しさん
2007/02/19(月) 20:45:300984デフォルトの名無しさん
2007/02/20(火) 14:32:51class TestA {
char c;
int i;
double d;
};
class TestB {
int i;
double d;
char c;
};
というクラスは並びかたが違うだけだが、オブジェクトのサイズが異なる。(アライメントが8以上の場合。)
テスト(実行)する環境がないからサイズがどう違うのかも判りません。
テストAとBのサイズ(バイト数)はどうなっているのでしょうか?
0985デフォルトの名無しさん
2007/02/20(火) 14:45:44Bが24バイト
0986デフォルトの名無しさん
2007/02/20(火) 14:59:24成る程。変数宣言の時に今までのバイト数(char2つ、int1つ)に組み合わせられない(doubleやint)場合、
以前のサイズは余白を使って8バイトとするといったイメージで宜しいのでしょうか?
Aは
char,int 1+4+余白3バイト
double 8バイト 合計16バイト
Bは
char 1+余白7バイト
double 8バイト
int 4+余白4バイト 合計24バイト
即レス有難う御座いました。
0987デフォルトの名無しさん
2007/02/20(火) 15:09:35┌───────────────┐
│ 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
└─┴─────────────┘
0988デフォルトの名無しさん
2007/02/20(火) 19:19:570989デフォルトの名無しさん
2007/02/20(火) 19:36:01随分と狭い見識をお持ちのようで。
0990デフォルトの名無しさん
2007/02/20(火) 20:10:14ん?なんで?
0991デフォルトの名無しさん
2007/02/20(火) 21:59:25抽象論で批判するなんて随分と矮小な知性をお持ちのようで。
0992デフォルトの名無しさん
2007/02/20(火) 22:07:040993デフォルトの名無しさん
2007/02/20(火) 23:34:280994デフォルトの名無しさん
2007/02/20(火) 23:37:42http://pc10.2ch.net/test/read.cgi/tech/1153542424/
0995デフォルトの名無しさん
2007/02/21(水) 13:16:210996デフォルトの名無しさん
2007/02/21(水) 14:18:44C言語なら俺に聞け(入門篇) Part 8
http://pc10.2ch.net/test/read.cgi/tech/1171946674/l50
0997デフォルトの名無しさん
2007/02/21(水) 23:12:250998デフォルトの名無しさん
2007/02/21(水) 23:41:390999デフォルトの名無しさん
2007/02/22(木) 04:51:391000デフォルトの名無しさん
2007/02/22(木) 05:23:2010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。