くだすれC言語(初心者用)

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレッドはC言語について、 
他のスレッドでは書き込めない超低レベル、 
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 
C使いが優しくコメントを返しますが、 
お礼はC言語の布教と初心者の救済をお願いします。 
21:2006/07/22(土) 13:28:09
超をつけるの忘れたorz
死ね
4デフォルトの名無しさん:2006/07/22(土) 14:09:55
#include "stdio.h"
#include "stdio"
#include "cstdio"
の違いを教えてください
5デフォルトの名無しさん:2006/07/22(土) 14:46:20
>>4

namespace でぐぐってみれば?
6デフォルトの名無しさん:2006/07/22(土) 14:47:39
C++を使わない限り、stdio.hでOK
あと<>な
7デフォルトの名無しさん:2006/07/22(土) 14:49:30
#include "stdio.h"

#include <stdio.h>
の違いを教えてください。
8デフォルトの名無しさん:2006/07/22(土) 14:50:43
小数点の切り捨てはintでいいの?
floorの存在意義を教えてください
9デフォルトの名無しさん:2006/07/22(土) 14:51:41
>>7>>8
まずは名乗ろうな
10デフォルトの名無しさん:2006/07/22(土) 14:52:22
長瀬智也です。
11デフォルトの名無しさん:2006/07/22(土) 15:05:34
長瀬さんこんにちは。cstdioはC++を将来使おうと思っている場合は、これを使っておくと良いでしょう。
12デフォルトの名無しさん:2006/07/22(土) 16:56:08
>>6
>あと<>な

ぷぷぷー
13デフォルトの名無しさん:2006/07/22(土) 18:44:34
>>7
自分でstdio.hというヘッダーを作ったとき、
"stdio.h"だとその自分のヘッダーが読み込まれる。
<stdio.h>だと標準のヘッダーが読み込まれる。
14デフォルトの名無しさん:2006/07/22(土) 18:57:51
>>8
int型へのキャストでは、小数点部分を単純に捨てるだけ。
floorは、引数の値を超えない最大の整数を返すと定義されており、
負の数のとき、たとえばfloor(-2.5)は-3.0を返す。(int)-2.5では-2になる。

また、結果の値がintで表現できないほど大きかったり小さかったりすることを
想定しなければならない場合ということもある。
15デフォルトの名無しさん:2006/07/24(月) 01:39:19
質の良い乱数の生成方法を教えてください
16デフォルトの名無しさん:2006/07/24(月) 01:53:22
メルセンヌツイスター
17デフォルトの名無しさん:2006/07/24(月) 06:00:28
四捨五入は
int(x+0.5)
で良いのでしょうか?
18デフォルトの名無しさん:2006/07/24(月) 07:46:50
TT800
19デフォルトの名無しさん:2006/07/24(月) 09:24:37
>>17
正のときだけを考えるのであればそれでよい。
20デフォルトの名無しさん:2006/07/25(火) 15:47:06
こうじゃないの?
(int)(x+0.5)
21デフォルトの名無しさん:2006/07/25(火) 15:54:00
このスレ的には>>20じゃないとまずいね。
C++なら>>17でもOKだけど。
22デフォルトの名無しさん:2006/07/25(火) 17:17:08
でもC++だったらstatic_cast使えと言われるので、
結局17の書き方は使われないと。
23デフォルトの名無しさん:2006/07/25(火) 18:45:08
>>22
関数スタイルのキャストは普通に使うだろ。
しかも組み込み型への関数スタイルのキャストは
static_castと同等だと保障されている。
24デフォルトの名無しさん:2006/07/25(火) 18:51:17
>>23
組み込み方へのキャストこそstatic_castなどを使えばすむから関数スタイルのキャストは要らない。
むしろコンストラクタ呼び出しになるのでクラスに対して使う方がよっぽど多い。

あと、組み込み型への関数スタイルキャストは、static_castと同等ではなく、Cスタイルキャストと同等。
static/const/reinterpret_cast全てを兼ねる。


25デフォルトの名無しさん:2006/07/25(火) 18:52:51
うむ、まぁなんだ
ここはC言語スレだということを忘れないでくれよ
26デフォルトの名無しさん:2006/07/25(火) 19:42:49
>>24
もちつけ。前半は組み込み型について言及したつもりはないぞ。
後半に関しては規格を詳細に読むかTC++PLを読んでくれ。
27C言語超初心者:2006/07/26(水) 17:19:35
ax^2+bx+c=0
のa,b,cを任意に入力したときのxの解を求めるプログラムを作りたいんです。
誰か教えてくれませんか?
ちなみに虚数解iが出る場合にも分けなきゃいけません。
28デフォルトの名無しさん:2006/07/26(水) 17:36:24
マルチ乙
29デフォルトの名無しさん:2006/07/26(水) 18:23:36
>>27
ニュートン砲(重力場を瞬間的に反転させることで膨大なエネルギー量を以て物体を放出する兵器)
30デフォルトの名無しさん:2006/07/27(木) 00:28:19
>>27
ニュートン峰(南米最高峰アコンカグアのポーランド氷河ルート第3キャンプとして人気が高い)
31デフォルトの名無しさん:2006/07/27(木) 22:43:46
下記に定義された関数を使い配列stack[]に任意の整数を5こ連続して
積み上げなさい。次に、それらすべてを読み出し、それらををprintf()
で表示しなさい。以上のプログラムを main()関数に記述し完成させなさい。
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

#define poland
#define N 100
int stack[N];
int n;
void init(){
n = 0;
}
void push(int x){
stack[n++]=x;
}
int pop(){
return stack[--n];
}
int main(){
   ここにプログラムを記述すること
return 0;
これがよく分かりません><教えてください・・
32デフォルトの名無しさん:2006/07/27(木) 22:48:28
宿題は宿題スレへ
33デフォルトの名無しさん:2006/07/27(木) 23:22:38
宿題スレは答えを聞く(教える)ところ。
>>31 は自分で理解したいんじゃないか?
34デフォルトの名無しさん: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();
35デフォルトの名無しさん:2006/07/27(木) 23:41:40
init()わすれたぜorz
36ど素人:2006/07/28(金) 02:10:04
前期の追試です。この2問に単位がかかっています。ぜひ、お願いします。
2.通常プログラムカウンタはプログラムの実行にしたがって一定の大きさだけ増えていく.
しかし,時に,プログラムカウンタに直前の値とは大きく異なる値がセットされる
時がある.それはどんな時か?

3.次のプログラムは何を行うプログラムか.簡単に説明しなさい.また,
結果を得るまでに,A[k]==aの比較が行われた回数を書きなさい.

A=new Array(3, 8, 19, 20, 22, 24, 45);
i=0;
j=A.length-1;
a=19;
k=Math.floor((i+j)/2);
while(i<=j){
if(A[k] == a){
break;
}
else if(A[k] > a){
j = k - 1;
}
else{
i = k + 1;
}
k = Math.floor((i+j)/2);
}
if(i>j) k=-1;
document.write(a," ",k);
37デフォルトの名無しさん:2006/07/28(金) 02:13:09
すげぇな、スレ違い(いや、鼬害か)の上にマルチかよ。
38デフォルトの名無しさん:2006/07/28(金) 08:48:59
何のために単位って概念があるか考えてみたらいいんじゃないかな
40デフォルトの名無しさん:2006/08/20(日) 16:15:27
 memset(dat64, 0, sizeof(dat64));
これはどういう役目をしているかわかりません。
誰か教えて下さい。
41デフォルトの名無しさん:2006/08/20(日) 16:21:32
多分意味ないから消してみたら?
42デフォルトの名無しさん:2006/08/20(日) 17:41:51
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define CATE_NUM 10
#define DATA_DIR "/xxx/yyy/zzz/Data/Img"

void normal(unsigned char *,short);

short hyojun[CATE_NUM][64][64];
unsigned char in_dat[CATE_NUM][200][512];
unsigned char dat64[CATE_NUM][200][64][64];
char *moji[]={"あ","い","う","え","お","か",
"が","き","ぎ","く","ぐ","け",
"げ","こ","ご","さ","ざ","し",
"じ","す","ず"};


43デフォルトの名無しさん:2006/08/20(日) 17:42:54
void InputData()
{
FILE *fp;
int c_no;
char fn[256];

for(c_no=0;c_no<CATE_NUM;c_no++) {
int dat_no;

sprintf(fn,"%s/%02d.bimg",DATA_DIR,c_no);
fprintf(stderr,"read %s ",fn);
fp=fopen(fn,"rb");
if(fp==NULL) {
fprintf(stderr,"open error %s\n",fn);
exit(1);
}
if(fread(in_dat[c_no],sizeof(in_dat[c_no]),1,fp)!=1) {
fprintf(stderr,"read error %s\n",fn);
fclose(fp);
exit(1);
}
fclose(fp);
fprintf(stderr,"done\n");
}
}
44デフォルトの名無しさん:2006/08/20(日) 17:55:40
void OutputData()
{
FILE *fp;
int c_no;
char fn[256];

for(c_no=0;c_no<CATE_NUM;c_no++) {
int dat_no;

sprintf(fn,"%s/%02d.bimg",DATA_DIR,c_no);
fprintf(stderr,"read %s ",fn);
fp=fopen(fn,"rb");
if(fp==NULL) {
fprintf(stderr,"open error %s\n",fn);
exit(1);
}
if(fread(in_dat[c_no],sizeof(in_dat[c_no]),1,fp)!=1) {
fprintf(stderr,"read error %s\n",fn);
fclose(fp);
exit(1);
}
fclose(fp);
fprintf(stderr,"done\n");
}
}
45デフォルトの名無しさん:2006/08/22(火) 23:09:23
 積分について以下の内容がなぜ成立するのか誰か教えて下さい。
 現在以下の内容をC言語で書こうとしています。
 
∬(x-α)i乗(y-β)j乗f(x,y)dxdy=Mijと記述されます。
ここでα,βは位置の正規化において決まります。
そしてこの値を用い、
大きさの正規化基準:M40+M04=1,傾きの正規化基準:M22=1
と設定するのが標準的な手法であります。
最後にこれについては重心周りのモーメントが必要です。
46デフォルトの名無しさん:2006/08/23(水) 02:52:59
To6464()は、あるファイルを読み込んだデータのビット操作をして文字画像
に変換している。64x64[pixel]である。
このプログラムについてどのような動作をしている誰か教えて下さい。
お願いします。
void To6464() {
071: int x,y;
072: int c_no,dat_no;
073:
074: memset(dat64,0,sizeof(dat64));
075:
076: for(c_no=0;c_no<CATE_NUM;c_no++) {
077: for(dat_no=0;dat_no<200;dat_no++) {
078: for(y=0;y<64;y++) {
079: for(x=0;x<8;x++) {
080: int i;
081: unsigned char dat8=in_dat[c_no][dat_no][y*8+x];
082: for(i=0;i<8;i++) {
083: if( (dat8&(128>>i))>0)
084: dat64[c_no][dat_no][y][x*8+i]=1;
085: }
086: }
087: }
088:
089: /*PrintDat64((unsigned char *)dat64[c_no][dat_no]);*/
090: }
091: }
092: }
4741:2006/08/23(水) 03:48:22
>>40 >>41 >>46
memset() は意味があったのか、残念。
083,084 を
dat64[c_no][dat_no][y][x*8+i]=(dat8&(128>>i))>0;
に変えると memset() はいらないぞ。そして質問には答えない。
48デフォルトの名無しさん:2006/08/23(水) 22:55:19
 質問を答えて下さい。
お願いします。
49デフォルトの名無しさん:2006/08/23(水) 23:14:38
しょうがねえなあ。
あるファイルを読み込んだデータのビット操作をして文字画像に変換している。
かなり無駄っぽい処理だ。
50デフォルトの名無しさん:2006/08/23(水) 23:25:33
 では、なくて45です。
誤解を招くような書き方をしてしまいすみません。
51デフォルトの名無しさん:2006/08/23(水) 23:30:56
おれは微積とか忘れたから答えられないぞ。覚えてたかどうかすら忘れた。
52デフォルトの名無しさん:2006/08/24(木) 00:08:11
 C言語って半年あれば覚えられるもんなんですか?
53デフォルトの名無しさん:2006/08/24(木) 02:23:52
人による。
あと、字下げを適当に使うな。
54デフォルトの名無しさん:2006/08/28(月) 15:27:23
32Byte以下の文字データの集合で、40種別に分けられて種別毎の処理をする場合、
TCHAR MojiData[40][200][32] のような配列を作ると思うんですが、

種別毎の文字データの個数がバラバラで、
最高が198個なのに、殆んどは10個や20個程度という場合、
配列で確保したメモリ領域の殆んどは無駄になってしまうと思います。

領域の無駄は無くして、配列みたいに種別ごとの処理をfor文とかで一括処理したい場合、
どんな方法が一般的なんでしょうか。教えてください。
55デフォルトの名無しさん:2006/08/28(月) 16:49:03
>>54
こんな感じでどうでしょ。
char **MojiData[40];
for (int ic = 0; ic < 40; ++ic) {
MojiData[ic] = malloc(sizeof(char *) * stringCount);
for (int sc = 0; sc < stringCount; ++sc) {
MojiData[ic][sc] = malloc(32);
}
}
実際には、ファイルか何かから読み込むのかな?
56デフォルトの名無しさん:2006/08/28(月) 21:40:14
数値を入力して、0からその数値までを一つずつカウントしていって
偶数部分には○、奇数部分には□を表示する
例えば5と入力した場合、012345→「○□○□○□」と表示。


この程度の問題すら分からない超初心者なんだぜ?
while文を使うとか言われたけど独学じゃさっぱりだぜ
57デフォルトの名無しさん:2006/08/28(月) 22:07:39
がむばれだぜ?
58デフォルトの名無しさん:2006/08/28(月) 22:13:04
交互に表示とかもう異次元なんだぜ?
それに宿題スレに出すには次元が低すぎる問題だからガチで困る。
59物好きな人:2006/08/28(月) 23:30:22
>>58
 臆することはない。宿題スレには、簡単な問題を解きたがる人もいる。
解く人だって初心者に近い人いるからね。次からはテンプレ書いて投げるべし。

以下、解答例(別に模範解答じゃない。ていうか私ならwhileじゃなくて
forを使うな)。
#include<stdio.h>
int main(void)
{
int num, i;
scanf("%d", &num);

i = 0;
while(i <= num) {
if ((i % 2) == 0) {//偶数のとき
printf("〇");
}
else {
printf("□");
}
i++;
}
return 0;
}
60デフォルトの名無しさん:2006/08/28(月) 23:54:48
#include <stdio.h>
int main()
{
int ic, num = 0;
scanf("%d", & num);
for (ic = 0; ic < num; ic += 2) {
printf("○□");
}
if (ic == num) {
printf("○");
}
return 0;
}
61デフォルトの名無しさん:2006/08/29(火) 12:16:18
>>55
こんなときのためのポポポインタなんですね。
ありがとうございました。
62デフォルトの名無しさん:2006/08/29(火) 12:41:15
>>61
何その楽しげな「ポポポインタ」って。
63デフォルトの名無しさん:2006/08/29(火) 14:10:10
今日からC言語を始めた21歳の大学生です。
Borland C++ Compilerというコンパイラを導入したのですが、
初期設定に悪戦苦闘を強いられて1時間もかかってしまいました。
僕にはプログラミングの才能は無いのでしょうか・・・?
来年からSEとして働くというのに先が思いやられます・・・
64デフォルトの名無しさん:2006/08/29(火) 14:27:05
お勧めorお勧めでないC言語の参考書ってありますか??
あと・・・CとC++の違いはなんですか??
651001:2006/08/29(火) 14:34:06
>>63
そんなんだと、これから先の人生が思いやられるよねー
でも、良かったじゃないか就職できて。
66デフォルトの名無しさん:2006/08/29(火) 14:47:37
プログラムができなくてもSEとして就職できる世の中が悪い。
67デフォルトの名無しさん:2006/08/29(火) 15:48:17
UNIX(FreeBSD)でforkして子プロセスがexecしたんですが、
親プロセスがwaitせずに子プロセスより先に死んだ場合、
子プロセスの親はinitになるのは判ったんですが、
子プロセスの返り値はwaitを待つために親プロセスが死亡するまで
メモリ上に残っているのでしょうか?

そうすると、親がinitになった場合の子プロセスの返り値などはメモリを食い続けるんですか?
その場合、子プロセスの死亡後のメモリ食いを回避する方法はありますか?
68デフォルトの名無しさん:2006/08/29(火) 15:48:48
ageます
69デフォルトの名無しさん:2006/08/29(火) 16:06:24
参考書・・・教えてください・・・
70デフォルトの名無しさん:2006/08/29(火) 16:45:38
参考書くらい自分で探せ
71デフォルトの名無しさん:2006/08/29(火) 17:20:07
>>67
言語の範疇を超えているので、鼬害ですね。
72デフォルトの名無しさん:2006/08/29(火) 17:54:51
>>67

「孤児プロセス」という単語でいろいろ調べるんだ
73デフォルトの名無しさん:2006/08/29(火) 23:19:28
入門(どちらか一冊)
柴田望洋か結城浩のC入門本

中級
前橋和弥「C言語 ポインタ完全制覇」

少しプログラミングができるようになったら
平林 雅英:新ANSI C言語辞典

さらにアルゴリズムやデータ構造が気になりだしたら
紀平拓男・春日信弥:プログラミングの宝箱 アルゴリズムとデータ構造
74デフォルトの名無しさん:2006/08/30(水) 00:06:25
>>65
やっぱり厳しいですよね・・・
Java言語は完璧なんですけどね。

>>66
SEはけっこう文系の人が多いんですよね。
接客が中心だからかもしれないですけどね。
75デフォルトの名無しさん:2006/08/30(水) 00:39:15
>>74
>Java言語は完璧なんですけどね。
76万年プ中年:2006/08/30(水) 00:47:10
>>6
まったくの初心者ならSEの倉薫さんの本(全2巻)をおすすめします。
柴田さんや結城さんの本はそれからのステップアップでいいとおもいます。
77デフォルトの名無しさん:2006/08/30(水) 01:35:01
>74
>Java言語は完璧なんですけどね。

ダウト。

Javaは本当にやり込むと、
多数のOpenSourceのプロダクトやその関連など、
多岐にわたる知識と、それぞれの環境構築、
そしてそれぞれを活用するコーディング能力と、
実際に要求されるスキルはかなり高度なモノになる。

これだけ情報が多いBCCの初期設定に四苦八苦しているようなレベルで
「完璧」とは笑わせてくれる。
78デフォルトの名無しさん:2006/08/30(水) 01:58:14
>多数のOpenSourceのプロダクトやその関連など
そっちに行くのもナニだな・・・
おれはJVMの実装とかの話に行くと思ってたんだが
79デフォルトの名無しさん:2006/08/30(水) 02:15:31
いや、彼は初期設定に苦労したらしいから。w
80デフォルトの名無しさん:2006/08/30(水) 06:35:15
Javaが完璧ワロス
81デフォルトの名無しさん:2006/08/30(水) 07:05:10
そう言いたい年頃なのさ。
色んなこと知れば知るほど「完璧」なんて言えなくなるのにな。
82デフォルトの名無しさん:2006/08/30(水) 08:24:07
落ち着けお前ら。>>63は自身にプログラミングの才能が
あるかないのかを聞いているだけだ。

まあ、才能なんか皆無だろうし、現時点でJavaを完璧にこなせると
思いこんでいるような奴は努力しないだろうから今後にも期待できないな。
世のため人のために転職しろ。
83デフォルトの名無しさん:2006/08/30(水) 10:43:48
俺の童貞は完璧なんだがな
84デフォルトの名無しさん:2006/08/30(水) 10:57:49
><
8563:2006/08/30(水) 11:17:52
釣りです。ごめんなさい・・・
大学で1年間Javaの勉強はしたんですけど、
教科書に載っている基礎的なプログラムしか組んでません。
JavaかCのどちらかを選択する時に友達が、
「今の時代の流れはJavaだぜ!」と言うのでJavaにしました。
先生も「今の企業はJavaを使っているところが多いから、
後々役に立つよ!CはJavaが出来るようになれば楽にマスター出来るさ!」
って言ってました。
86デフォルトの名無しさん:2006/08/30(水) 13:17:46
一番悪いのはこんな役立たずにSE内定を出した企業だ。
87デフォルトの名無しさん:2006/08/30(水) 13:18:40
88デフォルトの名無しさん:2006/08/30(水) 13:48:24
>>86
どこの企業も学歴重視ですからね。

>>87
違いますよ!
89デフォルトの名無しさん:2006/08/30(水) 13:57:04
>>85
じゃあ、Java 完璧だから C も楽にマスターできたんだね。
90デフォルトの名無しさん:2006/08/30(水) 14:06:23
実力なくて学歴で入った奴は
周囲の期待を裏切った罪でいびられて一生を終えるぞ
初期設定に戸惑ったり釣り宣言したりせずにとっとと勉強しろ
91デフォルトの名無しさん:2006/08/30(水) 21:53:24
俺もJavaつついてC→C++と移行したクチなんだが、
未だにcppに実装を書いて、hに定義だけ書くっつースタイルに慣れない。
定義と実装を同じ所に置いておかないと、
interfaceが変わったときとかめんどくさくね?
ファイル数が増えると、管理対象も増えるってことで、結構面倒だし…

別に誰にソース見せるわけでもないから、
全部hに書いて組んじゃってるけど、
これって熟練者からすると、噴飯ものだろうなぁ。
92デフォルトの名無しさん:2006/08/30(水) 23:45:32
コンパイルの単位がファイルだ、とか、いわゆるファイルスコープの変数とかいう
歴史的な理由が大きいからしょうがないだろう。

>全部hに書いて組んじゃってるけど
処理系によっては全部インライン展開されちゃうぞ
93デフォルトの名無しさん:2006/08/30(水) 23:54:21
>>91
ファイルが増えると、コンパイル時間が馬鹿にならなくなってくる。
個人レベルの規模でも、一瞬でコンパイルが終わるケースなのに数十秒かかったりとか。
94デフォルトの名無しさん:2006/09/12(火) 23:15:39
>>93
ばーか
95デフォルトの名無しさん:2006/09/13(水) 23:35:03
>>94
2週間近く経ってから何を意味のないことを……
96デフォルトの名無しさん:2006/09/14(木) 15:00:53
入門書を終えた段階くらいのレベルで、マインスイーパって作れますかね?
10*10くらいなら行けそうな気もしますが・・・
97デフォルトの名無しさん:2006/09/14(木) 15:35:21
>>96
作れる香具師は作れるし、作れない香具師はいつまでたっても作れない

>10*10くらいなら行けそうな気もしますが
10*10と20*20で何が違うのか述べよw
10*10が稼働していれば、サイズの違いがどれほどコードに影響する?
98デフォルトの名無しさん:2006/09/14(木) 15:45:32
イヤマテ、「もし右上に地雷があったら〜 もし真上に地雷が〜」を
10*10個分並べるんだと思ってるのかもしれん。
「11*10にするには、右端の1列ぶんを全部書き直さなくちゃ!
 きゃ〜〜〜たいへ〜ん」
99デフォルトの名無しさん:2006/09/14(木) 23:05:49
確かにそうですね、10*10と20*20は同じプログラムですねorz
何とか自力でやってみます
100デフォルトの名無しさん:2006/09/14(木) 23:20:15
再帰使うと楽ですよと。
101デフォルトの名無しさん:2006/09/14(木) 23:53:59
先ずは、1x1から作ってみたらどうだろう。
102デフォルトの名無しさん:2006/09/19(火) 20:27:01
数字の桁数を求める標準ライブラリってありましたっけ?
103デフォルトの名無しさん:2006/09/19(火) 22:52:58
ない希ガス。
n進数をnで割りまくる方法ですぐ作れると思う。
104102:2006/09/20(水) 00:23:44
>>103
ありがとう、無いと聞いて安心して自作した
105デフォルトの名無しさん:2006/09/20(水) 00:34:23
浮動小数点数だったらlog10などがあると言えると思う。
106デフォルトの名無しさん:2006/09/20(水) 17:55:51 BE:19410825-2BP(200)
itoaとstrlenでどうか。
107デフォルトの名無しさん:2006/09/20(水) 23:58:18
ダメすぎ
108デフォルトの名無しさん:2006/10/08(日) 11:46:19
C言語でw2kとIISで動くウェブアプリケーションを作れますか?
109デフォルトの名無しさん:2006/10/08(日) 14:07:52
たいていの言語でつくれるよ
110デフォルトの名無しさん:2006/10/09(月) 12:53:14
使用環境はCygwin+gcc+Meadow又はvimなんですが
入門書にあるとおりエスケープ文字を入力するとコンパイルエラーではじかれてしまいます。
例としては

#include <stdio.h>

int main(void)
{
pritnf("aaa\n");
printf("bbb\n");

return 0;
}
などのソースでコンパイルしようとすると

$gcc ch02-20.c
/cygdrive/d/Temp/ccckx0DW.o:ch02-20.c:(.Text+0x32): undefined reference to 'printf'
collect2: ld はステータス 1 で終了しました

とのエラーが出てしまいます。
Cの初心者なので環境が悪いのかソースが悪いのかもわかりません。
解決方法がわかりましたらよろしくお願いします。
111デフォルトの名無しさん:2006/10/09(月) 12:59:18
pritnf
  ~~
112デフォルトの名無しさん:2006/10/09(月) 13:03:34
>>111
しかし、エラーメッセージはprintfが参照できてないと読めるが。
113110:2006/10/09(月) 13:04:02
>>111
これで一晩悩んでいたうつけでございます。
どうぞ罵ってください。
本当にありがとうございました!
114デフォルトの名無しさん:2006/10/09(月) 13:08:51
>>112
ソースのコピペすら出来ていないとすればエラーメッセージの正確なコピペを期待しちゃいかんだろ。
115デフォルトの名無しさん:2006/10/12(木) 18:45:20
stdioとcstdioの違いを教えてください
116デフォルトの名無しさん:2006/10/12(木) 18:49:31
スレ違い
117117:2006/10/12(木) 21:41:39
すみません、ちょっと質問なんですが、
staicを付けて宣言した関数ってのは return 後もメモリ上に配置されたまま
残り続けるんでしょうか?

他のファイルから見えないようにしたいんですが、メモリ上に残り続けるんなら
staticは付けずに、プライベートヘッダファイル内でextern付けて宣言して、
それをincludeするのにとどめておいたほうがいいんでしょうか?

よろしくお願いします。
118デフォルトの名無しさん:2006/10/12(木) 21:55:07
関数のstaticはメモリーとは関係がない。
119デフォルトの名無しさん:2006/10/12(木) 21:57:01
ノイマン型コンピュータは普通命令はメモリにありますよ
120デフォルトの名無しさん:2006/10/12(木) 23:08:42
>>117
staticは付けずに以降のくだりは意味が良くわからないが、
おそらくグローバル変数を使うということだよな。
ならばそんな変数が存在する期間はstaticを付けた変数と同じ。
どちらもプログラム開始から終了まで存在し続ける静的記憶期間を持つ。
121デフォルトの名無しさん:2006/10/12(木) 23:16:59
>>120
> staicを付けて宣言した関数
欲嫁
122デフォルトの名無しさん:2006/10/12(木) 23:34:47
すっかり見落としていた_| ̄|○
123117:2006/10/13(金) 00:33:03
>>118
あ、そうなんですか。
気にせず使えってことですよね? たぶん。
ありがとうございます。

>>119
すみません。ちょっとよく分からないです。

>>120
すみません、はしょり過ぎて意味不明な書き方をしてしまって。

目的は、他のファイルに公開する関数と、そうでない関数とに区別を付けながら書くことです。
staticを付けた関数は、他のファイルからは見えないらしいので、これを利用しようと思いました。

でも、staticと聞くと、ついつい局所変数につけるstaticみたいに
静的領域に割り当てられて、プログラム実行中に常に値を保持するという連想をしてしまったので、
無闇に関数にstaticをつけるのもメモリの無駄遣いかなと思ったわけです。
(>>118さんによるとメモリとは関係ないらしいので杞憂ですが)

そこで、浅はかですが、他のファイルに公開しない関数のプロトタイプ宣言を、
ヘッダファイルに書いて、それをincludeするモジュールとincludeしないモジュールとで区別をつけて、
コンパイラの「暗黙の宣言エラー」を頼りに、手動で管理しようと思ったわけです。

これでは、実際には他のファイルからも呼び出せちゃいますけど、
気持ちとしては他のファイルに公開してるつもりかどうかを意識しながら書けると思ったもので・・。
長文ですみません。
124デフォルトの名無しさん:2006/10/13(金) 00:38:09
ライブラリとかだったら、公開する関数だけをヘッダファイルに書くようにすればいいと思うよ。
125デフォルトの名無しさん:2006/10/13(金) 00:45:00
staticな関数がメモリ上にあるかどうかはコンパイラ次第。
もしかしたら、インライン展開によって痕跡さえも消えてなくなっているかもしれない。

>>123
と言う話はさておき、一般に関数はプログラムがロードされている間はメモリ上に存在し続けるぞ。
つまり、staticをつけない方が寧ろメモリを消費すると言えるかもしれない。

従って、公開したくない関数にstaticをつけるのは、いろんな意味で正しい姿勢だ。
126デフォルトの名無しさん:2006/10/13(金) 02:21:22

☆☆
☆☆☆
☆☆☆☆
☆☆☆☆☆


これを再帰ってやつを使って表示させたいんです。
お願いします。
127117:2006/10/13(金) 02:27:17
>>124
最終的にはライブラリみたいなのを作りたいんですが、
そのライブラリを作るために書いているソースファイルが複数(たとえばa.c, b.c, ...)あって、
ソース間の関数の呼び出し合いが入り乱れて混乱するのを避けるため、
a.cの中には、「a.cの中の関数だけに利用させたい関数」と「b.cが呼び出す関数」もあるという状態です。
この例では、上手く伝わらないかもしれませんが・・。

>>125
極端なことを言えば、コンパイラによっては、関数を呼び出してる部分を
ジャンプとリターンの形じゃなくて、インライン展開しまくりで実現するかもしれないから
サイズが大きくなる場合もあるってことで合ってるのかな?
とにかく
>と言う話はさておき、一般に関数はプログラムがロードされている間はメモリ上に存在し続けるぞ。
>つまり、staticをつけない方が寧ろメモリを消費すると言えるかもしれない。
>従って、公開したくない関数にstaticをつけるのは、いろんな意味で正しい姿勢だ。
とのことなので、公開したくない関数にはstaticを付けていこうと思います。
丁寧な回答ありがとうございました。
128117:2006/10/13(金) 02:33:51
>ソース間の関数の呼び出し合いが入り乱れて混乱するのを避けるため
というのは、ソースを書いているうちにどのファイルにどの関数があったかとか、ファイルの管理で自分が混乱するということです。
すれ汚ししてしまって、すみません。
129デフォルトの名無しさん:2006/10/13(金) 03:14:32
ファイルの粒度が小さすぎるということはない?
a.cとb.cを特に分ける必要も無いのに分けてるとか。
複数のファイルがお互いに参照しあってるという状況になってるとしたら、それは分けすぎかも。
あるいは、a.cとb.cが参照する関数は、mylib_util.cとかにまとめて、a.cとb.cはそれをincludeするとか。
130デフォルトの名無しさん:2006/10/13(金) 05:32:59
>>126
if (n>1) func(n-1);
for ...
131デフォルトの名無しさん:2006/10/13(金) 16:57:10
>>130さん

#include <stdio.h>
#define N 5
#define I 1
void rec(int,int);

int main()
{
rec(N,I);
}

void rec(int n,int i)
{
if(i<=n){
printf("☆");
rec(n,i+1);
}
else{
printf("\n");
if(n>1){
rec(n-1,1);
}
}
}

これの逆バージョンを作りたいんです。
関数1つでforとかwhileとか使わないで
再帰だけでやるやつをお願いします。
132デフォルトの名無しさん:2006/10/14(土) 12:32:27
>>131
宿題シネ
133デフォルトの名無しさん:2006/10/15(日) 05:29:38
typedef struct original {....} a;
という記述で、自分で構造体を定義しました。
このとき
void function (original *)
という関数を作って、main関数から呼び出したのですが
function( a ) ではうまくいかず function ( &a ) ではうまくいきました。
構造体の変数名はポインタを表すと思うんですが、この場合はなぜ&が必要なのでしょうか?
134133:2006/10/15(日) 05:47:02
typedef struct original {....} a; の書き方が間違っていました…

typedef struct {....} original;
original a;

です。
135デフォルトの名無しさん:2006/10/15(日) 06:02:29
> 構造体の変数名はポインタを表すと思うんですが、

なぜそう思うのか、理由を100字以上30字未満で述べよ。
136デフォルトの名無しさん:2006/10/15(日) 09:40:35
配列と混同している予感。
137133:2006/10/15(日) 10:09:40
>>135
あっー!そこがそもそも間違いだったんですねorz

>>136
はい、その通りです…
以前、構造体の配列を扱ったときは&がいらなかったので、
配列の場合と混同してました。

どうもありがとうございました。
138デフォルトの名無しさん:2006/10/15(日) 16:23:12
ハッシュ検索って何ですか?
139デフォルトの名無しさん:2006/10/15(日) 18:35:38
複数のファイルから利用される、変更されないconstデータは
どこに、どのように書くのが普通でしょうか?
ヘッダにstaticで定義する?
どこかの.cファイルに定義して、ヘッダにextern宣言する?
140デフォルトの名無しさん:2006/10/15(日) 18:39:56 BE:89862629-2BP(204)
cのconstのリンケージってC++同じだっけ?
141デフォルトの名無しさん:2006/10/17(火) 11:46:59
ある数が2のべき乗かを調べるプログラムらしいのですが、
C言語はさっぱりなので、プログラムの意味がよくわからんです。
入力された数から、マイナス1して入力された数とビット演算すると言うことでしょうか?

bool powOFTwo(int num)
{
return !(num & (num-1));
}

教えて下さい。
142デフォルトの名無しさん:2006/10/17(火) 12:49:17
>>141
そんな感じ。

(入力した数) と (-1した数) とでANDをとって
全ビット0だったら関数の戻り値としてtrue(1)を返す
143デフォルトの名無しさん:2006/10/17(火) 21:30:40
base64エンコードする関数って標準ライブラリにある?
144141:2006/10/17(火) 22:31:38
>>142
ありがとうございます。
なぜ、それでべき乗になるのか、算数の勉強だな。
145デフォルトの名無しさん:2006/10/17(火) 22:33:58
>>144
2進数で考えれば?
146141:2006/10/18(水) 10:31:32
あはは、2進数で考えたらすぐですね。
お恥ずかしい。
147デフォルトの名無しさん:2006/10/19(木) 13:59:35
現在の時間を百分の一秒まで取得する関数教えて。
148デフォルトの名無しさん:2006/10/19(木) 15:05:35
System.currentTimeMillis()*10
149デフォルトの名無しさん:2006/10/20(金) 09:38:05
ありがとう。早速試してみるわ。
150デフォルトの名無しさん:2006/10/20(金) 12:16:27
>>148
それのどこがCなのかと……
151デフォルトの名無しさん:2006/10/20(金) 12:47:06
ではCでは?
152デフォルトの名無しさん:2006/10/20(金) 13:14:49
秒単位ならtime()でできるんだけど
153デフォルトの名無しさん:2006/10/20(金) 15:32:28
標準関数にはないので、環境ごとにマニュアルでも読んでくれ。
まぁ、gettimeofday()が使える環境は多いが。
154デフォルトの名無しさん:2006/10/20(金) 22:19:12
だらだらと長い計算をやっているプログラムのどこかでNaNが発生しているので、
signal(SIGFPE, sighandle);
を使って、その場所を調べようとしているのですが、signalが発生しません。
ためしに、
double a=1/0;
とか入れると、その場所でsignalが発生するのですが。
計算がうまくいっていない場所を調べるにはどうすればよいのでしょうか。

システムはDebian Linux, コンパイラはgcc4.1です。
155デフォルトの名無しさん:2006/10/21(土) 02:10:19
>>154
FPUが例外を出さない設定になっているとか、たまたまFPUを使わないで演算しているときに発生しているとか。
156デフォルトの名無しさん:2006/10/23(月) 22:21:05
C言語を始めようとVisual Windows for BC++をインストールしたのですが、フォルダが設定されていないらしく先に進めません
フォルダの自動検索・設定を実行しても未検索で終了になってしまいます。
これはインストール方法が悪かったのでしょうか?それともPC上にMeだからでしょうか?
できれば手動での設定の仕方か解決方法を教えてください
157デフォルトの名無しさん:2006/10/23(月) 23:56:37
ググったらちょうどいい解説が見つかった。
http://www.enri.go.jp/~fks442/K_MUSEN/bcc.htm

まあ今はBorland C++以外にも、無料のコンパイラは色々あるけどな。
158デフォルトの名無しさん:2006/10/24(火) 01:50:37
PHP, Ruby, PerlしかしらないWEBプログラマなんですが、
Cもちょっくら勉強しようかと思います。
なんか目的がないとつまらないので、作るものを決めてそれに向かってがんばろうかと思ってんだけど
Cで作れそうなものが思い浮かばないんだよね。
WEBだったらこんなサービスあったらおもしろそう =>つくろう!ってなるんだけど。
Cだと何作っていいのかわからん。
おもしろそうなものあったら教えて。

159デフォルトの名無しさん:2006/10/24(火) 02:45:52
Cよりもアセンブラやった方が速く習得できるよ。
160デフォルトの名無しさん:2006/10/24(火) 05:50:32
何が面白いと感じるかは人それぞれであり、
結局のところ自分がそれをはっきりと自覚していない限り
他人に自分のそれを求めるのは理不尽というものではないだろうか。
161デフォルトの名無しさん:2006/10/24(火) 19:46:26
普段PHPとかRubyとかPerlでやってることをCでやればいいじゃん
162デフォルトの名無しさん:2006/10/28(土) 15:23:52
char (*ptr[])[] を定義と同時に初期化するには

char str1[]="hello";
char str2[]="begin";
char str3[]="wacth";

char (*ptr[])[6]={&str1,&str2,&str3};

のようにやる以外にやりようはないですか?
163デフォルトの名無しさん:2006/10/29(日) 18:40:42
char hoge[10],foo[10];

fgets(hoge,10,stdin);
fgets(foo,10,stdin);


としたときに、最初のfgetsで半角で9文字以上入力したときに二番目のfgetsが飛ばされてしまう(というか最初の出オーバーした分を受け取って次へ行ってしまう)
のですが、どのように回避すればいいのでしょうか?
164デフォルトの名無しさん:2006/10/29(日) 19:26:36
\nまで読み捨てる。
165デフォルトの名無しさん:2006/10/29(日) 19:46:16
読み捨てする、というのはどのようにすればいいのでしょうか?
166デフォルトの名無しさん:2006/10/29(日) 19:46:20
>>162
他に何がやりたい?
167162:2006/10/29(日) 20:39:12
>>166
普通の配列と同じように事前に何かを用意しなくてもいきなり定義できないのかな、と
例えば
char str[][6]={"hello","begin","wacth"}
みたいにです

必要性無視した単なる可能不可能を知りたいだけの質問で申し訳ないんですが…
168デフォルトの名無しさん:2006/10/29(日) 21:42:46
>>167
>167のようにただの配列の配列(の配列……)なら普通に初期化できる。
>162のようにポインタが介在すると、そのポインタを初期化するために、別途初期化された変数が必要になる。
それだけのこと。
169デフォルトの名無しさん:2006/10/29(日) 21:44:28
>>165
while (fgetc(stdin) != '\n') ;
とすれば改行まで読み捨てられる。
#但し、入力が閉じられるなどの異常に対応していないので、必要なら対策すべし。
170デフォルトの名無しさん:2006/10/29(日) 21:48:25
>>167
char str[][6]={{"hello"},{"begin"},{"wacth"}};

データの境界を教えてあげるために、{} でくくるだけなんですよね。
171162:2006/10/29(日) 21:53:46
>>168,170
あ、なるほど、そこが同時では無理だったんですね
ありがとうございました
172デフォルトの名無しさん:2006/10/29(日) 22:07:20
>>169
ありがとうございます

char hoge[10],foo[10];

fgets(hoge,10,stdin);
while (fgetc(stdin) != '\n') ;
fgets(foo,10,stdin);

そこで以上のようにしてやってみたのですが、最初のfgetsで9文字以下の入力をされたとき
while (fgetc(stdin) != '\n') ;
で一度エンターをおさないと二番目のfgetsに進まなくなったのですが、使い方間違ってるのでしょうか・・?
173デフォルトの名無しさん:2006/10/29(日) 22:15:42
>>172
読み捨てる必要がないときには読み捨てるな。
174デフォルトの名無しさん:2006/10/29(日) 22:32:55
>>173
strlenあたりで判定するんでしょうか
やってみます、ありがとうございました
175デフォルトの名無しさん:2006/10/30(月) 07:11:03
つーか、最後に改行がなければ読み捨てる必要があって、
最後に改行があれば読み捨てる必要がないのだろう。
176デフォルトの名無しさん:2006/11/01(水) 20:19:52
大域ヘッダーファイルの〜〜.hと7つの原始ファイル〜.cを動かすにはどうすればいいですか?
177デフォルトの名無しさん:2006/11/02(木) 01:30:35
変数の種類で、ポインタ以外のもの全般の事は一般的になんと呼ばれますか?
178デフォルトの名無しさん:2006/11/02(木) 17:22:45
Windows用のコンパイラだと、printf関数とかfopen関数は内部的にはWinAPI呼び出して処理してるんですか?
179デフォルトの名無しさん:2006/11/07(火) 02:50:23
Hellow Worldから解説してるサイトを教えてください。m(__)m
180デフォルトの名無しさん:2006/11/07(火) 03:28:15
入門書買ったほうがいいんじゃ無いか?
ついでに、C言語ってぐぐればどっかでてくるんじゃね?
181デフォルトの名無しさん:2006/11/07(火) 04:08:29
いや、まずは中学の英語の教科書からだ
182デフォルトの名無しさん:2006/11/07(火) 05:20:53
Linux入れたらC言語覚える前にシェルスクリプトですよね?
183デフォルトの名無しさん:2006/11/16(木) 09:03:29
constについて質問があります。

他のシステムに以下のような関数があり

void foo(const void *prm);

実際にはprmには構造体のポインタを渡しています。
constなのでこのポインタが指す先の構造他はfooでは変更できないという認識なのですが、関数を呼び出し終わって構造体を見てみるとメンバが書き換わっている場合があります。
fooのソースがないので、その関数内で書き換えているのかいないのか定かではなく、問い合わせをしようと思っているのですが、constがあるのに中身を書き換えていませんか??と問い合わせるのは抵抗があります。

constの付いた引数がポインタだった場合、ポインタの指す先が書き換えられないんですよね?
184デフォルトの名無しさん:2006/11/16(木) 11:27:38
キャストしてconstを取ってやれば可能。
185デフォルトの名無しさん:2006/11/16(木) 16:43:34
便乗で質問。
関数内部で書き換えるのに、引数にconstをつける理由ってなに?
186デフォルトの名無しさん:2006/11/16(木) 17:51:45
>>185
ライブラリ設計時点では内部を書き換える予定はなかったが、
実装段階で書き換える必要が出た場合。
187デフォルトの名無しさん:2006/11/16(木) 20:02:22
全然constの意味ないな
188わからないので教えてください:2006/11/16(木) 21:51:31
すみません、この問題のプログラムはどう作ればよいのかがわからないので
ぜひ、よろしくお願いします・・・

問題
配列su(要素数:12)に任意の数値をランダムに初期値設定し、逐次決定法によって
整列(昇順)させ、結果を表示させるプログラムを作成してください。
189デフォルトの名無しさん:2006/11/16(木) 22:09:49
マルチ氏ね
190189を:2006/11/16(木) 22:14:26
殺人未遂の容疑でタイ━━━━||Φ|(|゚|∀|゚|)|Φ||━━━━ホ!!!!!!
191デフォルトの名無しさん:2006/11/19(日) 00:49:46
ダイテル本の練習問題3.36「二進数を十進数にするプログラム」が書けない・・・
アドバイスか罵声、誰かたのむ
192デフォルトの名無しさん:2006/11/19(日) 01:00:35
printf("%d",x);
193デフォルトの名無しさん:2006/11/19(日) 01:22:39
strtol(s,0,2);
194デフォルトの名無しさん:2006/11/19(日) 05:19:14
>>191
同じとこやってたから書いてみた
int main(void)
{
int bin, dec, a, b, c, d;

printf("0と1のみで数字を入力:");
scanf("%d", &bin);

a = bin / 1000 * 8;
b = bin % 1000 / 100 * 4;
c = bin % 1000 % 100 / 10 * 2;
d = bin % 1000 % 100 % 10;

dec = a + b + c + d;

printf("%d\n", dec);

return 0;
}
binは2進数でdecが10進数。
でもこれだと4桁までしか入力対応してない上、binに1と0以外の値入れても反応する。
whileとシフト演算子使ってどうにかならないのかな
195デフォルトの名無しさん:2006/11/19(日) 11:34:32
>>194
%xで十六進法で入力させれば除算・剰余算をシフト・ビット積にできる。
196デフォルトの名無しさん:2006/11/19(日) 11:54:37
それだったらfgets()で入力して、strtol()で変換してもいいね。
197デフォルトの名無しさん:2006/11/19(日) 18:12:30
>>194
for(i=0,dec=0; bin; i++) {
 if(bin%10) dec += pow(2, i);
 bin /= 10;
}
やりたいことはこういうこと?
198194:2006/11/19(日) 19:11:51
>>197
調べたところpowはこの場合(2のi乗)を返すということなので、おそらくそういうことです。
ただ本の進行度として、for文と関数powを使用していません。
197さんのソースを参考にして、作り直してみたところ、実行することができました

while (bin)
  {
    if (bin % 10)
    {
      dec += i;
    }
  i *= 2;
  bin /= 10;
}

ありがとうございます。
199191:2006/11/19(日) 23:09:29
>>194-198thx
自分も同じように任意の桁の二進整数を入力した時の
変数宣言後の反復構造の扱いに苦慮していました
参考にさせて頂きます
200デフォルトの名無しさん:2006/11/20(月) 21:05:57
data[0][0][0]=data[0]
data[0][0][1]=data[1]
data[0][0][2]=data[2]
data[1][0][0]=data[3]
data[1][0][1]=data[4]
data[1][0][2]=data[5]
data[2][0][0]=data[6]
data[2][0][1]=data[7]
data[2][0][2]=data[8]
 …
data[0][1][0]=data[3w]
data[0][1][1]=data[3w+1]
data[0][1][2]=data[3w+2]
data[1][1][0]=data[3w+3]
data[1][1][1]=data[3w+4]
data[1][1][2]=data[3w+5]

というふうに1次元配列のrgbデータをを3次元配列で表したいんですがどうすればよいですか?
201デフォルトの名無しさん:2006/11/20(月) 21:42:25
諦めてオフセット計算用関数を用意するのが一番無難かもね。
Ex.
static inline int offset(int p1, int p2, int p3, int w2, int w3) {return p1 * w2 * w3 + p2 * w3 + p3;}
あー、rgb限定ならこれでもいいか。
static inline int offset(int p1, int p2, int p3, int width) {return p1 * width * 3 + p2 * 3 + p3;}
202デフォルトの名無しさん: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;
}
203デフォルトの名無しさん:2006/11/20(月) 23:38:19
要するに、構造体ポインタにconstつけた場合、
構造体そのもの、メンバにはconstがついて変更できないが、
構造体のメンバが指すもの(hoge->s[2])についてはconstにならない。
204デフォルトの名無しさん:2006/11/21(火) 01:41:13
以下のような3つのペアの実数をファイルに書き、
それらのペアを配列を使って読んで、
それぞれの四則演算を別のファイルに書き出しなさい。

5.0 3.0
2.5 1.0
4.0 1.5


って課題が授業で出てサッパリわかんなくて困ってるんですが、
どなたか助けていただけないでしょうか?
205デフォルトの名無しさん:2006/11/21(火) 10:22:23
WinXP,VC++6.0で
0〜4294967295の符号なし長整数を
扱いたいのですが

#include <stdio.h>
int main()
{
long int v1 = 4294000000;
unsigned long int v2 = 4294000000;
printf("符号付\t\t= %d\n",v1);
printf("符号なし\t= %d",v2);
return 0;
}
実行結果:
符号付 = -967296
符号なし = -967296Press any key to continue
となってしまいます。
どうしたら4294967295まで扱えるのでしょうか?
ヘタレですいませんが、どなたかお願いします。
206デフォルトの名無しさん:2006/11/21(火) 10:51:35
>>205
変数がそこまで扱えていても、出力で制限しちゃダメだべ。
long intは%ld、unsigned long intは%luで出力すべし。
207デフォルトの名無しさん:2006/11/21(火) 11:04:47
>>206
あぁ、ナルホド!
出力時のtypeが悪かったんですね。。。
ありがとうございます〜。
208デフォルトの名無しさん:2006/11/21(火) 14:07:19
/* 自然対数の底eの近似値を求めるプログラム */
#include<stdio.h>
main()
{
float e = 1.00;
int count = 1, n = 1, counter = 1;
while(counter < アレ){
while(count > 0){
n *= count--;
}
e += 1 / (float)n;
++counter;
count = counter;
}
printf("自然対数の底eの近似値は %f", e);
return 0;
}
アレの値を11以上にするとプログラムが動きません
6以上でも出力結果が2.586834のまま変わりません
どなたかアドバイスお願いします
209デフォルトの名無しさん:2006/11/21(火) 14:23:02
>>208
nを算出するループの外側で、printf("%.20g, %d\n", e, n);として見給え。
要は、nがある程度大きくなるとfloatの精度では数値が変わらなくなるし、更に大きくなるとそれ自体がオーバーフローする。
#そもそもその近似式はあっているのか?
210デフォルトの名無しさん: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;
}
211デフォルトの名無しさん:2006/11/21(火) 15:41:23
>>209-210
ありがとうございます
>>209のようにプリントした結果、n導出後にnの初期化を忘れていたようです
くどいプログラムとなりましたが、>>210と併せて参考にさせていただきます
212デフォルトの名無しさん:2006/11/22(水) 15:45:14
fprintf(stdin,"hogehoge"); のようにして標準入力バッファにどこかからの入力を出力する(つまり保持させる)ことは出来ないんでしょうか?
213212: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;
}
214デフォルトの名無しさん:2006/11/22(水) 19:01:25
>>213
そりゃ無理だ。だが、環境とやりたいことによっては似たようなことはできる。
215212:2006/11/22(水) 19:22:11
>>214
どのようなものでしょう?ただ興味があるだけで活用法はパッと思いつかないんですが、できれば教えていただきたいです

標準入力の入力バッファとかストリームと呼ばれるものはstdinが指す先にあるFILE構造体にあるんですよね
ファイルの状態としてはfopen("stdin","r")みたいに読み取り専用になってるでしょうか?
216デフォルトの名無しさん:2006/11/24(金) 11:19:11
環境も書かないような初心者には無理だろ。
217212:2006/11/24(金) 12:27:59
>>216
すみません、OSはWindowsXP、コンパイラはVC++Toolkit2003を使っています。

キーボードからの入力以外に、直接文字配列を標準入力に入力することは出来るのか
出来るとしたらどのように実現しているのかが、さわりだけでも興味があったので
環境依存で自分の環境ではできなくても特に不満はないです
218デフォルトの名無しさん:2006/11/24(金) 13:34:31
Unix系ならecho foo| yourProgramで標準入力にfooが入力されるわけだが。
勿論これはfooが事前に決定できる文字列の話なので、
自前で文字列を用意して自分自身の標準入力で受けるのならパイプでも使わないと無理だが。
219212:2006/11/24(金) 16:29:31
>>218
パイプってまさしくそういうことだったんですね、ありがとうございます
パイプがやってる処理を自前でソースの中に組み込むことは出来るんでしょうか?
220デフォルトの名無しさん:2006/11/24(金) 16:52:47
つ[pipe()]

今話題の用途には使いにくいが、お手軽にはpopen()も。
221デフォルトの名無しさん:2006/11/24(金) 16:57:04
大域ヘッダーファイルの〜〜.hと7つの原始ファイル〜.cを動かすにはどうすればいいですか?
vc++で動かしたいのですがlinuxでやってたリンク編集とかが分からなくて、
できればVCでの手順などを教えていただけませんか?
222212:2006/11/24(金) 17:20:55
>>220
おお、こんな関数があったんですね、ありがとうございます
ぐぐったところには出力の方はあっても入力の方がなかったのでおぼろですが
fprintf(stdin,"hogehoge");みたいなことをしたいのならこんな感じでしょうか?

int filedes[2];
char buf[256];
pipe(filedes);

close(STDIN_FILENO);
dup2( fd[0] , STDIN_FILENO );

write( fd[0] , "hogehoge" , 256 );
223212:2006/11/24(金) 17:30:23
すみません弄ってたら余計なものが残ったままでした…
char buf[256];は省いて、writeの第3引数は9にして下さい
224デフォルトの名無しさん:2006/11/25(土) 01:01:25
>>222
大体あってる、でも、ひとつ間違いがあってwriteするほうが1、readが0
あとdup2の前でcloseする必要はない。dup2がやってくれる。
#include<unistd.h>
#include<stdio.h>
int main()
{
    int fd[2]; 
    char buf[256]; 
    pipe(fd); 
    dup2( fd[0] , STDIN_FILENO );
    write( fd[1] , "hogehoge" , 9 ); 
    read( fd[0] , buf , 9 );
    puts(buf);
    
}
225212:2006/11/25(土) 16:44:17
>>224
レス遅れてすみません、理解するのに時間掛かってました
dup2( fd[0] , STDIN_FILENO );でキーボードからの入力を無効にして
write( fd[1] , "hogehoge" , 9 );で本来なら画面に出力されるところをパイプが受け止めて
read( fd[0] , buf , 9 );でキーボードからの入力を受け取るところ、すでにパイプに
保持されている文字列を受け取っている、という理解でいいでしょうか?

そうなると、パイプがバッファリングに使う領域=標準入力がバッファリングされる領域=標準出力がデータを取ってくる領域
ということなんでしょうか?
226デフォルトの名無しさん:2006/11/25(土) 21:04:05
超初心者なんですがreturn 0;ってどういう意味ですか?
227デフォルトの名無しさん:2006/11/25(土) 21:33:01
0を返すという意味です
228デフォルトの名無しさん:2006/11/25(土) 21:59:16
特にmain関数の場合は、正常終了した場合0を返すと定められています。
229デフォルトの名無しさん:2006/11/25(土) 22:09:42
式の中では0は偽で0以外が真なのに、0を返すことが正常終了になってるのは
単にそうすれば0以外の値にどんなエラーだったのかそれぞれ意味を付加ことができるから?
230デフォルトの名無しさん:2006/11/25(土) 22:10:24
付加する、だった
231デフォルトの名無しさん:2006/11/25(土) 22:35:41
>>229
そのアプリケーションを呼び出すシェルでは逆に0が真で0以外が偽なんだと。
シェルスクリプトでバッチ処理とかする際に対応がきちんとしてるとバグの混入を防げる。
232デフォルトの名無しさん:2006/11/25(土) 22:42:13
>>231
あ、なるほど。トンクス
233212: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は普通のファイルポインタとはちょっと違うみたいですね
無理なものは無理だとしてとりあえず先に進むことにします、付き合っていただいてありがとうございました
234デフォルトの名無しさん:2006/11/29(水) 14:02:53
lseekのlはleadのですか?
235デフォルトの名無しさん:2006/11/29(水) 14:24:00 BE:81522667-2BP(202)
何故唐突にleadが出てくるのかが分からない。
236デフォルトの名無しさん:2006/11/29(水) 14:39:26
>>235
なんとなく探す場所に導く(lead)って意味なのかなと…
237デフォルトの名無しさん:2006/11/29(水) 17:47:31
柴田望洋の明解C言語って本を渡されたが
これ演習の答えがないと答えがあってるか不安になるなorz


チラ裏でスマソ
238デフォルトの名無しさん:2006/11/29(水) 19:06:38
>>236
location seek じゃないかなあ?
239234:2006/11/29(水) 19:28:52
>>238
あ、なるほど。それっぽくてすっきりしました、ありがとうございます。
240デフォルトの名無しさん:2006/11/29(水) 20:23:12
open <-> fopen
read <-> fread
write <-> fwrite
close <-> fclose
なのにseekは
lseek <-> fseek
なんだよね。
昔システムコールにseekがあってlseekに拡張されてseekがobsoleteになったとかなのかね?
241デフォルトの名無しさん:2006/11/30(木) 04:53:40
lseek()のlはlongのl
242デフォルトの名無しさん:2006/11/30(木) 09:41:20
>>241
オフセットの型がintなseekが最初にあってlongに拡張されたlseekに置き換わった?
そして今やオフセットの型はoff_tなんだよね。longに結び付けられてたりするけど。
でもシステムによってはintだったりすることもある。
243234:2006/11/30(木) 17:57:49
>>241
longですかー、うーん下らない部分だと分かっていても気になってしまう
244デフォルトの名無しさん:2006/11/30(木) 21:28:29
fseek だって、_fseeki64 とか言うのが出来たしな
245デフォルトの名無しさん:2006/12/01(金) 10:29:33
年賀状の当選番号を検索するってプログラムを作ることになったけどわかんない・・・

具体的には例を出すとあたり番号が「012345」というのがあったら入力が出来ないということです
ですので、文字列としてやって見ようと思うのですが6文字(1等は6桁のため)と言う風に定義が出来ない・・・
タスケテ・・・
246デフォルトの名無しさん:2006/12/01(金) 10:36:43
誰が何の目的でそんなプログラムを必要とするのだろうとふと思った
247デフォルトの名無しさん:2006/12/01(金) 11:00:39
一応宿題ってことになってます
248デフォルトの名無しさん:2006/12/01(金) 11:14:39
ttp://textup.no.land.to/w/1164939089/
初めて作ったんですけどどうすか?
EXIT_**** 定数ってみなさんは使います?
249デフォルトの名無しさん:2006/12/01(金) 14:48:16
>245
別に先頭が0でも数字として入力できないわけじゃないだろ?
当選番号の桁数は決まってるんだから、入力された数字から12345を引いて
1000000で割った余りが0なら当選ってすればいいじゃん。
250デフォルトの名無しさん:2006/12/01(金) 19:49:34 BE:122724443-2BP(111)
2chのURLをスラッシュで区切って切り分けようと考えています
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
のような形でファイルに出力するにはどうしたらいいでしょうか
251デフォルトの名無しさん:2006/12/01(金) 20:05:04
fprintfでも使えば?
252デフォルトの名無しさん:2006/12/01(金) 20:08:58
s|^http://(.*?)\.2ch.net/test/read.cgi/(.*?)/(\d{4})(\d{5,6})/.*$|http://makimo.to/2ch/$1_$2/$3/$3$4.html|
253デフォルトの名無しさん:2006/12/01(金) 21:11:25 BE:357945375-2BP(111)
>>251
とりあえず、個別に入力してもらって
http;//2ch.dumper.jp/9桁または10桁の数字/を出すところまでやってみました
http://jbbs.livedoor.jp/bbs/read.cgi/computer/21256/1164941934/3

>>252
正規表現は(ご本人には否定されたけど)
Javascriptでhttp://www.geocities.jp/mirrorhenkan/でやられてるみたいなんですね
できたら他の方法でできないものでしょうか
…てこれは最初に書くべきでしたね。申し訳ない
254デフォルトの名無しさん: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);
}
255デフォルトの名無しさん:2006/12/03(日) 00:43:10
ポインタのサイズは今の時代はまだ4で通用するかな
あと何年かすると8で当たり前じゃんこのじじぃがとかいう時代になるのかも
256デフォルトの名無しさん:2006/12/03(日) 00:45:19
それだけでは判断が付かないが、sizeofの結果が4になるというのは、
おそらくsizeof (char*)ということになっているのだろう。
257デフォルトの名無しさん:2006/12/03(日) 00:52:14
ちなみにANSI Cの文字列は0終端だから
strlenって関数で長さを知ることが出来る。
258254:2006/12/03(日) 01:08:31
ありがとうございました。strlen関数で実際のchar配列の要素数と同じ数字を得られました。
内部的に配列になってないんじゃないかと心配したんですが、そういうことじゃなかったんですね。
259250:2006/12/03(日) 18:56:34 BE:184086836-2BP(111)
250です
一応自分で作ってみたのですが無限ループらしく落ちてしまいますorz
どこが原因か見ていただけないでしょうか

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/* 定数 */
#define FNAME1 "uho.txt" /* 読み込むファイル名 */
#define FNAME2 "yaranaika.txt" /* 吐き出すファイル名 */

/* 関数のプロトタイプ宣言 */
int split_date(char* buf);
char *declast(char saba[20]);

/*グローバル変数として宣言*/
FILE *fp1,*fp2;/* ファイルポインタ */

/* main関数 */
int main(void)
{
/* 変数宣言 */
char buf[512]; /*uho.txtから読み込むデータのための配列*/

/*uho.txtを読み込みモードで開く*/
fp1 = fopen(FNAME1,"r");
if ( fp1 ==NULL)
{
printf("ファイルオープンに失敗したんです><\n");
return 1;
}
260250:2006/12/03(日) 18:57:16 BE:122724926-2BP(111)

/*yaranaika.txtを上書きモードで開く*/
fp2 = fopen(FNAME2,"w");
if ( fp2 ==NULL)
{
printf("ファイルオープンに失敗したんです><\n");
return 2;
}

/*uho.txtから一行分のデータを読み込む*/
while(fgets(buf,256,fp1)!=NULL)
{
/*データの取り出し*/
split_date(buf);
}

/*uho.txtを閉じる*/
fclose(fp1);
/*yaranaika.txtを閉じる*/
fclose(fp2);

return 0;

}
261250:2006/12/03(日) 19:00:49 BE:122724162-2BP(111)
ああ、よく考えたらここに貼る必要ないですねorz
ここに貼っておきました
http://jbbs.livedoor.jp/bbs/read.cgi/computer/21256/1164941934/28-30
262デフォルトの名無しさん:2006/12/03(日) 20:11:20
>>261
strtok()何ぞを使っている段階で読む気が失せた。
sscanf()で、%[^/]でも使えば?
263デフォルトの名無しさん:2006/12/03(日) 20:57:04
{
int i=0;
int temp=0;
for(i=0;i<n/2;i++)
{
temp = a[i];
a[i] = a[n-i-1];
a[n-i-1] = temp;
}
}
これは逆順の関数なんですがaをポインタ形式に書き換え様としています。
自分でやったら動作がおかしくなるorエラーなので、誰か手本を下さい。
ポインタをよく分かってなさそうなので参考にもしたいです。
264デフォルトの名無しさん:2006/12/03(日) 21:38:57
a[x] → *(a+x) に全部書き換えればいいよ
265デフォルトの名無しさん:2006/12/03(日) 21:45:31
>>263
つーか、ちゃんとaをポインタとして使っているジャン。
>264がヒントを書いているけれど、Cでは配列を配列のまま参照することはないからね。
266デフォルトの名無しさん:2006/12/03(日) 21:50:06
C言語の配列とポインターを使って、文字列をひとつ入れて
それぞれの文字が入っているアドレスを出力しなさい。
また、整数データの列を定義してそれぞれの整数が入っている
アドレスを出力しなさい 。

という問題を考えているんですが、C言語をまだ習い始めたばかりで、
どのように示せばいいのか悩んでいるので、
解答もしくはヒントを提示していただけないでしょうか?
よろしくお願いします。
267デフォルトの名無しさん:2006/12/03(日) 22:00:17
>>264-265
ありがとうございます。
分かってるのか分かってないのか・・
268デフォルトの名無しさん:2006/12/03(日) 22:28:24
>>266
配列の各要素にアクセスするにはどうしたら良いか?
変数のアドレスを取得するにはどうするか?
後は、>264とかも参考になる。
269デフォルトの名無しさん:2006/12/03(日) 22:48:13
始めて書き込みます
コンパイラborlandをインスコしたのですが
メモ帳で作ったファイルの入れ方(コンパイル)がわかりません・・・
お願いします
270デフォルトの名無しさん:2006/12/03(日) 23:58:44
C/C++の宿題を片付けます 77代目
http://pc8.2ch.net/test/read.cgi/tech/1164079451/l50
271デフォルトの名無しさん: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);
}
こんな関数を利用するんですが。
272デフォルトの名無しさん:2006/12/04(月) 00:21:27
>>271
分からない所はどこ?
273デフォルトの名無しさん:2006/12/04(月) 00:57:56
>>269
bcc32 ファイル名.c
で出来ない?
274デフォルトの名無しさん:2006/12/04(月) 01:00:53
ttp://tx-h.go2.jp/loada/src/txup0006.zip
このC言語ファイルをコンパイルして、実行した後に、
"search"と入れて学籍番号(1〜10)を入力すると「セグメンテーション違反です」と出てしまいます。
どこが悪いのか全くわからないので、教えていただけないでしょうか?
275デフォルトの名無しさん:2006/12/04(月) 02:11:09
>>274
sの初期化を
276デフォルトの名無しさん:2006/12/04(月) 02:22:44
>>273
ありがとう
ちょっとやってみてから
また質問します( ^ω^)
277デフォルトの名無しさん:2006/12/04(月) 02:32:28
>>271
lesson {a1,a2...ai...an}

曜日を入力
for(i:1->n)
 if(曜日=ai.day) printf_lesson
 i++
278デフォルトの名無しさん:2006/12/04(月) 03:12:11
>277
==
279デフォルトの名無しさん:2006/12/04(月) 09:36:45
>>275
ありがとうございます。
こんな簡単なことに気づけないなんて、情けないです。
もっと勉強します!
280271:2006/12/04(月) 12:25:01
>>277
その曜日の入力のやり方がいまいち分かりません。
scanf("%d",&ai.day);とかでいいんですか?

あとよかったらfor(i:1->n) の意味を説明してほしいです。
281271: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の物を全部出すようにしたいです。
282274:2006/12/04(月) 14:45:30
ttp://tx-h.go2.jp/loada/src/txup0008.zip

>>274に追加で、"avarage"と入力することによって各教科の平均を表示したいのですが、
途中までやってみたもののよくわからなくなってしまいました。
ご教授のほどよろしくお願いいたします。
283デフォルトの名無しさん:2006/12/04(月) 21:17:04
>>281
構造体の配列を使えば良いジャマイカ
284デフォルトの名無しさん:2006/12/04(月) 21:34:05
>>283
とりあえず課題はelse ifとか使って無理やり結果は出るようにしたんですが
やっぱ題意と違うからこのまま出したら減点される。。

構造体の配列がいまいち分かりません。
本に書いてある通りだと配列全部同時に出力とかになるんですが
応用して選んだやつだけ、それも配列番号じゃなくて
中のデータの一部を汲み取って表示とかは分からないです。
285デフォルトの名無しさん:2006/12/04(月) 22:44:36
2ちゃんで訊かなきゃならんほど追い詰められていながら
減点を気にするとはいやはや
286デフォルトの名無しさん:2006/12/04(月) 22:50:50
減点というかそのプログラムを応用したものを次に作らないといけないのと
自分でやった方法だと配列が使われてない(><; のが問題だと思いまして
287デフォルトの名無しさん:2006/12/04(月) 23:08:56
とりあえずそのelse ifを使って無理やり結果を出すソースが見たい
288デフォルトの名無しさん:2006/12/04(月) 23:33:22
>>286
>>280はちょっと違って、一旦別の変数xに入れてからxとa[i].dayの比較をする
for(i:1->n)は iを1〜nまで を適当に書いただけ

あとは>>287と同じ
289デフォルトの名無しさん:2006/12/04(月) 23:51:33
>>282
s=0 としてから ave_m = avarage_math(s); としているがどうなるか、sとは何か
sum=0 として sum += sum; としているがどういう意味の式か
290デフォルトの名無し:2006/12/05(火) 12:53:28
このような事ができるようなプログラムを1時間以内で教えて下さい。お願いします

1:4個の1桁の数字からなる順列を乱数で生成
(4個の数字は全て異なる)
2:4個の数字の順列を入力
3:生成した順列と入力の順列を比較
(数と位置があっている「hit])
(数はあるけれど位置が違う「blow])
4:hit数とblow数を表示
5:順列があたるまで入力を繰り返す

実行例
Number?:0123
Hits:0,Blows:1
Number?:0124
Hits:0,Blows:0
Number?:3567
Hits:3,Blows:0
Number?:3568
Hits:3,Blows:0
Number?:3569
Hits:4,Blows:0
Trials:5
291デフォルトの名無しさん:2006/12/05(火) 12:58:39
borlandのコンパイラを入れたんですが
マイドキュメントにあるtest.cを
C:\borland\bcc55\Bin\bcc32.exeでコンパイルして別のフォルダに出力する方法ってありますか?
出来れば簡単に出来るといいのですが・・・
変なところあるかもしれませんがよろしくお願いしますm(__)m
292デフォルトの名無しさん:2006/12/05(火) 13:39:31
>>291
出力ファイル名を指定するオプションは、たぶんパス指定も受け付けると思う。
293デフォルトの名無しさん:2006/12/05(火) 13:53:54
>>291
-eFilePath
スペース空けたら駄目
294デフォルトの名無しさん:2006/12/05(火) 18:58:15
猫でもわかるプログラm
という本を買ってやり始めようと思ったんですが・・・
初めのパスやPATHの設定の仕方が書いてありません!
設定のやり方がkwsk載っているサイトありましたら
教えて下さいorz
295デフォルトの名無しさん:2006/12/05(火) 19:07:17
296デフォルトの名無しさん:2006/12/05(火) 19:19:15
>>295
ありがとうございます(*´∀`*)
なんとか設定できたみたいです。
"bcc32.cfg"を作れ、とかいてあり作ろうとしたらなぜかもう作ってありました・・・。
こういうのはなぜ作るのか教えて下さいorz気になる、、、
猿でもわかるようにorz
297デフォルトの名無しさん:2006/12/05(火) 19:29:01
>>296
まだC言語に触ったことないなら説明しても解からないと思うが

インクルードパスやライブラリパスを指定するためにbcc32.cfgを作る
298デフォルトの名無しさん:2006/12/05(火) 19:39:47
>>297
・・・
よくわかりませんが、ありがとうございます⊂二二二( ;^ω^)二⊃ブーン

299デフォルトの名無しさん:2006/12/06(水) 21:22:22
main()とmain(void)のようにカッコの中に何も書かない場合とvoidを書く場合の違いがわからないのですが、解説してもらえないでしょうか。
300デフォルトの名無しさん:2006/12/06(水) 21:36:06
そこにvoidを書くと、引数を取らないことを意味する。
関数定義でvoidを書かない場合は上と同じ。
プロトタイプ宣言でそれを書かない場合、引数の指定が全くないことを意味する。

なお、C++では常に引数を取らないことを意味する。
301デフォルトの名無しさん:2006/12/06(水) 21:53:34
Visual C++ 2003でCの勉強してるんですけど
ど〜してもエディタが気に入りません。
どうしたらいいですか。
302デフォルトの名無しさん:2006/12/06(水) 22:05:34
すいません質問です。
#include <stdio.h>
#include <conio.h>

int main(void)
{
char ch;

printf("メッセージを入力:\n");

ch = getche();
while(ch != '\r') {
printf("%c", ch+1);
ch = getche();
}

return 0;
}
このコードをコンパイルして実行したんですが
文字を入力したら文字が右斜め上に行ってしまいます。
何が原因なんでしょうか?
コンパイラはBorland C++5.5.1です。win2000で使用してます。
よろしくお願いします。
303デフォルトの名無しさん:2006/12/06(水) 22:07:51
ある程度はカスタマイズできる。
それでも気に入らないなら、使わなければいい。

コンパイルはコマンドプロンプトからするも良し、
他のエディタでコマンドを呼び出すようにするも良し。
304デフォルトの名無しさん:2006/12/06(水) 22:15:19
>>302
bccだけ斜め上行くね
VC++,gccは問題なかった
なんでだろ
305デフォルトの名無しさん:2006/12/06(水) 22:16:26
C言語を習得したいと思っているのですが、分かりやすい参考書、サイトなどありましたら教えてください。
また、C言語にも色々と種類があるようなのですが、どれから勉強していけばよいのでしょうか?
306デフォルトの名無しさん:2006/12/06(水) 22:22:17
>>302

#include <stdio.h>
#include <conio.h>

int main(void)
{
char ch;

printf("メッセージを入力:\n");

ch = getch();
while(ch != '\r') {
printf("%c", ch);
printf("%c", ch+1);
ch = getch();
}

return 0;
}

これでちょっとやってみて。
307デフォルトの名無しさん:2006/12/06(水) 22:23:50
CRLFが悪さをしてるかと
308デフォルトの名無しさん:2006/12/06(水) 22:30:22
>>306
>>302じゃないけどgetchでは問題なかった
309デフォルトの名無しさん:2006/12/06(水) 22:35:42
>>305
独習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++がわかればいいというのであればこれで勉強するといいと思います。
310302:2006/12/06(水) 22:39:36
>>306
9行目はどういう意味になるのでしょうか?
>>302
getchはconio.hでいいんですか?
311デフォルトの名無しさん:2006/12/06(水) 22:40:14
>>309
ありがとうございます。
>独習CからC++やC#なりに行けばいいと思いますが
とありますが、C言語自体は独学でも十分に習得できるものということでしょうか?
またプログラムのプの字も知らない状態なので、
フリーのコンパイラとともに「猫にもわかるプログラミング」というサイトで勉強しようと思っているのですが
なんとかなりますか?
312302:2006/12/06(水) 22:41:01
>>307
CRLFが原因だとすると解決方法は
あるのでしょうか?
313デフォルトの名無しさん:2006/12/06(水) 22:44:41
コマンドラインからビルドしたら右上に行ったけど、
BCC Developer でビルドしたら普通に動いたよ。
素人だからわからんけど、引数じゃ無いかな?
314デフォルトの名無しさん:2006/12/06(水) 22:51:55
>>310
思い出した
DOS窓の行数が増えていくと表示がおかしくなる現象
新たにDOS窓開くと問題ないと思う
315デフォルトの名無しさん:2006/12/06(水) 23:00:14
>>314
ホントだ。
再現できた。
コンソール起動してすぐなら異常ないけど、
行数稼いでから実行すると異常を起こす。
316デフォルトの名無しさん:2006/12/06(水) 23:00:18
>>300
ありがとうございます
317デフォルトの名無しさん:2006/12/06(水) 23:08:15
>>315
bccのconioまわりがおかしいのかもね
カーソル位置を指定するgotoxyも同じように行数増えるとおかしくなるはず
318デフォルトの名無しさん:2006/12/06(水) 23:52:03
どうするとバグが多くなると思いますか?
319デフォルトの名無しさん:2006/12/06(水) 23:55:40
キーボードにコーヒーをこぼすと
入力ミスが多くなりますよ (^^
320デフォルトの名無しさん:2006/12/07(木) 01:09:49
バグ少ない作りかたしたほうがよくないですか?
プログラムしたことないんですが?
321デフォルトの名無しさん:2006/12/07(木) 09:25:01
Cです。

      略
int main()
{ char expr[] = { '8', '6', '*', '5', '-', '\n'};
int i,j;

for(i=0; i < 10; i++){
if (isdigit(expr[i])) {
j = atoi(expr[i]);
      略

この状態でコンパイルしようとすると、atoiの行でエラーが出てしまうのですが対処法を教えてもらえないでしょうか?
型が関係しているのかと思い色々試してみてもうまくいきません。
j = atoi(expr);  とするとコンパイルはできたのですが、代入された数字が他の数字(98)に変わってしまいました・・・。
322デフォルトの名無しさん:2006/12/07(木) 09:43:27
>>321
j = atoi(&(expr[i]));

何をしようとしているかぐらい話のネタとして書いてくれないとつまらない
323デフォルトの名無しさん:2006/12/07(木) 10:06:15
>>321
これがやりたい?そのコードで10回ループはマズイよ。

char expr[] = { '8', '6', '*', '5', '-', '\n'};
int i, j;

for(i = 0; i < sizeof(expr) / sizeof(char); ++i){
if(isdigit(expr[i])){
char str[] = {expr[i], '\0'};
j = atoi(str);
}
}
324デフォルトの名無しさん:2006/12/07(木) 10:19:45
>>321
何故「atoi(expr[i])」がダメかと言うと
atoi()は引数に「const char*」を取るから。
「expr[i]」の場合の型は「char」だからコンパイルエラーになるよ。

だから一旦、下みたいに別の領域に置いて、atoi()に渡してやる必要があるよ。
char str[]={expr[i],'\0'}; ←何処までが文字列か分かる様に'\0'を追加しとく

あと配列の要素数ぶんキチンとループしないと
確保したメモリ領域以外にアクセスする事になるから気を付けないと。
for(i=0;i<10;i++) こんな適当じゃなくて
for(i=0;i<sizeof(expr)/sizeof(char);++i) こんなふうに要素数を溢れない様にしないと。
325デフォルトの名無しさん:2006/12/07(木) 11:37:03
>>322-324
ありがとうございます。逆ポーランド式の計算プログラムを作っています。
sizeofというのは演算子なんですね。初めて見ました。
「’\n’」が来た時にiに10より大きい数字を代入してループを抜けようと考えていたのですが、むちゃくちゃすぎるでしょうか?
今は期限がせまっているのであとでじっくり考えてみます!
326デフォルトの名無しさん:2006/12/07(木) 11:53:20
>>325
文字数ぶんループしたいなら↓の様にすればいいよ。
char expr[] = { '8', '6', '*', '5', '-', '\0'};
for(i = 0; i < strlen(expr) ++i)
これでもいいけど。
for(i = 0; expr[i] != '\0'; ++i)
改行で判定したい場合はこれ。
char expr[] = { '8', '6', '*', '5', '-', '\n'};
for(i = 0; expr[i] != '\n'; ++i)
327デフォルトの名無しさん:2006/12/07(木) 12:09:23
>>326
strlen()も初めて見ました。\0という表現(?)も。あとで調べてみます。

expr[i] != '\n' ← なるほど!と思いました。なぜ気づかなかったんだろう。
どうにかプログラムがうまく動くようになってよかったです。本当にありがとうございました(^^)
328デフォルトの名無しさん:2006/12/07(木) 13:30:36
atoi()よりもstrtol()かsscanf()を使うべきだな。
それらはatoi()と違って、変換終了点が判るのだから。
329デフォルトの名無しさん:2006/12/07(木) 23:45:22
C言語で最適なコンパイラって何ですか?(市販品も含めて)
330デフォルトの名無しさん:2006/12/08(金) 02:09:47
awkのことはここで聞いてもおk?

初心者というかアルゴリズムがわからなくって・・。
# cat aaa
1
2
3

これを
1 2 3 
に並べ替えるってどうすりゃいいのか
331デフォルトの名無しさん:2006/12/08(金) 04:31:51
>>330
awkじゃ完全にスレ違いだ。ちゃんとawkスレはあった気がする。
並べ替えっていうより複数行をまとめるってことじゃないの?
そうなら、アルゴリズム以前の問題だ。
ヒント:BEGIN{ORS=" "}{print}
332デフォルトの名無しさん:2006/12/08(金) 10:15:45
>>329
ライブラリは探せば出てくるから、とくにこれといって優れたものというのはないと思う。
333デフォルトの名無しさん:2006/12/08(金) 19:10:45
ダイテル本の練習問題の解答集を自費出版するまでの道のりを教えて下さい
334デフォルトの名無しさん:2006/12/08(金) 19:17:11
>>333
ハメ撮りクイズをインディーズで出すってこと?
335デフォルトの名無しさん:2006/12/09(土) 14:20:24
ちょっと質問。
fwrite() とかの、size と count ってのは何のために用意されてるんでしょう?
fwrite(hoge, 2, 4, fp);
336デフォルトの名無しさん:2006/12/09(土) 14:21:13

fwrite(hoge, 2, 4, fp);
fwrite(hoge, 1, 8, fp);

の違いが分かりません。
メモリ上のデータと書き込み先のデータでインディアンが違うときとか、そういう時のため?
337デフォルトの名無しさん:2006/12/09(土) 14:32:21
C言語でカレンダーを作りたいのですがわかりません
簡単なプログラムで作りたいのですが……
よろしくおねがいします
338デフォルトの名無しさん:2006/12/09(土) 14:37:28
printf("12月");
printf("          1 2");
printf(" 3 4 5 6 7 8 9");
printf("10 11 12 13 14 15 16");
printf("17 18 19 20 21 22 23");
printf("24 25 26 27 28 29 30");
printf("31");



339デフォルトの名無しさん:2006/12/09(土) 14:39:53
つまりは、何が分からないのかをしっかり伝えないと、
こちらからはこんな答えしか書きようがないってことだ。
340デフォルトの名無しさん:2006/12/09(土) 14:44:05
341デフォルトの名無しさん:2006/12/09(土) 14:46:17
>>337
#include <stdio.h>
int day_of_week(int year, int month, int day) {
    if (month == 1 || month == 2) { --year; month += 12; }
    return (year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + day) % 7;
}
int days_of_month(int year, int month){
    static const int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (month < 1 || month > 12) month = 1;
    if (month == 2) return days[1] + (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
    else return days[month-1];
}
void calendar(int year){
    int i, k, month, days;
    for (month = 1; month <= 12; month++) {
        printf("\n    %d年%d月\n日 月 火 水 木 金 土\n", year, month);
        k = day_of_week(year, month, 1);
        days = days_of_month(year, month);
        for (i = 0; i < k; i++) printf(" ");
        for (i = 1; i <= days; i++) {
            printf("%2d ", i);
            if (++k % 7 == 0) printf("\n");
        }
        printf("\n");
    }
}
int main(void) {
    int year;
    printf("何年?:"); scanf("%d", &year);
    calendar(year);
    return 0;
}
342デフォルトの名無しさん:2006/12/09(土) 15:05:17
>>338
せめてネタでも改行くらいしようや。

>>336
戻り値の違いに注意。
343デフォルトの名無しさん:2006/12/09(土) 15:14:16
インディアンが違うと確かに困るな。
南米ではインディオだな。
344デフォルトの名無しさん:2006/12/09(土) 15:16:56
fwriteの戻り値の説明で

>読み書きに成功した要素の個数を返す。エラーが生じた場合や、end-of-file(ファイルの最後)に達した場合、
>返り値は指定した個数よりも小さい値(またはゼロ)となる。

とありました。
fwrite(buf, sizeof(int), 8);
とした場合に8より小さい値が返ってきたらエラーかどうかの区別がつかない気がするのですが、
エラーかどうかをどうやって判断したらよいのでしょうか?
345デフォルトの名無しさん:2006/12/09(土) 15:17:12
ネイティブアメリカンだバカヤロウ
346デフォルトの名無しさん:2006/12/09(土) 15:43:11
>>344
そこでferror()ですよ。
まぁ、大抵fwrite()で4*8程度ではバッファ内に収まってしまうから実際の書き出しは行なわれず、
エラーなんぞ起きやせんのだが。
#そしてfclose()で書き出しが行なわれてエラーになったりする罠。
347デフォルトの名無しさん:2006/12/09(土) 17:16:29 BE:179723849-2BP(294)
fwrite()の場合は、書きこんだサイズがバッファより小さかったら、エラーなんじゃないの?
いや、ferror()で調べればいいけどさ。
348デフォルトの名無しさん:2006/12/09(土) 17:22:17 BE:39939124-2BP(294)
unixのwrite()の場合は、全部書きこまないで戻ってきて、しかもエラーで
ない場合がありえるって話を読んだことがあるな。。。
fwrite()もそうなのか?
まあ、どちらにしてもferror()で調べるようにすればいい話だけど。
349デフォルトの名無しさん:2006/12/09(土) 17:45:23
>>344の戻り値の説明はfread()の間違いだろと誰も指摘しないのかよ
350デフォルトの名無しさん:2006/12/09(土) 18:35:54 BE:79877928-2BP(294)
「読み書きに成功した・・・」だから、fwriteも含んでるんじゃね?
351デフォルトの名無しさん:2006/12/09(土) 19:04:24
>>350
自分の持ってるANSI Cの辞書にはfwrite()の項にこう書いてある。

返却値
@書き込みに成功した値を返す.
A書き込みエラーが発生したときのみ,nより小さくなる.
352346:2006/12/09(土) 19:59:38
>>347
エラーの種類の判断とミスリードした。確かに、少ない時点でエラーだね。
#それさえも起きない可能性が高いことは>346に書いた通り。
353デフォルトの名無しさん:2006/12/09(土) 20:11:29
Cってセックスのことでしょ?
まだ手をにぎったことしかないんですけど、
セックスのときってなにかとくべつな言葉をつかうものなのですか?
354デフォルトの名無しさん:2006/12/09(土) 22:47:41
よろしくお願いします。

for(i=0;i<12;i++)
{
printf("a[%d]=",i+1); scanf("%lf",&a[i]);
}

上のような構文(?)を使って、

a[1]=5(数字は何でも良い)
a[2]=7



a[11]=5
a[12]=8

というように入力していき、
その入力した数字(上の例では、a[1]=5、a[2]=7、a[11]=5、a[12]=8)を
for文を使って、

5
7



5
8

という風に表示させたいのですが、どのようにしたら良いでしょうか?
355デフォルトの名無しさん:2006/12/09(土) 23:09:41
>>354
自分で答えかいてるようなものじゃん

for(i=0;i<12;i++)
{
printf("%d",a[i]);
}
356デフォルトの名無しさん:2006/12/09(土) 23:10:11
改行忘れた
\nね
357354: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;
}
358デフォルトの名無しさん:2006/12/09(土) 23:36:07
>>357
a[i]はdoubleだから%lfだな
359354:2006/12/09(土) 23:37:19
すみません。自己解決しました。。。
%dを%lfに変えるの忘れてました。

ありがとうございました!!
360354:2006/12/09(土) 23:38:28
>>358

その通りでした
ありがとうございます!
361デフォルトの名無しさん:2006/12/09(土) 23:43:55
「3次元空間で座標を入力して現在位置から次の敵機が迎撃可能かどうかを
確認するプログラム」を作りました。
(3次元のインベーダーみたいなのを想像してください)
これから拡張してどの経路をたどれば最高得点か、というところまで
行きたいのですがどのように作っていけばいいでしょうか?
362デフォルトの名無しさん:2006/12/09(土) 23:49:44
>>361
移動の仕組みはどうなっているのか、
撃てば必ず当たるの?
その際の得点は?

など説明が足りなさ過ぎる。
363361:2006/12/09(土) 23:53:06
移動速度は自機と敵機おなじ速さで敵は今はまっすぐ落ちてくるだけ
そして、迎撃方法は時機が敵機に体当たりするという変なプログラムですw
だから迎撃可能範囲が円錐になる感じですね
当たり判定は今のところ点です.
364361:2006/12/09(土) 23:59:15
追加補足で、自機の移動は最低ラインを動くのみで前には出ない
      得点はどれもおなじ
      
です
365デフォルトの名無しさん:2006/12/10(日) 00:00:15
>>363
なんだかよくわからないが、得点が固定ならMST(最小木)を調べてみたらどうだろう
366361:2006/12/10(日) 01:52:48
>>365
やってみます!
367デフォルトの名無しさん:2006/12/10(日) 10:18:05
このスレと別の宿題スレとか勉強になるね
サンプルかき集めたら何か出来そう
368デフォルトの名無しさん:2006/12/10(日) 11:01:08
Cで中田氏を実行したら、Dに進んでしまった。
手術費をどうするかでもめてる。orz
369デフォルトの名無しさん:2006/12/10(日) 13:43:10
>>368
結果がどうなるかは処理系によります
370デフォルトの名無しさん:2006/12/11(月) 03:16:06
371デフォルトの名無しさん:2006/12/11(月) 11:31:04
>>367
オマエのレスはなんの参考にもならんな
372372:2006/12/13(水) 16:34:32
流れを断ち切って申し訳ナス。

変数を引数して、変数名と値を出力する関数を作りたいです!
変数から、その変数名の文字列をとりだす方法ってありますか?

//ソース
void DebugOut(int value);
void main(){
int value = 100;
DebugOut(value);
}

//実行結果
value:100

って感じになる関数を作りたいんです!よろしくお願いします!
373デフォルトの名無しさん:2006/12/13(水) 17:00:58
printf("value:%d", value);じゃダメなの?
374デフォルトの名無しさん:2006/12/13(水) 17:03:41
そういうときはマクロのの出番。
#define DebugOut(variable) (fprintf(stderr, "%s : %d\n", #variable, (int)(variable)))
375372:2006/12/13(水) 17:53:50
<<373
それでできるんだろうけど、めんどくさかったんです!

<<374
すげー!できました。

お二方とも、ありがとうございました!
376デフォルトの名無しさん:2006/12/13(水) 20:14:54
OpenCVを使っているのですが、
画像を読み込んで、すべてのピクセルで、
getpixel(img,x,y,&r,&g,&b);
printf("座標(%d, %d)のRGB値は(%d, %d, %d)です.\n",x,y,r,g,b);
を繰り返したいのですが、
for文などの繰り返し文をどのように書けばいいのかわかりません。
よろしくお願いします。
377デフォルトの名無しさん:2006/12/13(水) 20:26:49
for
for

とか?
378デフォルトの名無しさん:2006/12/13(水) 20:27:41
あれ・・・スペース入んない・・・
379デフォルトの名無しさん:2006/12/13(水) 20:44:36
そうです!
自分で調べてみたらWidthなどを使っていました。
for文の書き方教えてほしいです。
とりあえず10*10でやってみようと思って、
int x,y;
for(y=0,y<=10,y++){
for(x=0,x<=10,x++){
getpixel(img,x,y,&r,&g,&b);
printf("座標(%d, %d)のRGB値は(%d, %d, %d)です.\n",x,y,r,g,b);
}
}
と書いてみたのですが、エラーで実行できませんでした。
おかしいところを指摘していただけたら嬉しいです。
380デフォルトの名無しさん:2006/12/13(水) 22:17:21
エラーメッセージを書いて
381379:2006/12/13(水) 22:49:19
全source
#include <stdio.h>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
IplImage *img=0;
int getpixel(IplImage *image, int x, int y, int *r, int *g, int *b){
*r =(uchar) image->imageData[y *image->widthStep+ x * image->nChannels + 2];
*g =(uchar) image->imageData[y *image->widthStep+ x * image->nChannels + 1];
*b =(uchar) image->imageData[y *image->widthStep+x * image->nChannels];
return 0;
}

int main( int argc, char** argv ){
int x=240,y=370;
int r,g,b;
char* filename = argc == 2 ? argv[1] : (char*)"image.bmp";
if( (img = cvLoadImage( filename, 1)) == 0 )
return -1;
cvNamedWindow("Image", 1);
for(y=0,y<=10,y++){
for(x=0,x<=10,x++){
getpixel(img,x,y,&r,&g,&b);
printf("座標(%d, %d)のRGB値は(%d, %d, %d)です.\n",x,y,r,g,b);
}
}
cvShowImage("Image", img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("Image");
return 0;
}
382379:2006/12/13(水) 22:55:27
error
expected `;'before')'token
could not convert `cvShowImage(((const char*)"Image"),((const CvArr*)((void*)img)))' to `bool'
expected `)'before';'token
383デフォルトの名無しさん:2006/12/13(水) 22:56:23
よろしくおねがいします^^;
384デフォルトの名無しさん:2006/12/14(木) 00:06:01
>>379
取り敢えず、forの書式を直せ。
385デフォルトの名無しさん:2006/12/14(木) 01:17:20
>>379
for(y=0,y<=10,y++)
これじゃ0から10までの11回実行されるよ。
0,1,2,3,4,5,6,7,8,9,10 <-11個あるよね?
for(y=0,y<10,y++)
イコール無しだと0から9までの10回ループ。
0,1,2,3,4,5,6,7,8,9 <--10個
386デフォルトの名無しさん:2006/12/14(木) 01:21:37
>>385
>384
387デフォルトの名無しさん:2006/12/14(木) 01:23:21
>385
もっと大きな問題があるだろ。
コピペしといて気づかないのか?
388デフォルトの名無しさん:2006/12/14(木) 01:23:38
それと、forの中は、,じゃなく;だよ。
389デフォルトの名無しさん:2006/12/14(木) 01:28:19
ファイルが20個あってその20個について同じ処理をしたいのですが、
ファイルをループさせるにはどうすれば良いのですか?


390385:2006/12/14(木) 01:33:04
おぉ。すっかり見落としてた。
みんな目ぇいいな。
391歩歩:2006/12/14(木) 01:33:20
誰かこの問題を解いてください。
9〜11行目を別の関数(関数名FuncDev)とし、修正しなさい。ただし、グローバル変数は使わないこと。
また、FuncDev内のローカル変数名は任意とする。
FuncDev関数は以下の定義とする。
int FuncDev(void); FuncDev関数の戻り値は、画面入力されたint型データとする。

1:#include<stdio.h>
2:void main (void);
3:void main (void)
4:{
5:int n1,n2;
6:int nt;
7:nt=0;
8:for(n1=0;n1<10;n1++){
9:printf("0-9の数値を入力:");
10:scanf("%d",&n2);
11:nt -=n2;
12:}
13:printf("結果は%dです。",nt);
14:}

よろしくお願いします。
392デフォルトの名無しさん:2006/12/14(木) 01:41:11
ファイル名は用意しなきゃならんような…
新規で作るなら連番でfor回せば良いけど。
393デフォルトの名無しさん:2006/12/14(木) 01:44:23
>389
1.ファイル名を連番で用意する
2.ファイル名の入った文字列の配列を用意する
>391
int FuncDev(void){
int n;
printf("0-9の数値を入力:");
scanf("%d", &n);
return n;}

void main(void) {
int n, nt;
nt = 0;
for(n=0; n<10; n++) nt -= FuncDev();
printf("結果は%dです。", nt);
}

394デフォルトの名無しさん:2006/12/14(木) 01:46:49
>>392
返答ありがとうございます。
ファイル名をtest1.txt test2.txt …… test20.txt としたら
for文でどう書いたらよいのですか?
395歩歩:2006/12/14(木) 01:48:06
ありがとうございます
すごい助かりました
396デフォルトの名無しさん:2006/12/14(木) 01:52:30
>>394
ファイルへの書き込みの仕方はわかる?
for(i=1;i<21;i++)の中で、ファイルへの書き込みを回すだけ。
書き込む式のファイル名の部分を、test[i]とすれば、中身が同じな連番ファイルの出来上がり。
397デフォルトの名無しさん:2006/12/14(木) 01:52:31
キーボードから読み込んだ整数n以下の素数をすべて求め1行に12個表示させなさい。
という問題がまったくわかりません。どなたか教えてください・・
398デフォルトの名無しさん:2006/12/14(木) 01:58:45
>394
for(i=0; i<20; i++) {
sprintf(filename, "test%d.txt", i+1);
fp = fopen(filename,
399デフォルトの名無しさん:2006/12/14(木) 01:59:10
>>397
1以上の整数nが素数であるかどうかは、
n%2,n%3,n%4,n%…とやっていって、
n%(n-1)まで繰り返して(本当はもっと少なくて良いんだけど)、
一度も余りが0にならなかったら(つまり一度も割り切れなければ)素数。
ここから考えていけば作れると思うよ。
400デフォルトの名無しさん:2006/12/14(木) 01:59:29
>>397
キーボードからの入力と画面への出力
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
さぁ作れ。
401デフォルトの名無しさん:2006/12/14(木) 02:00:12
>>396
返答ありがとうございます。まだできません。
私はファイルからデータを読み込んで処理をしたいのです。
for(i=1; i<=20; i++){
   fp = fopen(test[i] , "r");
処理
   fclose(fp);
}
これで良いのでしょうか?
402399:2006/12/14(木) 02:00:27
1以上ってorz
1より大きい整数ね・・・
403デフォルトの名無しさん:2006/12/14(木) 02:02:44
test[i].txtだね。


404デフォルトの名無しさん:2006/12/14(木) 02:05:44
>397
1行に12個表示するということは、12個表示したら改行するということ。
カウンタを用意して素数を表示するたびに+1して12になったら改行すればいい。
405デフォルトの名無しさん:2006/12/14(木) 02:09:20
>>401
あぁ、ごめん。
398さんの方法でお願い。
惑わせまくってる・・・ちょっと吊って来る。
406歩歩:2006/12/14(木) 02:10:25
何度もすいませんがお願いします。
このプログラムのfor文をwhile文に修正しなさい。
#include<stdio.h>
void main (void);
void main (void)
{
int n1,n2;
int nt;
nt=0;
for(n1=0;n1<10;n1++){
printf("0-9の数値を入力:");
scanf("%d",&n2);
nt -=n2;
}
printf("結果は%dです。",nt);
}

ほんとお願いします。
407デフォルトの名無しさん:2006/12/14(木) 02:14:02
>406
初期設定部をwhileの前に置く。
条件判定部をwhileの括弧内に入れる。
インクリメント部をwhileブロック内の最後に入れる。
408デフォルトの名無しさん:2006/12/14(木) 09:27:19
コマンドライン引数で与えられたファイルを開いて、そのファイルの最初の1文字を表示するプログラムを作りたいんですが、
あえて関数を使うとすると、次のどちらのプログラムの方がよいのでしょうか?
1.
#include <stdio.h>
#include <stdlib.h>
void f(char *filename);
int main(int argc, char *argv[])
{
if (argc != 2) {
puts("error");
exit(1);
}
f(argv[1]);
return 0;
}
void f(char *filename)
{
FILE *fp;
char ch;
if ((fp = fopen(filename, "r")) == NULL) {
puts("error");
exit(1);
}
if (!feof(fp))
ch = fgetc(fp);
fclose(fp);
putchar(ch);
}
409408:2006/12/14(木) 09:28:27
2.
#include <stdio.h>
#include <stdlib.h>
void f(FILE *fp);
int main(int argc, char *argv[])
{
FILE *fp;
if (argc != 2) {
puts("error");
exit(1);
}
if ((fp = fopen(argv[1], "r")) == NULL) {
puts("error");
exit(1);
}
f(fp);
fclose(fp);
return 0;
}
void f(FILE *fp)
{
char ch;
if (!feof(fp))
ch = fgetc(fp);

putchar(ch);
}
410デフォルトの名無しさん:2006/12/14(木) 18:10:20
他のスレで見かけたんですけど、これ。
http://d.hatena.ne.jp/yaneurao/20061205
conitune以外で、forとwhileが等価でない箇所ってわかります?
411デフォルトの名無しさん:2006/12/14(木) 18:42:27
Windowsプログラミングって、C/WinAPIってことですか?
412デフォルトの名無しさん:2006/12/14(木) 20:31:22
基本的にはそれ。
場合によっては広義にMFCを使ったり.NET Frameworkを使ったものも含まれることがある。
413デフォルトの名無しさん:2006/12/14(木) 20:48:41
>>412
どうもです
414デフォルトの名無しさん:2006/12/14(木) 23:47:12
>>408
それだけではどちらともいえない。
それはさておき、fopen()直後のfeof()は無意味だ。
415デフォルトの名無しさん:2006/12/14(木) 23:47:54
>>408 私ならmainが小さくなる1だな。関数に分ける意味も出る。2だったらf関数はあまり意味が無い気がする。
#include <stdio.h>
void f(FILE *fp);
int main(int argc, char *argv[])
{
FILE *fp;
char ch;
if (argc != 2) {
puts("error");
return 1;
}
if ((fp = fopen(argv[1], "r")) == NULL) {
puts("error");
return 1;
}
ch = fgetc(fp);
if (ch == EOF) {
return 1;
}
putchar(ch);
f(fp);
fclose(fp);
return 0;
}
416デフォルトの名無しさん:2006/12/16(土) 01:59:58
main関数でX=5と値を入れ、次にaaaという関数を呼び出し
そのaaaでもX=5だと認識させるにはどうすればいいのですか?
417デフォルトの名無しさん:2006/12/16(土) 02:14:11
kwsk無いから良くわかんないけどグローバル変数じゃね?
418デフォルトの名無しさん:2006/12/16(土) 11:40:48
Xを変更しないならそのまま渡してやればいいだろうし、変更したいならポインタで渡せばいい。
419デフォルトの名無しさん:2006/12/16(土) 18:46:31
BCB6でソフトウェアキーボードを作ってみようと思うんですが、
keybd_eventのことについて全く知識がなく、検索かけてみたんですが、
あまり詳しく載っている所がありません。
加えて、文字を打ち込みたい箇所をアクティブにする操作も分からないので、
どなたか詳しく紹介されてあるページか、操作そのものを教えていただけると幸いです。。。。
420デフォルトの名無しさん:2006/12/16(土) 19:01:14
Win32APIのスレへどうぞ
421デフォルトの名無しさん:2006/12/19(火) 15:15:01
ダイテル本のp.p.128練習問題4.30「switch文をネストされたif/else文に書き換える」
書いてみたんですがうまく動きません。アドバイス頂けますか?

/* switch構造をif/else文に書き換える(リスト4.5) */
#include<stdio.h>

main()
{
int grade;
int aCount = 0, bCount = 0, cCount = 0, dCount = 0, fCount = 0;

printf("試験の成績(A,B,C,D,F)を入力してください。\n");
printf("入力を終了するには、EOFをタイプしてください。\n");
422421続き:2006/12/19(火) 15:15:55
while ( ( grade = getchar() ) != EOF) {
if( ( grade = getchar() ) == 'A' || grade == 'a' )/* 成績がAまたはaの場合 */
++aCount;
else if( ( grade = getchar() ) == 'B' || grade == 'b' )/* 成績がBまたはbの場合 */
++bCount;
else if( ( grade = getchar() ) == 'C' || grade == 'c' )/* 成績がCまたはcの場合 */
++cCount;
else if( ( grade = getchar() ) == 'D' || grade == 'd' )/* 成績がDまたはdの場合 */
++dCount;
else if( ( grade = getchar() ) == 'F' || grade == 'f' )/* 成績がFまたはfの場合 */
++fCount;
else if( ( grade = getchar() ) == ' ' || grade == '\n' )/* 空白改行は無視 */
;
else {/* その他の文字が入力された場合 */
printf("成績を表す文字が正しくありません。\n");
printf("もう一度、入力して下さい。\n");
}
}

printf("\n各成績の集計結果:\n");
printf("A: %d\n", aCount);
printf("B: %d\n", bCount);
printf("C: %d\n", cCount);
printf("D: %d\n", dCount);
printf("F: %d\n", fCount);

return 0;
}
423デフォルトの名無しさん:2006/12/19(火) 16:12:36
>>421
元のswitch使った方がどういうものかは知らないが、
if,else ifに入るたびにgetcharしてるのは問題ないのか?
424421:2006/12/19(火) 16:47:19
>>423
仰るように、{}内のgetcharは不要のようでした
ありがとうございました
425デフォルトの名無しさん:2006/12/20(水) 04:12:41
test
426デフォルトの名無しさん:2006/12/23(土) 13:34:14
NaNを変数に直接代入できないでしょうか?
今は

a=1/0;

のようにやっているんですが、スマートな記述法があったらご教授ください。
427デフォルトの名無しさん:2006/12/23(土) 17:56:06
>>426
1/0ではNaNにならないだろ。
それにそのコードは警告を出すコンパイラが多いだろうし、
場合によっては実行時に0除算の段階で異常終了する。
1./0.でも無限大であってNaNにはならない。

「NaNを変数に直接代入」ってのがNaNのリテラルが欲しいっていう意味なら、
処理系によってはNANみたいに定義されていることもあるので、
使ってる処理系のmath.h辺りを探してみ。
最近の処理系ならあると思うが、無ければ例えばIEEE754形式のNaNの表現に従って、
仮数部を非0、指数部を255にしたビットパターンを作って自分で定義してやればいい。
428デフォルトの名無しさん:2006/12/24(日) 19:27:13
ついさっきボーランドのコンパイラとBCC Developerをインスコして、
とりあえず色んなサイト見つつプログラム書いてみた。
440の音源を指定した周波数にずらすには、何セントずらせばいいかってプログラムなんだけど、
"log10 SIGN error"って出て上手くいかない。
#include <stdio.h>
#include <math.h>

main()
{
double Hz,cent;
int S;
char MSB,LSB;
printf("何Hz? > ");
scanf("%d", &Hz);
cent = 1200 * log10(Hz / 440) / log10(2);
printf("cent = %d\n", cent);
}

何か俺がCの書き方を勘違いしてるからなんだろうけど、誰かエロいひとおせーて。
429デフォルトの名無しさん:2006/12/24(日) 19:53:52
>>428
Hzがdoubleなのにscanf()で%dを指定しているから、まともに値を拾うことができていない。
その値がたまたま負となったために件のエラーが起きたのだろう。
従って、scanf()の指定を%lfにでもすればいい。
勿論、printf()も%g辺りにしておかなければいけないのは言うまでもない。
430デフォルトの名無しさん:2006/12/24(日) 20:30:09
>>429
ありがとう。ああ、%dとかにも種類があるんだね。
精進するよ。
431デフォルトの名無しさん: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
432デフォルトの名無しさん:2006/12/24(日) 21:56:54
>>431
 100 / 8192  == 0
でゼロ除算
 100.0 / 8192.0にしる
433デフォルトの名無しさん:2006/12/24(日) 22:05:36
>>432
サンクス。
434デフォルトの名無しさん:2006/12/25(月) 17:09:12
CとC++って根本的に何がどう違うんですか?
最初は何となく、Cはコンソール、C++はそれにウィンドウ表示ができるものと思っていたんですが、それも違うようです。

あと、ウィンドウを表示するアプリケーション(API?)の作り方が詳しく解説されてるサイトってありませんか?
それとも素直にVC++に移行した方がいいんでしょうか…?
435デフォルトの名無しさん :2006/12/25(月) 22:57:35
CでもC++でもウィンドウの生成は出来る
違いはCで言う構造体のパワーアップしたクラスというものと
コンテナという便利な物やその他Cで書くとめんどくさいアルゴリズム等
を用意してくれてる。
でもCだろうとC++だろうと、精度の高いプログラムを作れるかどうかは
結局本人のスキル次第
436デフォルトの名無しさん:2006/12/25(月) 23:18:40
つーかプログラミング言語と言語製品の区別ぐらいしろよ。
437デフォルトの名無しさん:2006/12/25(月) 23:24:03
>>434
本買え。
438デフォルトの名無しさん:2006/12/26(火) 04:10:23
>>434
C を基にしつつ、オブジェクト指向言語として新しく作られたのが 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
この辺を通読して試せば、だいたいは分かるようになるが・・・
439デフォルトの名無しさん:2006/12/26(火) 09:44:52
超初心者です。
scanfの練習をしていたんですが、上手く動いてくれません。
手本によれば、100と入力すると100.000000が表示される筈なのですが
何を入力しても、0.000000が表示されます。orz
見比べて入力間違いは無いと思うのですが…

どこに間違いが有るか教えて下さい。お願いします。


#include <stdio.h>

int main(void)
{
double data;
scanf("%If",&data);/*入力*/
printf("%f\n",data);
return 0;
}
440デフォルトの名無しさん:2006/12/26(火) 09:53:30
%lf
441439:2006/12/26(火) 10:14:17
>>440

解決しました。私の使っているエディターで『I』、『l』の
表示が同じだったので気付きませんでした。orz

どうもありがとうございました!
442デフォルトの名無しさん:2006/12/26(火) 10:23:00
そういうのをきちんと区別できるフォントにしたほうがいいよ。
443デフォルトの名無しさん:2006/12/26(火) 10:35:49
lfはlong floatだっけ
444デフォルトの名無しさん:2006/12/26(火) 13:57:43
>>435-438
ありがとうございます。
理解できました。

ウインドウアプリは少し面倒そうですが、がんばってみます。
445デフォルトの名無しさん:2006/12/26(火) 19:34:08
これからC言語を始めたいと思うのですが、初心者はとりあえずこれ使っとけみたいなコンパイラってどれですか?
プログラミングはJavaを少しかじった程度なのでどれを選んだら良いのかさっぱり分かりませんorz
446デフォルトの名無しさん:2006/12/26(火) 19:41:58
むしろいくつも使っとけ。
447デフォルトの名無しさん:2006/12/26(火) 19:49:09
>>445
Visual C++ Express
448デフォルトの名無しさん:2006/12/26(火) 19:50:55
今は無料でいろいろ試せるからなあ
449デフォルトの名無しさん:2006/12/26(火) 19:51:14
コンパイラによって実行ファイルの動作が違うからいくつも試したほうがいい。
450445:2006/12/26(火) 20:00:11
素早い回答ありがとうございます。
とりあえず>>447を使ってみようと思います。
451デフォルトの名無しさん:2006/12/26(火) 21:13:53
コマンドプロンプトでソースファイルの行数を調べる方法ありますか?

wc -l ソースファイル名

上記のコマンドでUNIX(?)では調べられるらしいんですが・・・
windowsMeではだめでした。
452デフォルトの名無しさん:2006/12/26(火) 21:48:10
Cygwinをインストールすればwcも使える。
それはともかくとして、行数数えるプログラムくらい自分で作ってみろよ。
453デフォルトの名無しさん:2006/12/26(火) 21:53:18
>>452

あやや!そう言われればそうでした!
ナイスですw
454デフォルトの名無しさん:2006/12/26(火) 21:56:13
ってかC関係ないじゃん…
findコマンドを応用すれば出来るから自分で考えれ
455デフォルトの名無しさん:2006/12/26(火) 22:42:15
>>454
C以外の事でしたね。すみません

ところでこの手の質問はどこにしたらいいのでしょうか?
探して見ましたが余り適当な所が見当たらなかったです。
456デフォルトの名無しさん:2006/12/26(火) 23:27:56
>>455
wcはcの入門書の例題によく出てくるから、まあ範疇でいいじゃない。 
wc sed grep lsなど簡単なunixコマンドは大抵win32版がgnuその他のフリーウェアで 
転がっているから、ググレば拾えるよ。 
457デフォルトの名無しさん:2006/12/26(火) 23:58:43
wcを作りたいって話じゃなかったろ…
>>455
Win板で見つからないなら探し方が悪いだけ
458デフォルトの名無しさん:2006/12/27(水) 00:10:29
>>456

了解です。只、あれば使って見ようって発想だったんで。プログラム世界のガキ状態ですw

>>457

何かを作るというより、何かを利用して試したいという段階なんでこれ以上の思惑はないですよ。


只、wcと等価なプログラムを自分で作れっていいうその発想自体が刺激的で勉強になりました。
三四郎じょうたいですねw
459デフォルトの名無しさん:2006/12/27(水) 00:22:25
>>458
会社の新人に、wc -l相当を作らせた。
できてきたから今度は各行の桁数をカウントさせた。
#wcにはない機能だ。
「wcを自力で拡張した」気になって楽しかったそうだ。
460デフォルトの名無しさん: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;
}
461デフォルトの名無しさん:2006/12/27(水) 15:29:45
質問です。
関数を二つ使うプログラムで変数を共有する方法を教えてください
大局変数で出来るかと思ったのですが、
同じ変数は使えるけど値が共有されてなかったみたいなので・・・
462デフォルトの名無しさん:2006/12/27(水) 15:39:39
グローバル変数でOK
もしかして別ファイルで変数定義をヘッダに入れて static つけたりしてないか?
463デフォルトの名無しさん:2006/12/27(水) 15:41:17
>>461
大局変数でできます。
464デフォルトの名無しさん:2006/12/27(水) 15:42:36
>>461
マルチスレッドとかはやってないよね?
465461:2006/12/27(水) 15:47:26
>>462-464
あれ・・できるんですかorz
すいませんもうちょっと見直してきます
staticやマルチスレッドがどういうものなのかも分からん初心者ですいません
466デフォルトの名無しさん:2006/12/27(水) 16:21:32
その変数を使用する関数より(ソース上で)先に宣言されてないとグローバルであっても使えない
467デフォルトの名無しさん:2006/12/27(水) 17:29:09
グローバルで宣言したのと同じ名前の変数を関数内で宣言してない?
468461:2006/12/27(水) 19:32:36
>>466-467 それはたぶん大丈夫だと思います
実は学校で出された課題で
f(関数fib)を読んだ数をカウントしろというものです

#include<stdio.h>

int t;

int fib(int n){
int fn;
t++;
printf("%d\n", time);
if(n == 1 || n == 2)fn = 1;
else fn = fib(n-1) + fib(n-2);
return fn;
}

int main(){
int n;
char buf[256];

printf("与えられたnに対してフィボナッチ数f(n)を返します。\nn: ");
fgets(buf, 256, stdin);
sscanf(buf, "%d", &n);
printf("f(%d) = %d, f は %d 回呼ばれました。", n, fib(n), t);
}
469デフォルトの名無しさん:2006/12/27(水) 19:47:58
>>468
それ、何を持って違うと判断した?
tはグローバル変数だから、0に初期化されてるが
printf の引数は右から積むから、printfにはtが0のままセットされるよ
関数fib()を呼び出すのはその後だから、違うように見える
470デフォルトの名無しさん:2006/12/27(水) 19:52:04
>>469
おおおお!ありがとうございます!!
順番のことなんてまったく思いつきませんでした
printfは右からだったなんてまったく知りませんでしたorz
おかげで動きました!!
471デフォルトの名無しさん:2006/12/27(水) 19:54:51
いわゆる副作用ってやつだ。
関数の引数は評価の順番に依存してはいけない
472デフォルトの名無しさん:2006/12/27(水) 22:12:29
プログラムでそのプログラム中で使われる変数名や関数名を記憶している領域から
任意の変数名や関数名を取り出して表示することって出来ますか?
473デフォルトの名無しさん:2006/12/27(水) 22:30:01
>>472
デバッグオプション付きでコンパイル + デバッガ
474デフォルトの名無しさん:2006/12/27(水) 22:44:26
>>473
そっか、確かにそういう作業ってデバッグだと必要ですよね、ありがとうございます
まずは使えるようにするところからか…
475デフォルトの名無しさん:2006/12/28(木) 01:05:53
>>460
色々なってない。特に酷いのはCRだ。
476デフォルトの名無しさん:2006/12/28(木) 13:01:04
すいません。初めての書き込みです。プログラム初心者、というか何も勉強していないのですが、
このような問題を解決しなければならなくなってしまいました。どうか教えてください。課題を教えてくださるスレッド(?)が書き込みできなくなっていたので、
こちらに書き込ませていただきました。
【質問テンプレ】
[1] 授業単元:基礎情報処理
[2] 問題文:縦100横100のマス目(点)に分けられた紙の各点が、白と黒に塗り分けられたものを考える。この中に、下にある様な黒い点で囲まれた図形が1つだけある。図形は必ず、黒い点で囲まれており、
内部は白い点で埋め尽くされている。この「囲まれている」とは、各黒い点の上下左右および8つの点のどれかが黒い点となっているものと考えよう。
□□□□□□□□□□
□□■■■■■■□□
□■□□□□■□□□
□□■□□□□■□□
□□■□□□□■□□
□□■■■■■■□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
この図形は整数値の2次元配列(例えばC言語ならa[y,x])で表されている。x軸は左から右、y軸は上からしたとするので、a[1,1]は一番左上の点になる。この配列はプログラムに入る前に何らかの方法で、白い点は0、黒い点は1になっているものとする。
さて、図形の面積、つまり黒い点で囲まれた内部の「白い点」の数を数えるプログラムを考えよう。ただし図形は必ず紙の上に1つだけ存在し、また必ず紙の端から点1つ以上ずつ少し離れた位置にあるとする(つまり黒い点は紙の上下左右の端には存在しない)。
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ名とバージョン: すみません、よくわかりません
 [3.3] 言語: なんでもかまいません。
[4] 期限: 2007年1月5日0時まで
[5] その他の制限:まだ何も習っていません。具体的に回答を提示してくれると助かります。
477デフォルトの名無しさん:2006/12/28(木) 13:17:17
無関係なスレにマルチするような馬鹿に教える気はない
478デフォルトの名無しさん:2006/12/28(木) 13:26:09
まずはローカルマナーだな
479デフォルトの名無しさん:2006/12/28(木) 16:02:13
生瀬智也です
480デフォルトの名無しさん:2006/12/28(木) 22:36:47
「メモリのオーバーレイ」
という技法はC言語の範囲で実現可能ですか?


昔はゲーム等でよく使われてた方法みたいですが
481デフォルトの名無しさん:2006/12/28(木) 22:43:12
できるけど、今は仮想記憶当たり前だから使わんよ
482デフォルトの名無しさん:2006/12/28(木) 22:59:07
確かにメモリが厳しかった頃、関数ポインタを求めて、そこに直接
別の関数をロードするなど、今からすれば考えられないような
汚いテクニックが当たり前のように使われていた時代がある。

家庭用ゲーム機には仮想記憶がないので、未だにオーバーレイが
使われている。
483デフォルトの名無しさん:2006/12/29(金) 03:01:24
メモリロックとか言うやつだっけ?
484デフォルトの名無しさん:2006/12/30(土) 21:40:53
整数型引数fillCharacterで指定された文字を使って、
任意の長さの正方形をプリントする関数を書いているのですが、
以下のコードを実行すると、数字以外の文字は0で表示されてしまいます。
おそらくデータ型の宣言に問題があると思うのですが、どうして問題かも分からないレベルです。
ご教授ください

/* 正方形描写関数 */
#include<stdio.h>

void drawSquare(int, int);
main()
{
int Side, fillCharacter;
printf("***正方形プリントプログラム***\n\n");
printf("整数を入力して下さい: ");
scanf("%d", &Side);
printf("文字を指定して下さい: ");
scanf("%d", &fillCharacter);
drawSquare(Side, fillCharacter);

return 0;
}
void drawSquare(int x, int y)
{
int counter1, counter2;
for(counter1 = 1; counter1 <= x; counter1++){
for(counter2 = 1; counter2 <= x; counter2++)
printf("%d", (char)y);
printf("\n");
}
}
485デフォルトの名無しさん:2006/12/30(土) 22:11:39
>484
> scanf("%d", &fillCharacter);
おかしいだろ。
486デフォルトの名無しさん:2007/01/01(月) 08:25:50
あけましておめでとう。

%dは数値を扱う時な。
マルチバイト文字考えないなら
変数fillCharはchar型で足りるし%cでいい
487デフォルトの名無しさん:2007/01/01(月) 09:35:04
文字出力なんて、普通に英語使えば十分。
おまいら義務教育で英語習ったよな?
488デフォルトの名無しさん:2007/01/01(月) 09:39:09
あに言ってんだおめ
489デフォルトの名無しさん:2007/01/01(月) 16:19:35
お前が義務教育で日本語習ってないのはわかった
490デフォルトの名無しさん:2007/01/02(火) 00:35:16
わざわざ日本語の義務教育受けてる在日乙。
日本語学校に通って、卒業証書貰えよ。
491デフォルトの名無しさん:2007/01/02(火) 00:49:37
さいた さいた さくらが さいた
492デフォルトの名無しさん:2007/01/02(火) 01:23:05
スレ違いもたいがいにしろ
邪魔だ
493デフォルトの名無しさん:2007/01/02(火) 03:00:37
>>485>>486
ありがとうございます >>484のコードを

関数プロトヤイプ void drawSquare(int, int);→void drawSquare(int, char);
変数宣言 int Side, fillCharacter;→int Side;char fillCharacter;
fillCharacterのscanfの変換仕様 %d→%c
関数定義 void drawSquare(int x, int y)→void drawSquare(int x, char y)
定義内側のfor内printfの変換仕様 %d→%c

のように変えてみたのですがうまく動きません
このようにした場合、どこに問題がおきるのでしょうか?
自分も日本語には自信がないのですがC言語になるとサッパリです・・
494デフォルトの名無しさん:2007/01/02(火) 04:22:05
>493
バッファに残った改行文字を文字として読み込んじゃってるから。
scanf("%c", &fillCharacter); → scanf(" %c", &fillCharacter);
にすれば改行文字を読み飛ばせる。
495デフォルトの名無しさん:2007/01/02(火) 04:46:12
>>494
ありがとうございます
この手のミスは参考書だけでなかなか身に付くものではないので参考になりました
496デフォルトの名無しさん:2007/01/02(火) 13:55:02
そりゃまぁ、typoは参考書を読んでも直せないな。
497デフォルトの名無しさん:2007/01/02(火) 18:57:44
ミスが身に付くのもどうかと思うけどな
言いたいことは分かるけど
498デフォルトの名無しさん:2007/01/04(木) 02:01:32
#include <stdio.h>
int main(void)
{
int mokuhyou, sumple, sankaryou, tounyuu;

printf("目標値を入力して下さい");
scanf("%d", &mokuhyou);
printf("サンプル値を入力して下さい");
scanf("%d", &sumple);
printf("酸化量を入力して下さい");
scanf("%d", &sankaryou);

tounyuu = ((mokuhyou - sumple) * 11.7 + sankaryou) / 0.97 / 0.35;

printf("入力した数値\n 目標値:%d\n, サンプル値:%d\n, 酸化量:%d\n\n, 計算された加炭材投入量:%d",
mokuhyou, sumple, sankaryou, tounyuu);


}


仕事で使えたら便利なのでこんなん作ったんだけど、どうしても小数点で
計算ができないんだ…。上のは書式制御文字を%dでやってるんだけど、
これだと計算は正しいんだけど計算結果の小数点を切り捨てて表示され
てしまう。つかどっちにしても計算のために入力する数値が小数点使う
場合もあるんで、仮に四捨五入やってくれるとしてもこれじゃあ使えない
んだけど。
かと言って%dを%fに変えると、今度はちゃんと計算しやがらねえ…。
これどこが悪いん?サンプル値や目標値にも小数点使う場合があるんで、
そういう風に修正するにはどうすればいいだろう。
499デフォルトの名無しさん:2007/01/04(木) 02:16:42
>>498
一番簡単で、単純な方法だと、

int mokuhyou...のところをdouble型にする
入力書式%dを%lfにする
最後に、出力書式%dを%fにする

でおk。
500デフォルトの名無しさん:2007/01/04(木) 02:48:52
>>499
ごめん、調べても分からなかったんだけど、double型にするにはどうしたらいいの?
本を読んでも、どーも計算させるプログラムについて深く説明してくれてないから
よく分からん…。
んで%lfってのは%fとかと同じく小数点を扱う書式制御文字ってことでおk?
501デフォルトの名無しさん:2007/01/04(木) 02:49:03
仕事で使えたら便利だから作ったとか言う割に小数にint・・・
502デフォルトの名無しさん:2007/01/04(木) 02:59:25
#include <stdio.h>
int main(void)
{
double mokuhyou, sumple, sankaryou, tounyuu;

printf("目標値を入力して下さい");
scanf("%lf", &mokuhyou);
printf("サンプル値を入力して下さい");
scanf("%lf", &sumple);
printf("酸化量を入力して下さい");
scanf("%lf", &sankaryou);

tounyuu = ((mokuhyou - sumple) * 11.7 + sankaryou) / 0.97 / 0.35;

printf("入力した数値\n 目標値:%f\n, サンプル値:%f\n, 酸化量:%f\n\n, 計算された加炭材投入量:%f",
mokuhyou, sumple, sankaryou, tounyuu);

return 0;
}
503デフォルトの名無しさん:2007/01/04(木) 04:00:50
>>502
おおっ、ありがとん!これだよ俺が求めてたものはー。

ってか職場でW-ZERO3に入れて使おうと思ってたんだが、
W-ZERO3でC言語動かすソフトが見当たらねorz
でも勉強になった。ほんとありがとう。
504デフォルトの名無しさん:2007/01/04(木) 08:53:28
>>503
W-ZERO3ってExcel載ってなかった? >502程度の内容ならExcelで充分でしょ。
#VBAさえ必要なかろうし。
505デフォルトの名無しさん:2007/01/12(金) 14:28:39
以下のプログラムをコンパイルして実行させると、
b->i=0
(b + 1)->i=1
のように出力されます。
(あ)行では、a型の構造体の1件分しかメモリを確保していないのですが、
何故、(い)、(う)行が正しく動作しているのでしょうか?
((b + 1)の領域は確保されていないですよね?)

#include <stdio.h>
#include <stdlib.h>
struct a {
int i;
};
main() {
struct a *b;

b = (struct a *)malloc(sizeof(struct a) * 1);   ←(あ)
b->i = 0;
(b + 1)-> = 1;    ←(い)

printf("b->i=%d\n", b->i);
printf("(b + 1)->i=%d\n", (b + 1)->i);    ←(う)
}
506デフォルトの名無しさん:2007/01/12(金) 14:30:16
訂正します

×:(b + 1)-> = 1;    ←(い)
○:(b + 1)->i = 1;    ←(い)
507デフォルトの名無しさん:2007/01/12(金) 14:37:13
>>505
正しく動作していると何故判断できる?
正しく動作しているように見えるが、実は正しく動作していないかもしれないじゃないか。

つまり、その辺りは「動いたからOK」と判断せず、正しいプログラムを書くように心掛けなければならないと言うことだ。
508デフォルトの名無しさん:2007/01/12(金) 14:41:55
>>507
助かります即レスありがとうございます

やはり、(い)、(う)行が動作したのは偶然と考え、(あ)行で2件mallocするのが
規格に則ったC言語の処方なのでしょうか?

疑問に思ったのは、実行時にセグメンテーションエラーが出なかったことなのです。
メモリ上に存在しない(b+1)領域を参照してるのに、なぜプログラムが落ちないのか、
それが不思議でなりません。
509デフォルトの名無しさん:2007/01/12(金) 14:53:03
>>508
それはね、ライブラリとしては1個分*だけ*確保した積もりでも、
環境(OS)の都合で4個分とか8個分も確保してくれちゃったからなのよ。
#b[4].i = 1;で落ちるかb[8].i = 1;で落ちるか、或いはもっといけるか試してみるといい。
510デフォルトの名無しさん:2007/01/12(金) 14:53:53
Cのライブラリの方で大きめにとったヒープから切り出してるかもしれんし
mallocの最小単位のサイズがそこでとった量より大きいのかもしれんし
511デフォルトの名無しさん:2007/01/12(金) 15:05:30
>>509
>>510
疑問が解けました、本当にありがとうございます。
試してみたところ(b + 33789)でセグメンテーションエラーが出て落ちました!
mallocってメモリを余分に確保するんですね、
Cの参考書に書いてないし全然知らなかった・・。
512デフォルトの名無しさん:2007/01/12(金) 16:16:48
>>511
参考のために聞いておきたいんだけど、コンパイラは何を使ってるの?
513デフォルトの名無しさん:2007/01/12(金) 16:33:21
ハリコの虎見てちんちんおっきおっき


こ の 書 き 込 み を 見 た 人 は 三 年 後 に イ ン ポ に な り ま す 。

イ ン ポ に な っ て オ ナ ニ ー が 出 来 な く な る の が 嫌 な 人 は
こ の 書 き 込 み と 同 じ 文 章 を 三 時 間 以 内 に
違 う ス レ に 五 回 以 上 コ ピ ペ し て く だ さ い 。

五 回 書 き 込 ま な か っ た 男 子 学 生 が
書 き 込み を 見 た 後 三 年 後 に イ ン ポに な り ま し
514デフォルトの名無しさん:2007/01/12(金) 17:41:34
同じ型へのポインタで、単なるポインタの比較に意味がないシステムって例えばどういうのでしょうか?
515デフォルトの名無しさん:2007/01/12(金) 17:47:45
よくわからんけどメモリマップドI/O使ってるとか?
516デフォルトの名無しさん:2007/01/12(金) 17:48:34
文字列とかは?
同じ文字列でもアドレスは違うし
517514:2007/01/12(金) 18:08:55
すみません、微妙に文を間違えてました
K&RのP229、UNIXの記憶割り当てのところで確保したブロックへのポインタが
意味のある形で比較できることが前提になっているのですが

「標準規格が許すのは配列の中でのみのポインタの比較である。
したがってこの版のmallocは、一般的なポインタ比較に意味がある
マシンの間でのみ同じように通用する。」

とあって、意味がない場合と言うのが気になりました

>>515
メモリマップドI/Oがまだ良く分からないのですが、
ポインタがメモリアドレスを指しているわけではない場合ということですか
>>516
説明不足ですみません、マシンの方の問題らしいです
518デフォルトの名無しさん:2007/01/12(金) 18:27:31
>>517
本の前提やコードが判らんからなんとも言えんが、
malloc()で確保したメモリ同士を比較することに意味がない環境は在り得る。
例えば次の結果は予想不可能だ。
int main()
{
void * p1 = malloc(1);
void * p2 = malloc(1);
printf("p1 %s than p2.\n", p1 < 2 ? "less" : "greater");
return 0;
}
519517:2007/01/12(金) 18:58:26
>>518
検索したら丁度本の内容ががこのサイトにありました
ttp://math.ut.ee/~soolo/knr2/chapter8.html
8.7節の二枚目の画像の下辺りからです、何度も後出しですみません…
520デフォルトの名無しさん:2007/01/12(金) 19:07:50
こいつは malloc の実装についてだぞ
521デフォルトの名無しさん:2007/01/12(金) 19:29:19
>こいつは malloc の実装についてだぞ
あ、最初からそういう風に言えばよかったんですね…orz
522デフォルトの名無しさん:2007/01/12(金) 19:36:24
ということは>>518の指摘であってるじゃん
523517:2007/01/12(金) 20:11:45
あ、メモリアドレスはあくまでアドレスだから配列の中でないと
比較しても意味がない環境はあり得るって意味でしたか
自分が変に難しく考えてただけっぽいですね、ありがとうございました
524デフォルトの名無しさん:2007/01/13(土) 05:11:43
超初心者です。
2枚の画像を任意の場所で重ねて一枚の画像として
出力するにはどのように考えればよいのでしょうか?

環境
winXP Visual C++.NET 2003 コンパイラ(?)→コマンドプロンプト
525デフォルトの名無しさん:2007/01/13(土) 05:14:27
↑ Visual Studio.NET 2003の誤りです。
すいません。
526デフォルトの名無しさん:2007/01/13(土) 07:02:07
>>524-525
スレ違い。
Visual Studioスレに行け。
527デフォルトの名無しさん:2007/01/13(土) 12:47:08
>>526
Visual Studioうんぬんというより、c言語を使って上記の作業を行う場合、
基本的にどのような流れを組むかアドバイスしてほしいです。

初心者ですいません。
528デフォルトの名無しさん:2007/01/13(土) 12:57:34
>>527
画像や画像表示はJavaのように言語や標準のライブラリ等の機能としてあれば説明できるが、
C言語の場合言仕様語にも標準のライブラリにも含まれない。
このため画像表示に関しては多くの場合プラットフォームや外部のライブラリに依存することになる。
そうであるためVSやVCスレでいう結論になる。

これでいい?
529デフォルトの名無しさん:2007/01/13(土) 13:55:59
誘導先はこっちがいいじゃない

【初心者歓迎】C/C++室 Ver.33【環境依存OK】
530527:2007/01/13(土) 15:16:25
>>528,529
ありがとうございます!
531デフォルトの名無しさん:2007/01/14(日) 08:38:43
C言語のプログラムから電卓などのアプリケーションを呼び出すにはどうすればいいでしょうか?
532デフォルトの名無しさん:2007/01/14(日) 10:22:19
>>531
system()
533デフォルトの名無しさん:2007/01/14(日) 10:22:49
それも環境依存ですね、>>529
534デフォルトの名無しさん:2007/01/14(日) 10:49:33
system()は標準だと思う。
fork exec とか spawnは環境依存。
535デフォルトの名無しさん:2007/01/14(日) 14:05:09
int f(int n)ってどういう意味なんでしょうか?
どなたか教えてください
536デフォルトの名無しさん :2007/01/14(日) 14:52:48
引数がint型でnに値渡しで渡して
関数f内でnをつかっていろいろ処理して
戻り値もint型なのでそのいろいろ処理した結果をint型で戻す
537デフォルトの名無しさん:2007/01/14(日) 15:03:04
>>536
ありがとうございます!!!

もう1つあるのですが、よかったら教えてください。
for(p=2; p*p<=n; ++p)
 for(;n%p==0; n/=p)

というfor文なんですが
上の行は /*pを2から1つずつ増やしていき、p*p がn以下の時、以下を計算*/
という意味でいいでしょうか?

下の行はよくわかりません。。。


538デフォルトの名無しさん:2007/01/14(日) 15:10:21
>>537
pを2から始めて、p*pがn以下であるという判定が正しい時、以下を計算し、pを1増やして、判定以降を繰り返す。
nをpで割った余りが0であるという判定が正しい時、以下を計算し、nをpで割ったものをpに代入し、判定以降を繰り返す。
539デフォルトの名無しさん:2007/01/14(日) 15:14:16
>>538
すごく論理的でわかりやすいです。
助かりました、ありがとうございました。
540デフォルトの名無しさん:2007/01/14(日) 21:41:18
Windows
VC++2005です。

Mezegisのような、加速器を作りたいと考えています。
一応、資料等を探してはみたのですが、全くありませんでした。
どなたか資料等や、必要なAPIや、サンプルコード等を教えて頂けませんでしょうか。
よろしくお願いいたします

Mezegisというのはttp://hp.vector.co.jp/authors/VA017297/のRagud Mezegisです。
541デフォルトの名無しさん:2007/01/14(日) 21:46:41
作者に訊くのは?
542デフォルトの名無しさん:2007/01/14(日) 21:51:58
>>541
それが、Delphi製ということなので・・・
何かしらのヒントにはなると思っていますが・・・。。すみません
543デフォルトの名無しさん:2007/01/14(日) 22:07:38
まぁ、このスレじゃ残念ながら性格悪い奴らばかりで、知ってても教えてもらえないと思うから、
http://pc10.2ch.net/test/read.cgi/tech/1166172047/
http://pc10.2ch.net/test/read.cgi/tech/1168708801/
とかで訊いてみるのがいいかも。
544デフォルトの名無しさん:2007/01/14(日) 23:38:53
>>544
ありがとうございます。
本文コピペですが、そちらに貼らせて頂きます..
545デフォルトの名無しさん:2007/01/15(月) 00:25:11
スタックオーバーフローを予防するためには、「できるだけヒープを使う」ことしかないのですか?
プロの人は、「今ココでスタックを256バイト使っている」とか、計算しながら書いたりするのでしょうか。
デバッグ中に、スタックの使用量を求めることは出来るのでしょうか。
546デフォルトの名無しさん:2007/01/15(月) 00:44:35
環境依存
547デフォルトの名無しさん:2007/01/15(月) 01:54:13
組み込み系だとほんとに計算しながらやってたりしたな
今はどうか知らんが
548デフォルトの名無しさん:2007/01/15(月) 19:11:47
main関数の引数のことで質問です。

main(int argc, char *argv[])
の*argv[]が**argvでもいいみたいなんですが、
*argvでなく**argvなのはなぜでしょうか?
549デフォルトの名無しさん:2007/01/15(月) 19:55:55
*argv
だと文字列いっこじゃね?
550デフォルトの名無しさん:2007/01/15(月) 22:03:20
>>548
配列とポインタの関係が理解できてない。
参考書があるなら、配列の項目をしっかり読むといい。
551デフォルトの名無しさん:2007/01/15(月) 22:35:39
質問です。
getch0()というのはどういう意味なんでしょうか?
getch()がキーボードから1文字読み込むものだというのは分かったのですが
0っていうのがさっぱり分かりません・・・
552548:2007/01/15(月) 23:16:52
>>549 >>550
ありがとうございます。
アドバイスを参考に復習してきます。

インターネットで調べつつやっているんですが、
参考書みたいなものはあったほうがいいんでしょうか?
553デフォルトの名無しさん:2007/01/15(月) 23:36:33
>>551
その関数を作った香具師に聞け。
554デフォルトの名無しさん:2007/01/16(火) 00:15:44
>>552
俺もインターネットで学習した人だけど、やっぱり参考書があったほうがいい。
資金がつぎ込まれているものはやはり完成度、確かさが違う。

金を出すのがイヤなら、学校や町の図書館で借りるのがいいかと。
555デフォルトの名無しさん:2007/01/16(火) 00:17:35
>>552
C言語の本は星の数ほどあるけれど、これ以外読む必要はない
SEでこの本を読んでない奴はモグリ
ちなみに>>548の回答もズバリ「5.10コマンド行の引数」に書かれている

プログラミング言語C ANSI規格準拠 (単行本)
B.W. カーニハン (著), D.M. リッチー (著), 石田 晴久 (翻訳)
556デフォルトの名無しさん:2007/01/16(火) 00:36:37
すいませんがこの問題が解けなくて困ってます
誰かヒントをもらえるとたすかりますm(__)m

cos(x)をマクローリン展開してxに対して第n項まで計算して
cos(x)の近似値を取り値とする関数double Maclaurin_cos(double x,int n)を
作成しなさい。
次に、x=-π/2からx=π/2までを256分割した場合に
テイラー展開の第N項まで計算した時のグラフの面積S(TN)とcos(x)のS(cos)を
求め、以下の式で求めたエラーが5%以下になるNを求めなさい。

Error=|S(TN)-S(cos)|/|S(cos)|×100[%]

557548:2007/01/16(火) 00:37:00
>>554 >>555
購入してみようと思います。
ありがとうございました。
558548:2007/01/16(火) 01:01:17
すみません、
argvには直接文字が直接わたってくると勘違いしていたみたいです。
argvには文字列へのアドレスが渡ってきて、
*argv=argv[0]=文字列へのアドレス(プログラムのあるアドレスの文字列)、
そして、**argvで文字列の最初の文字を見られる。
最初にポインタがわたってくる(?)から**argvということでいいんでしょうか。
559デフォルトの名無しさん:2007/01/16(火) 01:01:49
>>548

If 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
560555:2007/01/16(火) 01:03:16
>>557
ごめん偉そうな事書いたけど
頭ごなしに信用して買うんじゃなくて、一応中確認してから買ってね
やっぱ生理的に合わない文体もあるから
でも俺は今のところ、この本を読んで解決しなかった謎はないよ
(理解できる範囲で)
あと周りの人必ず誰か持ってると思うんで、借りてみるのもいいよ
561デフォルトの名無しさん:2007/01/16(火) 01:13:37
>>558
概ねそれで正解。
argvで渡されるのは、複数の文字列のポインタが詰まった配列。
最初のポインタは、最初のコマンドライン引数の一文字目ということになる。

したがって、i番目のコマンドライン引数にアクセスする場合は、arg[i]となる。
その中のj番目の文字にアクセスする場合は、arg[i][j]となる。

理解するのが面倒だが、がんばれ。
562548:2007/01/16(火) 01:41:26
よく読まない癖が出てみなさんに迷惑をかけてしまい申し訳ありませんでした。

>>559
英語はあまりできないので、時間はかかりそうですが少しずつ読んでみたいと思います。
むしろ、英語の勉強になりそうです。

>>560
プログラミングに関係ない環境にいるので、持ってる人はいないと思います。
でもかなりいい本みたいなので買ってみたいと思っています。

>>561
なるほど、すっきりしました。
argv[0]には文字が入ってると勘違いしていて1日くらいずっとループしてました。

もっともっと勉強して、いろいろなプログラムが書けるよう頑張りたいと思います。
みなさん本当にありがとうございました。おやすみなさい。
563デフォルトの名無しさん:2007/01/16(火) 16:47:39
>>561
argvの最初のポインタは、最初のコマンドライン引数へのポインタでなく、
コマンドそのものの文字配列へのポインタ。
したがって、
> i番目のコマンドライン引数にアクセスする場合は、arg[i]となる。
は正しい。argvの添字は0から始まるから。
564デフォルトの名無しさん:2007/01/16(火) 17:46:51
関数のポインタを利用したジャンプテーブル

ジャンプテーブルとはどういう意味、モノですか?
565デフォルトの名無しさん:2007/01/16(火) 18:10:47
>>564
処理の行き先を定義したテーブルのこと。
#include <stdio.h>
void fn1() { puts("function 1"); }
void fn2() { puts("function 2"); exit(0); }
void fn3() { puts("function 3"); }
int main(void)
{
void (*jump_table[])(void) = {fn1, fn2};
jump_table[0]();
puts("i return.");
jump_table[0] = fn3;
jump_table[0]();
puts("i return.");
jump_table[1]();
puts("i return.");
return 0;
}
関数へのポインタの配列を用意して、その配列の要素を関数として呼び出す。
このポインタの配列を関数のポインタを利用したジャンプテーブルという。
テーブルの内容を途中で書き換えるような使い方もできるし、
呼び出し先から戻ってこないようにすることもできる。
566デフォルトの名無しさん:2007/01/16(火) 20:26:56
#include <stdio.h>

int main()
{
char str[] = "This is a pen.";
int count = 0;
int i;

for(i=0; str[i] != '\0'; i++);
if(str[i] == ' ')
count++;

printf("sp = %d\n", count);

return 0;
}

"This is a pen."に含まれる空白(スペース)の数を表示するプログラムを作りたいのですが、↑のものをコンパイルして実行しても実行結果は「sp = 0」となってしまい、うまくいきません。どう改善すればいいのか教えてもらえないでしょうか。
567デフォルトの名無しさん:2007/01/16(火) 20:29:08
> for(i=0; str[i] != '\0'; i++);
                 ↑
568デフォルトの名無しさん:2007/01/16(火) 21:12:02
>>566
初心者のうちは、for文やif文の中身が単文であっても、
できるだけ{}で囲う癖をつけておいた方がいいよ。
そうすればそういう凡ミスは防げる。
569566:2007/01/16(火) 21:21:34
>>567
アー!!
ifに気をとられてました・・・。いつもこんなんで詰まっちゃう(TT

>>568
そうですか〜。教科書の例題なんかのをよくわからずに真似しちゃってました


回答ありがとうございました。
570デフォルトの名無しさん:2007/01/16(火) 21:25:09
>>569
printfをいろんなところに入れてデバッグする癖をつけろ
さらにバグ出すかもしれんが
571デフォルトの名無しさん:2007/01/16(火) 21:45:36
PSPでプログラミングをしたいと思っている者です。
画像を扱うとき、バックバッファはどうやって作ればよろしいでしょうか?
572デフォルトの名無しさん:2007/01/17(水) 06:09:25
文字コードってポインタ?
573デフォルトの名無しさん:2007/01/17(水) 06:32:03
いいえ
574デフォルトの名無しさん:2007/01/17(水) 08:13:59
数と文字を一対一で対応させてるのがそれっぽく感じるけど、さすがに無理があるかー
575デフォルトの名無しさん:2007/01/17(水) 11:42:58
#include <iostream>
using namespace std;

int main(void)
{
unsigned char x,y;

cout << "2つの値を入力してください。\n";

cin >> x >> y;

int a = x + y;
int b = x * y;

printf("x = %d, y = %d, x + y = %d, x * y = %d",x,y,a,b);

return 0;
}
どうすればunsigned charの文字をそのまま整数として吐き出せるんでしょうか?
576デフォルトの名無しさん :2007/01/17(水) 12:06:34
>>575
もう何がしたいのかわからねぇ
C++したいの?
Cしたいの?
どっちなのーーーーーー
577デフォルトの名無しさん:2007/01/17(水) 12:16:02
C++っす
578デフォルトの名無しさん:2007/01/17(水) 12:22:48
ここはC言語のスレっすよ!
579デフォルトの名無しさん:2007/01/17(水) 12:34:23
>>575
'1'を 1 にしたいってことかな
x -= '0';
y -= '0';
580デフォルトの名無しさん:2007/01/17(水) 15:17:31
C言語でsin(2πf)みたいなπと、変数fを使いたいときはどうすればいいんですか?
include math.hってのはわかるんですが、
sin(2*3.14*f)ってすればいいんですか?
πをあらわすのって無理なんでしょうか
581デフォルトの名無しさん:2007/01/17(水) 15:19:23
>>580
M_PI
582デフォルトの名無しさん:2007/01/17(水) 15:23:37
M_PIでいける処理系も多いけど標準じゃないようなので、
math.hの中を検索して定義されていなければ、
自分で定数として定義するか、そのまま値を式に書くかする。
583デフォルトの名無しさん:2007/01/17(水) 15:25:15
宿題ぐらいなら π=3.14 とするみたいに定義してあるだろ。多分。
584デフォルトの名無しさん:2007/01/17(水) 16:31:18
π=およそ3
585デフォルトの名無しさん:2007/01/17(水) 18:06:08
π = 3 だろ。常識的に考えて・・・
年寄りは奇妙な無理数であると信じているから困る。

ソース http://ja.uncyclopedia.info/wiki/%E5%86%86%E5%91%A8%E7%8E%87
586デフォルトの名無しさん:2007/01/17(水) 18:07:07
>>580
double MY_PI = 4 * atan(1);
587デフォルトの名無しさん:2007/01/17(水) 20:17:18
あ・・・あのさ
C勉強し始めて半年くらいたつんだが
ここの質問の内容がほとんど理解できない
これって才能ないんですか?
みなさんプログラミング学習し始めてどのくらい経っているんですか?
ちなみに、プログラマ目指している62歳です
588:2007/01/17(水) 20:18:00
22歳の間違えです
589デフォルトの名無しさん :2007/01/17(水) 21:15:49
>>587
別に良いんじゃねーの〜
人それぞれペースってのがあるし
そりゃ才能や素質があればそれにこしたことはないけど
日々勤しめば成らざるを得やんや
ゆっくり行こうや
590デフォルトの名無しさん:2007/01/17(水) 21:51:14
構造体の質問です。
例えば、
struct table dat[10000];
の10000を変数で定義できないんでしょうか?
ファイルサイズに合わせて構造体の要素数を決めたいです。 
591デフォルトの名無しさん:2007/01/17(水) 21:54:51
>>590
malloc() & free()
スタックが十分にあるならalloca()でもいい
592デフォルトの名無しさん:2007/01/17(水) 22:19:49
>>591
即レスありがとうございます。

struct table{
int amp;
int time;
int line;
};

struct table dat[76800];

int m=0;
for(int l=0;l<300;l++){
for(int n=0+256*l;n<256+256*l;n++){
dat[n].line = m;
}
m=m+1;
}
.....
恥ずかしい話、今はこのように無理やり計算してます。
malloc、freeを構造体に適用する場合どう書けばいいのでしょうか?
593デフォルトの名無しさん:2007/01/17(水) 22:39:29
>>592

#include <stdio.h>
#include <stdlib.h>
typedef struct{
int amp;
int time;
int line;
} TABLE;

int main(int argc, char *argv[]) {
int m = 0, n = 0, l = 0;
TABLE *dat;

dat = malloc(sizeof(TABLE) * 76800);
if (dat == NULL) exit(-1);

for (l=0; l<300; l++) {
for (n=256*l; n<256+256*l; n++){
dat[n].line = m;
}
m = m + 1;
}

/* Test print ... */
for (m = 0; m < 76800; m += 10000)
printf("dat[%d].line = %d\n", m, dat[m].line);

free(dat);
return 0;
}
594デフォルトの名無しさん:2007/01/17(水) 22:45:38
>>593
ありがとうございます。大変参考になります。
先がようやく見えました気がします。
595デフォルトの名無しさん:2007/01/17(水) 22:57:12
>585
目から鱗がばさばさと落ちた。感動した。いままでの理解は何だったのだろう?
596デフォルトの名無しさん:2007/01/17(水) 23:36:19
>>595
つーか、ネタとしても詰まらんのだけど、そのWikiもどき。
597デフォルトの名無しさん:2007/01/17(水) 23:50:13
wikiとwikipediaを一緒にするヤツは許せない
598デフォルトの名無しさん:2007/01/18(木) 00:16:37
62歳ワロス
599デフォルトの名無しさん:2007/01/18(木) 00:48:04
int a[10][10];
int[10][10] f(){return a); //コンパイルエラー
void g(int a[10][10]); //引数ならできた
この関数fの戻り値の型ってどうすればエラー消えますか

600デフォルトの名無しさん:2007/01/18(木) 01:10:21
Cでは配列は返せない。
構造体にするかポインタで
601デフォルトの名無しさん :2007/01/18(木) 01:11:00
>>599
戻り値にint[10][10]としてるが、例えばその戻り値のaの値はint[10][10]のどこに入る?
ま、簡単に言えば、構文として成り立ってない。
適切な戻り値の型以前にその関数が何をしたいのかが分からない。
まだ、その関数の用途が分かれば返答も出来るけどね
602デフォルトの名無しさん:2007/01/18(木) 01:15:33
>>600
なるほど、ありがとうございます
>>601
すみません、特に用途があるわけではなくちょっと疑問におもっただけです


603デフォルトの名無しさん:2007/01/18(木) 01:17:59
int (*)[10] f() { return a; }

としたらエラー消えないか?
604デフォルトの名無しさん:2007/01/18(木) 01:19:30
もしくは構造体ハック

struct B {
int a[10][10];
} b;

struct B f() { return b; }
605デフォルトの名無しさん:2007/01/18(木) 01:36:01
>>603
うーん、これはだめでした
>>604
できました!ありがとうございました
606デフォルトの名無しさん:2007/01/18(木) 01:40:18
typedef int hoge_t[10];

int a[10][10]; /* hoge_t a[10];と同じ */
hoge_t *f() {return a;}
607デフォルトの名無しさん:2007/01/18(木) 19:47:32
H8/3664のマイコンで7セグメントLEDで表示する貯金箱を作ってるんだけどC言語のプログラムが全くわかんないですorz
コインの識別はコインセレクター(自販機とかにある500,100,50を識別する機械)で判別させようと思うんだけど…

わかる頭が良い人教えてください
608デフォルトの名無しさん:2007/01/18(木) 19:49:00
H8/3664のマイコンで7セグメントLEDで表示する貯金箱を作ってるんだけどC言語のプログラムが全くわかんないですorz
コインの識別はコインセレクター(自販機とかにある500,100,50を識別する機械)で判別させようと思うんだけど…

わかる頭が良い人教えてください
609デフォルトの名無しさん:2007/01/18(木) 20:01:34
LINUXでC言語のプログラムを作成しているのですが
エラーでcoreを出力したときの中身の見方が分かりません。

ぐぐってもいまいち見つからなかったので・・・
610デフォルトの名無しさん:2007/01/18(木) 20:25:18
>>609
dbx hoge core
611デフォルトの名無しさん:2007/01/18(木) 20:41:04
>>610
レスどうもです。dbxでぐぐってみました。

コンパイル時に -g オプションを付けて
dbx (ファイル名).c core.**
とすれば良いのでしょうか?
612デフォルトの名無しさん:2007/01/18(木) 20:43:10
そこまで甘えるのか
613デフォルトの名無しさん:2007/01/18(木) 22:28:45
構造体のデータをまるまるファイル分割してもってくることってできます?
A.cでつくった構造体のデータをB.cでも使えるようにする方法ってあります?
614デフォルトの名無しさん:2007/01/18(木) 22:52:55
>>613
インクルードファイルに構造体を書いて、両方でインクルードする。
615デフォルトの名無しさん:2007/01/18(木) 23:01:17
>>614
ありがとうございます
しかし、宣言に記憶クラスが多すぎる
というエラーがでるのですが
616デフォルトの名無しさん:2007/01/19(金) 02:50:38
ファイルの入力で読み込んだ文字を全て一旦
変数に格納したいのですが、どのようにすればいいのでしょうか?
いろいろ試してみたのですが、実行中に突然エラーになってしまったり
して、どうすればいいのか困っています。
わかる方 教えてください。

ちなみに具体的に説明すると
while(c=fgetc(fp))!=EOF){}のchar型変数cに格納された
文字をほかに用意した変数(a[200])に一回一回格納して
いくにはどうすればいいのか?
ということです。
よろしくお願いします。
617デフォルトの名無しさん:2007/01/19(金) 03:14:58
>>612がエラそうにしている件
618デフォルトの名無しさん:2007/01/19(金) 03:19:48
fread(a, 1, 200, fp);
619デフォルトの名無しさん:2007/01/19(金) 03:28:28
標準Cだけで書かれた有名なソフトウェアってどんなのがありますか?
620デフォルトの名無しさん:2007/01/19(金) 03:48:03
hello, world
621デフォルトの名無しさん:2007/01/19(金) 05:31:38
ちょいと長くなるが入力した日付の前後の日にちを表示するプログラムを作りたいんだ
うまく書けたと思ったんだがどうも計算がうまく行ってない様なんで間違いを指摘してください

#include<stdio.h>

void yesterday(int *y,int *m,int *d)
{
if(d == 1)
{
*m--;
if(m == 0)
{
*m=12;
*y--;
}
}
else
{
*d--;
}
}

622デフォルトの名無しさん:2007/01/19(金) 05:32:44
void tomorrow(int *y,int *m,int *d)
{
if(d == 30)
{
*d=1;
*m++;
if(m == 13)
{
*m=1;
*y++;
}
else
{
*d++;
}
}
}

int main(void)
{
int pa,pb,pc,pd;
printf("西暦と日付を入力してください\n");
printf("西暦:");scanf("%d",&pa);
printf("月:");scanf("%d",&pb);
printf("日:");scanf("%d",&pc);
623デフォルトの名無しさん:2007/01/19(金) 05:33:21
do{
printf("昨日の日付と明日の日付どちらを表示するか入力してください\n");
printf("明日:[1]、昨日:[2] ");scanf("%d",&pd);
if(pd==2){
yesterday(&pa,&pb,&pc);
printf("昨日の日付は西暦%d年%d月%d日です\n",pa,pb,pc);
}
else if(pd==1){
tomorrow(&pa,&pb,&pc);
printf("明日の日付は西暦%d年%d月%d日です\n",pa,pb,pc);
}
else
{
printf("入力しなおしてください\n");
}
}while(pd==0,pd>2);

return(0);
}

よろしくお願いします
624デフォルトの名無しさん:2007/01/19(金) 05:46:37
>>621-623
Cプログラミングの練習をしているならともかく、
time.hにあるtm構造体や各種関数を使った方が綺麗にまとまるんじゃないか?

625デフォルトの名無しさん:2007/01/19(金) 05:53:30
ポインタを使った演習なんです
626デフォルトの名無しさん:2007/01/19(金) 06:11:41
なんとかできました
もういいです
ありがとうございました
627デフォルトの名無しさん:2007/01/19(金) 09:19:57
>>616
while(c=fgetc(fp))!=EOF){
a[i] = c;
i = i + 0;
};

これじゃだめ?
あと実行中のエラーは、a[200]の場合、読み込んだ文字列が
200文字超えた時に起きてるのじゃないかな。
このエラーは、mallocとreallocを使って、読み込みながらメモリを
取得していくことで解決できるよ。
628はじめまして:2007/01/19(金) 09:38:32
昨日からCに挑戦してます。
コンパイラの設定を誤り、正しくコンパイルしてくれません。ちなみにbcc32です。購入した本はXPを使った演習で、こちらは98です(古いorz)
プロンプトはMS-DOSでコンパイラの場所はC:>\windows\borland\bcc55\bioです。本には正しくコンパイラが動作するようにpathが付けようとか書いてるけど、その本には環境変数をどうたらかんたら……。でも98にはそんな項目が見当たらない……。

※本の題名は「10日でC言語〜」著:坂下 夕里
629デフォルトの名無しさん:2007/01/19(金) 10:11:32
>>628
環境変数の設定が必要。
少なくとも、PATH、INCLUDE、LIB は入れないと。

98の環境変数はSET コマンドで設定する
毎回同じものを設定するならBATファイルに設定
AUTOEXEC.BATに入れとけばずっと設定される。
630デフォルトの名無しさん:2007/01/19(金) 11:06:17
ありがとうございます!
早速…と、思ったら…
なになに!?
クラスタスキャン!?
なんだよこれ!!!
631デフォルトの名無しさん:2007/01/19(金) 11:54:03
>>627
realloc()を使うようなプログラムなら、malloc()は不要だろ。
初回だけmalloc()を使うなんて扇子ないぞ。
632デフォルトの名無しさん:2007/01/19(金) 12:01:53
そうか?
633デフォルトの名無しさん:2007/01/19(金) 12:12:39
それほどでもない
634デフォルトの名無しさん:2007/01/19(金) 13:32:25
そんなことより
>i = i + 0;
ここに突っ込もうぜ。
635デフォルトの名無しさん:2007/01/19(金) 13:36:15
>>634は出世しないタイプ
636デフォルトの名無しさん :2007/01/19(金) 15:28:56
>>628
十日でC言語〜
って本読んでも十日でみにつくもんじゃないから
その本一通り終わったら、他にもネットや本で
知識と経験をたくわえよーな
有名な本は
プログラミング言語C(K&R)             共立出版社 //初心者向きではない
ポインタ完全制覇                   技術評論社//ポインタについて解説
C言語によるアルゴリズム事典            技術評論社 //アルゴリズム全般を網羅した事典
//俺が買った本
C言語入門本物志向が身に付く本         技術評論社 //入門書としてはけっこう良いと俺は思う
C言語文字列操作+ファイル入出力完全制覇  技術評論社 //けっこう俺にはためになった
ANSI C言語辞典                  技術評論社 //間違ってるとこ多数有るがリファレンス本として
新C言語入門                     ソフトバンク //シニア編しか持ってないけど
                                     //DOS環境ならシニア編の次のやつが役立つかも
//参考サイト
ttp://wisdom.sakura.ne.jp/
ttp://www.geocities.jp/ky_webid/algorithm/index.html

がんばってください
637デフォルトの名無しさん:2007/01/19(金) 15:53:18
62歳じゃもう無理だろ。
来世に期待しろ。
638はじめまして:2007/01/19(金) 17:13:12
>>636
応援ありがとうございます。
XPを持っている叔父の家で練習します。
その後、その参考資料をもとにレベルアップをはかります!
639デフォルトの名無しさん:2007/01/19(金) 21:41:49
なんとかできました
もういいです
ありがとうございました
640デフォルトの名無しさん:2007/01/19(金) 21:49:33
クイックソートの安定性が欠けるという問題点
を解決する方法についてお教えください。
よろしくお願いします。
641デフォルトの名無しさん:2007/01/19(金) 22:09:29
>>640
よくわからないがこういう答えでええの?
1.安定なソートアルゴリズムを使う。
2.順番に番号を振ってからクイックソートする。
642デフォルトの名無しさん:2007/01/19(金) 22:22:25
>>641
ありがとうございます。
参考になります。
643デフォルトの名無しさん:2007/01/19(金) 22:48:45
ディレクトリ内のファイル列挙がしたいっス ><;;

644デフォルトの名無しさん:2007/01/20(土) 14:58:39
基本情報技術者試験に出た過去問題で
初期値設定、文字関数、シフト演算、論理演算の順の問題
配列、判定、継続条件、値の更新の順の問題
初期値設定、入力の書式、判定条件、値の更新、最終カウント値の順の問題ってどれですか教えてくださいお願いします
↓で見ていたんですがわかりませんでした
ttp://www.rs.kagu.tus.ac.jp/infoserv/j-siken/
645デフォルトの名無しさん:2007/01/20(土) 20:09:27
参考書の問題なんですが

 次に示すように、二つの整数値を読み込んで、前者の値が後者の何%であるかを表示するプログラムを作成せよ。

の問題をこういう形で答えたいんですが・・・

 2つの整数を入力してください。
 整数A:○
 整数B:○
 Aの値はBの○%です。

説明下手ですみません・・・
646デフォルトの名無しさん:2007/01/20(土) 20:18:42
自分で解かないで何の意味がある?
部分的に聞きたいのなら、どこがわかってどこがわからないのか、自分の中で切り分けろ。
647デフォルトの名無しさん:2007/01/20(土) 20:42:48
もし宿題なら宿題スレへ池
648644:2007/01/21(日) 01:58:12
すいません誰か教えてください
649デフォルトの名無しさん:2007/01/21(日) 23:00:18
malloc()の使用例で
int *a = (int *)malloc(1024);
とキャストしているのをよく見るんですが、何故キャストしているんでしょうか?
650デフォルトの名無しさん:2007/01/21(日) 23:06:11
考えられる理由は2つ。
1. 昔のCにはvoid*がなくchar*で代用していたためキャストが必要だった。
2. 実はC++としてコンパイルしている:C++では型安全性のためvoid*から他のポインタ型への変換にはキャストが必要になった。
もちろん好みでやっていると言う可能性もあるが、そういう人も上に挙げた理由の影響を少なからず受けていると思う。
651649:2007/01/21(日) 23:38:27
>>650
なるほど、良く分かりました。
ありがとうございました。
652デフォルトの名無しさん:2007/01/22(月) 01:23:40
継続条件と判定条件の違いがわかりません
653デフォルトの名無しさん:2007/01/22(月) 19:16:18
宜しくです
unsigned charとcharの違いをざっくりと教えてもらえませんか
654デフォルトの名無しさん:2007/01/22(月) 19:23:53
unsigned char  0〜255
char        -127〜127
655デフォルトの名無しさん:2007/01/22(月) 19:33:47
>>654
>>653です
ありがとさんです
unsigned charもcharも文字型の変数ということには変わりないですよね?
656デフォルトの名無しさん:2007/01/22(月) 19:40:58
>>654
間違い。
charはsignedであってもunsignedであってもいい。
657デフォルトの名無しさん:2007/01/22(月) 19:43:54
>>656
頭固すぎ
658デフォルトの名無しさん:2007/01/22(月) 20:05:36
>>653,657
規格ではそのように定められているので、>>656が正しい。
                           (ISO/IEC 9899:1999 6.2.5 Types 15)
区別は<limits.h>で定義されているCHAR_MINの値が0かSCHAR_MINかによって
可能であるとされている。
                           (ISO/IEC 9899:1999 footnote 35)
659デフォルトの名無しさん:2007/01/22(月) 20:09:37
>>658
とりあえず>>654にレスするのは検討違いもいいところ
おまえの屁理屈なら>>653の質問につっこむべき
660デフォルトの名無しさん:2007/01/22(月) 20:12:06
普通はcharならsignedと考えるだろ。実際signed charとか宣言しねーし。
だから>>654でも正解といえるな。
661デフォルトの名無しさん:2007/01/22(月) 20:13:36
>>653です
みなさんどうもありがとうございます
ANSI Cであることを明示しなくて申し訳なかったです
結論としては
unsigned charとcharの区別は無く、同じ文字型の変数を表すという事と理解しました。
662658:2007/01/22(月) 20:22:26
>>659
>>654にはレスしてないけどなぁ。

>>660
国際規格以上の「普通」があるか?
663デフォルトの名無しさん:2007/01/22(月) 20:27:36
>>653の質問は二つの意味にとれる。

(1)unsigned charとsigned charの違いをざっくりと教えてもらえませんか
(2)unsigned charとunsigned charの違いをざっくりと教えてもらえませんか

それを確認しないで、回答した>>654は早とちり。
さらに>>654に突っ込む>>656も早とちり。

(1)の場合は>>654が正解。(2)はありえない。
664デフォルトの名無しさん:2007/01/22(月) 20:47:55
>>653です続けて申し訳ないのですが
次の質問をさせて下さい
この様なmain関数とfor文が出てきたのですがこのfor文はどんな振舞いをするのでしょうか?
さっぱり理解できません、宜しくお願いします。これもANSI Cです

void main(int argc, char *argv[])
{
int i = 0;
for (--argc, ++argv; argc > 0; --argc, ++argv, i++) {
    //処理
  }
}
665デフォルトの名無しさん:2007/01/22(月) 21:05:29
>>663
unsigned charとsigned charとcharは各々異なる型なんだが、
signed charとcharが同じものだと勘違いしてないか?

>>664
すべてのargvに対して処理をしている。
ただしargv[0]、すなわち"program name"(自身のパスのことが多い)を除く。
666デフォルトの名無しさん:2007/01/22(月) 21:10:53
っていうかその文でのiの意味がわからんな。
iを定義したなら
for(i=1; i<argc; i++) {
で処理内でargv[i]を使う方が普通じゃないか?
667デフォルトの名無しさん:2007/01/22(月) 21:25:23
>>665
>>663です
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200205/02050091.txt
ここ見てたら何となく分かってきました
charは文字変数で
shortより小さい整数型が欲しいときに,
unsigned charやsigned charを使います。
それぞれ3つの型は違うものと書いてありました。
668デフォルトの名無しさん:2007/01/22(月) 21:27:28
>>665
unsigned charとsigned charとcharが各々異なる型なのはC++の場合。
Cの場合charはsigned charまたはunsigned charと同じとされている。
だから663は一見おかしく見えるが、おかしいことは言っていない。
669デフォルトの名無しさん:2007/01/22(月) 21:58:24
unsigned foo[10];とunsigned int foo[10]は同義と考えていいですか?
ANSI Cです。
670デフォルトの名無しさん:2007/01/23(火) 00:26:24
はいそうです。
671デフォルトの名無しさん:2007/01/23(火) 00:28:27
>>668
charは、signed charとunsigned charとのいずれとも、異なる型であり、compatibleではない。
                           (ISO/IEC 9899:1999 footnote 35)
672デフォルトの名無しさん:2007/01/23(火) 00:30:06
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたC99か!!
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\
673デフォルトの名無しさん:2007/01/23(火) 00:46:58
>>663が正解だな
674デフォルトの名無しさん:2007/01/23(火) 01:11:02
>>671
char/signed char/unsigned charってどう違うの??
675デフォルトの名無しさん:2007/01/23(火) 06:22:12
>>674
charがsignedかunsignedかは処理系定義。
実際、コンパイラオプションで切り替えられるのが一般的。
従って、>654では不充分。
676デフォルトの名無しさん:2007/01/23(火) 07:57:37
だからどう違うのか聴いてんだろ>>674
>>654が不十分かどうかじゃ答えになってないぞ
677デフォルトの名無しさん:2007/01/23(火) 08:26:20
>>676
>675の1行目は読めませんか?
678デフォルトの名無しさん:2007/01/23(火) 10:15:32
>>674でもあってるじゃねーか馬鹿じゃねーのこいつ・・
>>653の「ざっくり」が読めてないのか?
679デフォルトの名無しさん:2007/01/23(火) 10:17:37
もう、>>654が正解でいいよ。
680デフォルトの名無しさん:2007/01/23(火) 10:22:19
>>675
>charがsignedかunsignedかは処理系定義。
charをunsignedでコンパイルしている奴には今までお目にかかった事はないな実務としてだけど
初心者スレ程度なら>>654でざっくり覚えておけばいいだろ、というかいい加減にしろ
681デフォルトの名無しさん:2007/01/23(火) 10:47:09
初心者がざっくり覚えるなら、「charは処理系定義だけど大抵はsigned charとして使われている」でいいじゃん。
で、charが処理系定義であることを認めない香具師は何でそんなに必死なの?
682デフォルトの名無しさん:2007/01/23(火) 10:50:47
必要なのは数字の範囲だからなあ
規約云々ばかり言ってるとあたまでっかちに思われるから注意した方がいいよ
683デフォルトの名無しさん:2007/01/23(火) 16:15:04
>680
LSI C-86はcharをunsignedにしていたはず。
684デフォルトの名無しさん:2007/01/23(火) 16:20:43
宜しくです
unsigned charとcharの違いをざっくりと教えてもらえませんか
685デフォルトの名無しさん:2007/01/23(火) 16:27:54
-j オプションをつけると、unsigned char になる
686デフォルトの名無しさん:2007/01/23(火) 16:29:21
ということはデフォルトはsigned char??
687デフォルトの名無しさん:2007/01/23(火) 16:47:32
20MBほどの.hファイルをインクルードしようとしたらヒープ領域を使い果たしましたというエラーになりました。
うまくインクルードする方法はないでしょうか?
688デフォルトの名無しさん:2007/01/23(火) 16:56:43
>>687
OSなやIDEどの環境とコンパイラの種類とヴァージョンくらい書こうな。

1つのファイルで20M?それともトータル?
689デフォルトの名無しさん:2007/01/23(火) 17:12:19
a->b[a->c] = x;
++(a->c);

これがどういう動きをしてるのか詳しく教えて下さい。
2行続けてソース内に入力されています。
690デフォルトの名無しさん:2007/01/23(火) 17:38:22
a->bの配列、添え字a->cにxを代入
a->cをインクリメント
691デフォルトの名無しさん:2007/01/23(火) 19:16:28
#include <stdio.h>
#define pow2(x) ((x)*(x))

main()
{
 int a = 5;
 printf("%d\n", pow2(++a));
}

というプログラムは、printfの行が

 printf("%d\n", ((++a)*(++a)));

のように展開され、6*7=42になると
思ったのですが、gcc でコンパイル
して実行してみると、(7*7=)49が
かえってきました。なぜでしょうか。
692デフォルトの名無しさん:2007/01/23(火) 19:25:13
コンパイラ依存なんで考えるだけ無駄
そしてコンパイラに依存するコードは書いてはいけない
693デフォルトの名無しさん:2007/01/23(火) 19:29:44
694デフォルトの名無しさん:2007/01/23(火) 19:40:17
C++にも絡む話しなんですが、いいでしょうか?
Cのソースをライブラリにして、C++で使いたいのですが、
gcc -fPIC -Wall -c libtest.c
gcc -shared -o libtest.so libtest.o
gcc -o main main.c -L. -ltest
のようにすると(Cでコンパイル)問題なく実行できますが、
gccをg++に変えると、
undeclared (first use this function)
となってしまいます。
C++についてはあまりよく知りません。
アドバイスをよろしくお願いします。
695デフォルトの名無しさん:2007/01/23(火) 20:06:47
>>691
KIAIダ
696デフォルトの名無しさん:2007/01/23(火) 20:20:01
宿題がどうしても解けないので教えてもらいたいです。
お願いします。

[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 生徒の点数を入力すると、平均点と最高点・最低点を表示するプログラムを作成せよ。
               『-1』が入力されたらデータの最後とする。

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: Borland C++Compiler
 [3.3] 言語:C++
[4] 期限: 出来るだけ早くお願いしたいです。
[5] その他の制限:

出力例はこんな感じです。

点数を入力してください:87 76 45 73 66 -1
平均点:69.4
最高点:87
最低点:45
697デフォルトの名無しさん:2007/01/23(火) 20:22:29
>>696
どこのテンプレかしらないけど、そこまで書式整えてんなら、素直に宿題スレ行けよw
698デフォルトの名無しさん:2007/01/23(火) 20:27:27
ごばくだろw
699694:2007/01/23(火) 20:29:58
extern "C"{}
を使うとうまくいくようです。
失礼しました。
700デフォルトの名無しさん:2007/01/23(火) 20:54:06
stdlib.hにあるqsort()やbsearch()のような、任意のデータ型の変数へのポインタとそのデータ型のサイズを渡して
配列などのデータを変更するような関数が作りたくて、以下のようなプログラムを作ったのですがうまく動きません。

void *vcopy ( void *dest, const void *src, size_t n )
{
 size_t i ;
 for ( i = 0 ; i < n ; i++ ) {
  * ( unsigned char * ) ( ( size_t ) dest + i ) = * ( unsigned char * ) ( ( size_t ) src + i ) ;
 }
 return dest ;
}

ポインタsrcが指すnバイトのデータ型の変数の内容を、ポインタdestが指す
同じnバイトのデータ型の変数へコピーする関数として作ったつもりです。
hoge = * ( unsigned char * ) ( ( size_t ) src + i )としてもhogeには0が入ってしまいます。
やはりこのようなポインタの使い方は無茶で、__asmなどを使わなければ駄目なのでしょうか?
環境はWindows XPでコンパイラはbcc5.5.1.2です。
701デフォルトの名無しさん:2007/01/23(火) 21:03:09
702デフォルトの名無しさん:2007/01/23(火) 21:21:05
まさかsizeof(size_t)が2でsizeof(void*)が4という話ではないだろうな
703デフォルトの名無しさん:2007/01/23(火) 21:33:21
>700
その関数使ってみたけど、ちゃんとコピーできたよ。
704デフォルトの名無しさん:2007/01/23(火) 21:52:34
ごめんなさい、この関数を用いたサンプルコードで引数のdestとsrcの順番が逆だったようです
スレ汚しすいませんでした
705デフォルトの名無しさん:2007/01/23(火) 23:39:35
あいうえお,1,2,3,4,5 ...... ,50
かきくけこ,1,2,3,4,5 ...... ,50



上のような、カンマで区切られたtxtファイルを
構造体配列に格納したいのですが
1行あたり50個程データが有り
一つ一つ格納していくと、どうしてもコードが長くなってしまいます・・・

配列のように簡単に格納出来るような良い方法は無いでしょうか?
706デフォルトの名無しさん:2007/01/24(水) 00:02:16
ってループ組めば個数関係ないじゃん
707デフォルトの名無しさん:2007/01/24(水) 01:42:25
たぶん、行中にある50個のデータそれぞれについて代入文を書くのが面倒くさいって言ってるんじゃまいか。
各行の各項目を全部文字列として格納しちまえ。
もし、各項目の文字列の最大長があまり変わらないなら、長さの決まった文字配列に、
最大長を決められないとかなら、ヒープからでもメモリを割り当てて、それにそれぞれを格納する。
そうすれば、構造体じゃなく行番号と項目番号と項目内容の各文字の位置をインデックスとする三次元文字配列か、
行番号と項目番号をインデックスとする文字配列へのポインタの二次元配列で済むぞ。
ループで楽に回せる。
708デフォルトの名無しさん:2007/01/24(水) 12:11:18
>>706-707
なるほど、わざわざ構造体にせずとも、多次元配列+ループを使えばいいわけですね
そっちの方向で練り直してみます、ありがとうございました
709デフォルトの名無しさん:2007/01/24(水) 18:34:22
>>707
非常に関心があります、具体的なコードを書いてみてもらえますか?
710デフォルトの名無しさん:2007/01/24(水) 18:38:12
>>705のtxtファイルの行数が予めわかってるか否かで
配列にするか構造体にするか変わってくるんじゃね?
711デフォルトの名無しさん:2007/01/25(木) 01:35:18
コマンドライン引数として"-a"と入力されたときに、"aiueo"というメッセージを表示するプログラムを作りたいのですが、うまくいきません。
ソースは以下の通りです。

#include <stdio.h>

int main(int argc, char *argv[])
{
if (argc != 2) { printf("error\n"); exit(0); }

if (argv[1] == "-a"){
printf("aiueo\n");}

return 0;
}

改善点を教えていただけないでしょうか。
712デフォルトの名無しさん:2007/01/25(木) 01:38:35
>>711
>if (argv[1] == "-a"){
間違い

コンパイル時に出力されたエラーも書けよ
713デフォルトの名無しさん:2007/01/25(木) 01:45:27
>712
エラーはでない。
警告なら出るが、うまくいかないのとは無関係。
714711:2007/01/25(木) 02:53:51
すみません。エラーはでませんでしたが、実行しても何も表示されませんでした。
条件文をどのようにすればいいんでしょうか・・・?
715デフォルトの名無しさん:2007/01/25(木) 03:00:52
if (strcmp(argv[1], "-a") == 0)
716711:2007/01/25(木) 03:25:06
>>715
ありがとうございます。解決しました。
strcmpには大小関係を比べるイメージしかなかったのですが、こういった使い方がありましたか。

うーん、理解が足りてない。精進せねば・・
717デフォルトの名無しさん:2007/01/25(木) 09:37:08
>>713
こういうあげあし取りのレスって恥ずかしいよな・・・w
718デフォルトの名無しさん:2007/01/25(木) 09:54:23
リアルでもいるだろ、教科書の一字一句を盾に重箱の隅突付いて「俺が正しい」みたいな顔してるやつ。
719デフォルトの名無しさん:2007/01/25(木) 09:59:21
>>713
うまくいかないって何?
720デフォルトの名無しさん:2007/01/25(木) 15:36:47
スゴイ自演でスレが止まったなw
721デフォルトの名無しさん:2007/01/25(木) 16:56:40
>>716
そもそも、こっちの使い方のが多いと思う。
大小も比較するなんてほとんどソートの時だし
722デフォルトの名無しさん:2007/01/25(木) 20:46:19
ひどい自演だww
723デフォルトの名無しさん:2007/01/26(金) 19:41:20
テキストファイルを1文字毎に読み込むのと、1行毎に読み込むのとでは
どのような違いがあるのでしょうか??
724デフォルトの名無しさん:2007/01/26(金) 19:48:35
改行コードを気にしなくてすむ
725デフォルトの名無しさん:2007/01/26(金) 20:38:20
いや改行なんてCではいつでも'\n'だろ。

>>723
違いなんて別にない。処理しやすいほうを選べ。
726デフォルトの名無しさん:2007/01/26(金) 20:53:52
>>725
LF、CRは1バイト、CRLFは2バイトですが何か
727デフォルトの名無しさん:2007/01/26(金) 20:57:33
テキストモードで読み書きすれば、外の環境で使われる改行の表現が何であろうと、プログラムの中では常に'\n'1字。
728デフォルトの名無しさん:2007/01/27(土) 09:48:11
>>727
ありがとうございます
一行の方にします
729デフォルトの名無しさん:2007/01/27(土) 15:09:09
なんか小技ないですかね
ソースを全部コピーして別ディレクトリに別の名前で保存とか
730デフォルトの名無しさん:2007/01/27(土) 15:20:05
プログラムとしては簡単だけど、windowsとかなら自分でコピー&ペーストした方がはやいだろ。
731デフォルトの名無しさん:2007/01/27(土) 15:32:36
>>729
C言語にファイル操作の小技なんてない。
732デフォルトの名無しさん:2007/01/27(土) 19:25:36
外部のデータファイルからデータを入力したいのですが
どのようにしたらよいのでしょうか
733デフォルトの名無しさん:2007/01/27(土) 20:18:30
fopen
fclose
fread
fgets
fscanf
734デフォルトの名無しさん:2007/01/27(土) 20:24:05
>>733
ありがとうございました
735デフォルトの名無しさん:2007/01/29(月) 01:43:51
複数行あるテキストファイルを、fgetsを使って最後まで読み込みたいのですが、


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *fp;
char buf[128];
char *c;

if(argc != 2) { printf("usage: prog filename\n"); exit(0); }
fp = fopen(argv[1],"r");
if(fp == NULL) {printf("cannot open file\n"); exit(0);}

c = fgets(buf,128,fp);
while((*c != EOF)){
printf(buf);
c = fgets(buf,128,fp);
}
fclose(fp);
}

このプログラムを実行すると "Segmentation Fault"が出てしまいます。どうすればいいんでしょうか?
736デフォルトの名無しさん:2007/01/29(月) 02:00:20
*cをEOFではなく、cをNULLと比較しなさい。
printfは"%s",bufを使いなさい。
そして関数のマニュアルを読みなさい
それはあなたのプログラムをよりよくする助けです。
737735:2007/01/29(月) 02:08:28
>>736
解決しました。
いつもは%sを使っていたんですが、今回はわけもわからずお手本を真似ていた次第です。
ありがとうございました。
738デフォルトの名無しさん:2007/01/29(月) 09:57:39
べつにbufでもいいけどな、中に%が入ってなけりゃw
739デフォルトの名無しさん:2007/01/29(月) 16:13:43
#include <stdio.h>
int main(){
int n;
char ch;
printf("数値: ");
scanf("%d", &n); // ←(1)
printf("文字: ");
scanf("%c", &ch); // ←(2)
printf("入力された数値: %d\n", n);
printf("入力された文字: %c\n", ch);
return 0;
}
このプログラムを実行して(1)の所で数値を入力してEnterを押すと(2)の所で入力を待たずに終了してしまうのですが何が問題なのでしょうか?
740デフォルトの名無しさん:2007/01/29(月) 16:21:43
>739
>494
741デフォルトの名無しさん:2007/01/29(月) 16:27:53
>>740
なんでスペース入れると改行文字を読み飛ばせるの?
742デフォルトの名無しさん:2007/01/29(月) 16:34:06
>>741
scanf()系のフォーマット指定における空白とは、「ホワイトスペース文字(空白、改行、タブ)の読み飛ばし」と言う意味だからです。
743デフォルトの名無しさん:2007/01/29(月) 17:23:02
はじめまして。初級過ぎて申し訳ないんですけど、
1から10まで加算する時、どう書けばいいか教えてください!
744デフォルトの名無しさん:2007/01/29(月) 17:27:14
1+2+3+4+5+6+7+8+9+10
745デフォルトの名無しさん:2007/01/29(月) 17:30:29
int sum = 0; for (int i = 1; i <= 10; ++i) sum += i;
746デフォルトの名無しさん:2007/01/29(月) 17:36:38
(10 * 11) / 2
747デフォルトの名無しさん:2007/01/29(月) 17:36:43
10*(10+1)/2
748デフォルトの名無しさん:2007/01/29(月) 17:41:57
int sum; while(sum != (10*11)/2) sum++;
749デフォルトの名無しさん:2007/01/29(月) 17:48:02
printf("1から10まで加算=%d\n", 55);
750デフォルトの名無しさん:2007/01/29(月) 18:16:48
char *end
(char*)a
この二つの違いを教えてください
751デフォルトの名無しさん:2007/01/29(月) 18:21:22
前者は変数宣言の一部と思われますが、後者はキャスト演算子を含んだ式の一部と思われます。
752750:2007/01/29(月) 18:21:38
すみませんまちがいました。

char *a
(char*)a
この二つの違いを教えてください
753デフォルトの名無しさん:2007/01/29(月) 18:23:07
char *a はchar* a と同じ
754750:2007/01/29(月) 18:23:49
>>751
ありがとうございます。
755デフォルトの名無しさん:2007/01/29(月) 18:26:08
>>752
それらが現れる文脈によって異なります。
756750:2007/01/29(月) 18:50:14
たびたびすみません。

void *base;
size_t nmemb;
size_t size,
char *p1;

int end = (int)base + nmemb * size;
for(p1 = (char*)base; p1 < (char*)end; p1 += size){

上の二つの文はそれぞれどういう意味なのでしょうか?
できるだけ詳しく教えてください
757デフォルトの名無しさん:2007/01/29(月) 19:07:16
キャスト
void*型(もしくはvoidへのポインタ型)
ポインタ演算

これがこのコードで理解してほしいところだと思うんだけど、上に挙げた言葉のうちわからないのはどれ?
758デフォルトの名無しさん:2007/01/29(月) 19:29:47
連立2次方程式のx yを求めるにはどうしたらいいのですか?
ノートでは式を立てられるのですが、C言語で解く方法を知りたいです。
759デフォルトの名無しさん:2007/01/29(月) 19:54:40
行列にして解くとか。ガッコで習わなかった?
760デフォルトの名無しさん:2007/01/29(月) 20:12:54
>>758
ヒント:2つの式をy=ax+bの形に変形してyを除去
761予想される反応:2007/01/29(月) 20:13:16
行列は高校で習うんです。
中学校レベル、できれば小学校レベルで教えてください。
762デフォルトの名無しさん:2007/01/29(月) 20:17:55
別に学校で習わんでも世界中に情報は転がってると思うが・・・
763デフォルトの名無しさん:2007/01/29(月) 20:22:13
>761
小学校じゃ連立方程式はやらん。
764758:2007/01/29(月) 20:32:06
すみません。
MATLAB では解けるんですが、Cが分かりません。
具体的に言うと、線分ABの両端に、点A、点Bを中心にした円を描いて、
円と線分ABの交点を求めるだけなんです。
点A、点Bの座標、円の半径はわかっています。
これを片方ずつ解くだけなのですが、Cでの求め方がわかりません。
765デフォルトの名無しさん:2007/01/29(月) 20:35:59
ソース上で数値を扱う場合、
マクロはプログラムの軸構造を無惨に変更する(?)#defineは使わず、
enumを使うべきだと習いました。
無惨に変更するって、#defineはCソースでよく使われていると
思いますが、問題を抱えているんでしょうか?
766デフォルトの名無しさん:2007/01/29(月) 20:40:41
スレ違い
初心者用じゃない
767765:2007/01/29(月) 20:43:45
ううorz なぜ...
わかりました。他に行きます。
768デフォルトの名無しさん:2007/01/29(月) 20:59:59
>>765
enumで列挙することで、一つのグループとしてまとめて定義できるから
わかりやすいからじゃないかな??

例えばなんらかの関連のある定数A、B、Cを
enum teusu { A=0, B=1, C=2 }
とするのと
#define A 0
#define B 1
#define C 2
とするのではenumの方がわかり易いとか・・
769デフォルトの名無しさん:2007/01/29(月) 21:09:01
Cで集合型が欲しいです
770デフォルトの名無しさん:2007/01/29(月) 21:48:37
enumは一応、型とかスコープとかあるからな。
771デフォルトの名無しさん:2007/01/30(火) 00:01:20
初心者はC言語の前にアセンブラを勉強するといいとのことですが、
なぜでしょうか。今、CASLUを勉強しています。
将来は組み込みのプログラマになりたいです。
772デフォルトの名無しさん:2007/01/30(火) 00:11:44
失礼します。
今日C++をはじめてみた者です。アホらしい質問かもしれませんがお願いします。
以下のプログラムについて質問です。
#include <iostream>
using namespace std;
class Glass
{int nakami; //水の量
public:
Glass(int x) : nakami(x){} //引数を取るコンストラクタ
//ユーザかプログラマに渡される値(xで表される)をnakamiに格納
void dasu(int); //水を出す関数 };
void Glass::dasu(int x){
if(nakami >= x){ nakami -= x;
cout<< "水を出しました。" << endl;
cout<< "現在のコップの中身は" << nakami << "です。" <<endl; }
else{cout<< "そんなに水がありません。" <<endl;
cout<< "現在コップの中には" << nakami << "入っているだけです。" <<endl; } }

int main()
{int x; //整数の「いれもの」xの定義。下のcinの前ならどこにあってもよいのです。
cout << "コップを生成します。どれだけ水をいれるか入力してください。" << endl;
cin >> x;
Glass glass(x); //引数を取るコンストラクタが呼び出され、
//水がxだけ入ったglassという名のコップが生成される
cout << "さあ、glassから水を出します。いくら出しますか。入力してください。" <<endl;
cin >> x; //上のxを使いまわしている
glass.dasu(x);
cout<<"終了"<<endl; }
これは、とある(おそらく有名な?)C++入門ページの所からの引用なんですが、
なぜ、変数のxを使いまわすことができるのかわかりません。
一回目に指定した物がnakamiに入って、二回目に指定した物がdasu量になるなんて、
そんな都合のいいようになるわけが・・・と思ったら普通になったわけですが、どうなってるんでしょうか?
773デフォルトの名無しさん:2007/01/30(火) 00:15:45
>>772
何を言っているのかさっぱり分からない。
JAVA使いだと勝手に推測してみる。
774デフォルトの名無しさん:2007/01/30(火) 00:19:08
>>771
アセンブラはよりハードに近いプログラミングを行うので、ハードとソフトの関係を理解できる。
ハードとソフトの関係を最初に習っておけば、C言語のような高等言語の裏で何が行われているのか、
よく分かるようになり、学習、理解の幅が広がる。

いわば基礎固め。
重要。
遠回りと思えるけれど、勉強して損になることは全くない。
775デフォルトの名無しさん:2007/01/30(火) 00:23:32
>>773
JAVA使いではありません。というより、プログラム自体
今日まさに始めたばかりなので拙い表現で申し訳ないのですが、
まぁ要するに、コップに入った水っていうクラスを作ってみて、
その初めにある水の量と、dasuという関数で捨てる量をどっちもxで
表しているのにどうしてごちゃごちゃにならずに実行されるのかが
分からないわけであります。
776デフォルトの名無しさん:2007/01/30(火) 00:28:34
>>773
JAVA使いではありません。というより、プログラム自体今日始めたばかりなので
拙い表現で申し訳ないのですが、要するに、
水の入ったコップというクラスを作って、その最初から入っている水の量と、
関数によって捨てていく水の量をどっちもxで表しているのに、
ごちゃごちゃにならずに普通に実行されるのはなんでかなぁというわけであります。
777デフォルトの名無しさん:2007/01/30(火) 00:29:19
おーい、誰か。>772のコメント持ってっちゃってくれ。
778デフォルトの名無しさん:2007/01/30(火) 00:32:36
やはり連投してしまっていたかorz
あのー、もしやこの質問はC言語ではなくC++の方に
するべきでしたでしょうか・・・?
779デフォルトの名無しさん:2007/01/30(火) 00:38:14
もしかしなくてもそうです。
780デフォルトの名無しさん:2007/01/30(火) 00:48:59
アセンブラと言うか、実際のCPUがどういう演算してるかぐらいは知っておくと、Cのような高級風言語でも比較的最適化されやすいプログラムが組める。
アセンブラの次は、Cの場合だとCコンパイラの生成する実行ファイルの解析って感じ。
VCでも、gccでもiccでも違うし。
781デフォルトの名無しさん:2007/01/30(火) 00:56:18
>>780
なんかもう、そういうのは10年くらい前にあきらめました。
素直に書いて、あとはコンパイラの最適化におまかせ。
782デフォルトの名無しさん:2007/01/30(火) 01:10:45
素直に書くってのが難しいわけだが
783デフォルトの名無しさん:2007/01/30(火) 01:14:23
オプティマイザーが迷わず成仏・・じゃなかった最適化できるような書き方をする。
そういうノウハウはあるね。
784デフォルトの名無しさん:2007/01/30(火) 01:18:07
>>782
素直でない書き方ってのは、16bit時代には通用してた速い書き方。
785デフォルトの名無しさん:2007/01/30(火) 02:05:41
#include <stdio.h>
int main(void)
{
int num;
num = 3;
printf("変数numは→%dです\n", num);
return 0;
}

Visual C++ Expressを使っています
ここまで書いたんですが、

------ ビルド開始: プロジェクト: ****, 構成: Debug Win32 ------
実行するビルド コマンド ラインがありません。

メイクファイル プロジェクト動作を実行しています。
プロジェクト : error PRJ0046 : 指定されたコマンド ラインが空だったため、コマンド ラインを起動できませんでした。
ビルドログは "file://c:\Documents and Settings\*************************.htm" に保存されました。
**** - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

と出てしまいます
どこがおかしいのですか?
786デフォルトの名無しさん:2007/01/30(火) 06:16:14
>>785
それはC言語の問題ではないのでVisualStudioの初心者向けのスレへどうぞ。
787デフォルトの名無しさん:2007/01/30(火) 12:52:43
すみません。
win環境で新たにC言語を勉強しようと思っていますが、
無料で手に入る、ボーランド社のコンパイラと
マイクロソフトのVC++は、どちらを使えばよいのでしょうか?
そんなに大差があるわけでもないのでしょうか?
お願いします
788デフォルトの名無しさん:2007/01/30(火) 12:56:58
無料なんだし、とりあえず両方さわってみては
789デフォルトの名無しさん:2007/01/30(火) 13:01:42
仕事すること考えたらVC++かなあ・・
790デフォルトの名無しさん:2007/01/30(火) 14:39:27
質問です。
何故か C/C++ では #include されるファイルを
ヘッダファイルと実装ソースに分けるようですが
直接、実装 .c ファイルを読み込むのではいけないのでしょうか?
791デフォルトの名無しさん:2007/01/30(火) 14:43:06
>>790
2ヶ所から実装を読み込んだら困るだろ
792デフォルトの名無しさん:2007/01/30(火) 14:49:39
「あいう」というcharの配列の中身を16進数の文字列(文字コード?)に変換するにはどうすればいいですか?
また変換された16進数の文字列を元に戻すにはどうすればいいでしょう?
793デフォルトの名無しさん:2007/01/30(火) 14:52:58
printf系で %02X 使うとか。
戻すのは strtol() とか
794デフォルトの名無しさん:2007/01/30(火) 16:26:06
>>790
hは宣言、c( → cpp ?)で定義って
オブジェクト指向のことを言いたいの?
たまに、ヘッダに書くような関数のプロトタイプ宣言や
構造体とかをcppに各会社があるね!
795デフォルトの名無しさん:2007/01/30(火) 16:40:56
>>793
ありがとうございます。
こんな風にしてみたんですが「あいう」に戻ってくれません。。。
たくさん間違ってると思いますが、どうすればいいんでしょう?

char hoge[] = "あいう";
char buf[16];
char fuga[16];

sprintf(buf, "%02X", hoge);

for (int i = 0; i < (int)strlen(buf); i++)
{
char c[3];
c[0] = buf[i * 2];
c[1] = buf[i * 2 + 1];
c[2] = '\0';
fuga[i] = strtol(c, NULL, 16);
}
796795:2007/01/30(火) 16:41:44
ごめんなさい、最後の式は
fuga[i*2] = strtol(c, NULL, 16);
でした。
797デフォルトの名無しさん:2007/01/30(火) 16:51:49
サイズの可変する配列をつくる課題があります。
その際、チャンク単位でサイズを変更すること、とあります。
チャンクってなんでしょうか?(ググったんですけどイマイチわかりません)
798デフォルトの名無しさん:2007/01/30(火) 17:31:34
#defineによる定数と列挙型定数の、使い分けの指針みたいなものを教えてください。
799デフォルトの名無しさん:2007/01/30(火) 17:38:25
>>795
%02Xは1バイトだけだから、バイト数分繰り返せ。
800790:2007/01/30(火) 17:41:21
解答ありがとうございます。
しかし申し訳ないのですが疑問はうまく晴れません…

>791
???
実装が2ヶ所から読まれることがあるのですか?
どういう場合にそうなるのか解らないのですが…

>794
いいえ、C言語のスレなので、関数の宣言のことです。
もちろん C++ のクラスのことも含まないわけではないですが
C言語でそうなっている理由が解れば
C++ でそうなっている理由も解ると思ったので…
801デフォルトの名無しさん:2007/01/30(火) 17:43:21
>>800
複数のソースで同じヘッダファイルを読むだろう
802デフォルトの名無しさん:2007/01/30(火) 17:59:57
>>801
#ifndefで回避できないの?
803デフォルトの名無しさん:2007/01/30(火) 18:05:04
> cat libfoo.c
#ifndef (以下略)

> cat mainbar.c
#include "libfoo.c"
804デフォルトの名無しさん:2007/01/30(火) 18:09:54
誰か↓の関数の使い方教えてください。

int addname(Nameval newname)
{
Nameval *nvp;

if (nvtab.nameval == NULL){/* 一番最初 */
nvtab.nameval = (Nameval *)malloc(NVINIT * sizeof(Nameval) );

if (nvtab.nameval == NULL)
return -1;
nvtab.max = NVINIT;
nvtab.nval = 0;
}else if ( nvtab.nval >= nvtab.max ) { /* 伸張 */
nvp = (Nameval *)realloc(nvtab.nameval,
(NVGROW*nvtab.max) * sizeof(Nameval) );

if( nvp == NULL )
return -1;
nvtab.max *= NVGROW;
nvtab.nameval = nvp;
}
nvtab.nameval[nvtab.nval] = newname;
return nvtab.nval++;

}
805804:2007/01/30(火) 18:11:24
構造体は、↓です。 お願いします。゚+.((人д<o)(o>д人))゚+.

typedef struct Nameval Nameval;

struct Nameval
{
char *name;
int value;
};

struct NVtab{
int nval;/* 値の現在の個数 */
int max;/* 割り当て済みの値の個数 */
Nameval *nameval;/* 名前-値ペアの配列 */
} nvtab;

enum{NVINIT = 1, NVGROW = 2};
806デフォルトの名無しさん:2007/01/30(火) 18:15:11
>790
ひょっとして、全プロジェクトを単一の翻訳単位ですますのはどうか、
という疑問なのか?
807デフォルトの名無しさん:2007/01/30(火) 18:15:52
その昔、80年代終わりに書かれた入門書には、
分割コンパイルがあたかも上級テクニックのように本の後ろのほうに載ってて、
子供だった自分には何か大げさで込み入った仕掛けのように思えたものだ。

時を経て今に至ってGUIのIDEは分割コンパイルをユーザがたとえ何も分からなくても自動的に行っている。
これもまた時代の流れの中でのソフトウェアの進歩の一つなのかもとしばし感慨にふける。
808デフォルトの名無しさん:2007/01/30(火) 18:20:42
すごいなファイル全部くっ付けてコンパイルか…
809デフォルトの名無しさん:2007/01/30(火) 18:21:37
誤爆スマソ
810デフォルトの名無しさん:2007/01/30(火) 18:22:55
どれが誤爆かわからんくらい流れにのってるな
811デフォルトの名無しさん:2007/01/30(火) 18:35:40
>>799
おっしゃる通りにやってみたつもりですが、たぶん違うので答えがめちゃめちゃです。
どうすればいいんでしょうか・・・。

char hoge[] = "あいう";
char fuga[255];
char hogefuga[255];

for (int i = 0, padding = 0; i < (int)strlen(hoge); i++)
{
char buf[255];
int len = sprintf(buf, "%02X", hoge[i]);
for (int j = 0; j < len; j++)
{
fuga[padding + j] = buf[j];
fuga[padding + j + 1] = '\0';
}
padding += len;
}

for (int i = 0; i < (int)strlen(fuga); i++)
{
char c[3];
c[0] = fuga[i * 2];
c[1] = fuga[i * 2 + 1];
c[2] = '\0';
long n = strtol(c, NULL, 16);
hogefuga[i] = n;
hogefuga[i + 1] = '\0';
}
812811:2007/01/30(火) 18:38:18
ちなみに>>811のコードでは、
char hoge[] = "abc";
と、元の文字列が1バイトのものであれば正しく復元できます。
813790:2007/01/30(火) 18:39:28
度々解答ありがとうございました。
何となくですが疑問が晴れた気がします。

多分、毎回全ソースをコンパイルしたら
(例えば stdio.c があったとすればそれ+それ以下のソース全て含めて)
コンパイル時間が膨大になってしまうので
分割でコンパイルしたいと。

その為には extern 等が必要だが
それを毎回コピペするのは行儀が悪いので
そこを .h で補完するという認識で良いでしょうか?

開始アドレスでなく名前と引数さえ判ればリンクまで出来るのに
バイナリだけでは呼べないってのも変な気がしますが
イメージが掴めた感じなので今回の質問はここまでに留めます。

2度もお手数をおかけしてすみませんでした。
ありがとうございました。
814デフォルトの名無しさん:2007/01/30(火) 19:01:46
>>812
char hoge を unsigned char hoge にしてみ。
それに付随するエラーはキャストでおさえればいい
815デフォルトの名無しさん:2007/01/30(火) 19:07:13
そもそも、途中経過のbufやfugaを表示させてみればわかると思うぞ
符号拡張してるのが
816812:2007/01/30(火) 21:01:37
>>814-815
ありがとうございます、無事に目的を達成できました。
unsigned char を char にキャストするのが何故大丈夫なのかが
いまいち納得いかないのですが、色々デバッガで追ってみようと思います。
817デフォルトの名無しさん:2007/01/31(水) 16:22:01
以下の二行の日時の差を求めるにはどうすればよいのでしょうか?
time.hを使うのだろうという所まではわかったのですが、実際の使い方がわかりません・・・。

Sun Sep 03 11:56:11 1988
Sun Sep 16 01:03:52 2007
818デフォルトの名無しさん:2007/01/31(水) 16:26:55
1970年からの秒を使っていいなら、どちらも秒に直して差をとり
出た秒数を日数と時分秒にするとか
819デフォルトの名無しさん:2007/01/31(水) 17:55:48
質問失礼します。
Visual C++ 2005 で、コンソールアプリケーションを組むと、
「デバッグ無しで開始」の場合は
「続行するには何かキーを押してください...」
と出て、そこでプログラムが止まります。
が、Debugファイルの中にあるexeを直接実行してみると、
停止せずすぐに消えてしまいます。
これはどうしてなんでしょうか? また停止せず表示したままにするにはどうすればいいでしょうか?
820デフォルトの名無しさん:2007/01/31(水) 18:07:49
オレは、最後に画面見たいときはデバッグの時はmain()の最後に
ブレークポイント入れてっけどな
821デフォルトの名無しさん:2007/01/31(水) 18:12:57
>819
すぐ消えないようにIDEが仕込んでるから。
コンソールアプリは元々は
コマンドプロンプトやバッチファイルから起動するものだしな。

一つは、同じフォルダにバッチファイルを作り、そこから起動する方法。
例えば「hello.exe」を起動するバッチファイルならテキストエディタで

hello.exe
pause

と書いたものを拡張子「.bat」で保存。
後はバッチファイルを開けば hello.exe を実行した後に一旦止まるハズ。

後は >820 や、最後に標準入力を待つように書くとか、方法は色々。
822デフォルトの名無しさん:2007/01/31(水) 18:22:27
>>820-821
どうもありがとうございます。
消えるのが普通なんですね。
ありがとうございます。ちょっと両方とも試してみます。
823デフォルトの名無しさん:2007/01/31(水) 18:28:01
char moji[] = "12345678";
というchar型の配列があるとき、
最初のn文字を取り出すには strncpy(char *, const char *, n) でできますが、
最初の5文字目から7文字目(上記例だと 567)を取り出すにはどうすればいいんでしょうか?
やはり地味にポインタ進めて取得する方法ですか?
824デフォルトの名無しさん:2007/01/31(水) 18:28:02
ああ、直接実行したいのか。

MSのTweakUI 入れて、command window hire を使えるようにして
EXEのあるディレクトリで右クリックでそれ実行して
コマンドプロンプトから直接キーボード入力でファイル名叩くっててもあるぞ

コマンドプロンプトでcdコマンドで深い階層まで到達してもいいけどな
825デフォルトの名無しさん:2007/01/31(水) 18:30:52
>>823
それも strncpy() でできるけどな。
引数のsrcのポインタに4足して、nを3にすればいい。
826デフォルトの名無しさん:2007/01/31(水) 18:33:47
>>824
ありがとうございます。ちょっと調べてみます。
827デフォルトの名無しさん:2007/01/31(水) 18:37:31
>>825
すてき!ポインタってかっこいい!!
ありがとう!!
828デフォルトの名無しさん:2007/01/31(水) 19:12:11
検索ができる二分探索木を作っています。ファイルを取り込んで二分探索木を作ることには成功したのですが、検索をかけてもうまくヒットしてくれないので、検索をする関数searchにおかしい部分があるのではないかと考えています。(コンパイルエラーはありません)
検索の部分を抜き出すと
struct tnode {
struct tnode *left;
char name[40];
struct tnode *right;
};
struct tnode *root;
struct tnode *search(struct tnode *,char *);
{
char dat[40];
char *c;
puts( "検索するデータを入力してください" );
scanf( "%s", dat );
if( search(root, dat ) == NULL )
{
puts( "指定されたデータは存在しません" );
}
else
{
puts( "指定されたデータを発見しました" );
}
}
829828:2007/01/31(水) 19:12:57
struct tnode* search(struct tnode* p,char *c)
{
while( p != NULL )
{
if(strcmp(c,p->name)==0 )
{
return p;
}
if(strcmp(c,p->name)<0 )
{
p = p->left;
}
else
{
p = p->right;
}
}
return NULL;
}
このような感じです。この中におかしい部分はありますか??
830828:2007/01/31(水) 19:16:15
削りすぎたかもしれません;
>>828
struct tnode *root;
struct tnode *search(struct tnode *,char *);
の次がmain関数です。int main()が抜けました。
831デフォルトの名無しさん:2007/01/31(水) 19:35:35
>828
それだと一回しか検索してない。
再帰でp->leftかp->rightを引数に渡したいんじゃないの?
832デフォルトの名無しさん:2007/01/31(水) 19:38:28
すまん、勘違いした。
833デフォルトの名無しさん:2007/01/31(水) 19:48:13
不等号の向きはあってるの?
834828:2007/01/31(水) 19:49:47
順番が逆ですいません。二分探索木作成は下記のように再帰を使って行っています。つながりが悪いんでしょうか・・?

int main()
{
FILE *fp;
int i;
char dat[40];
char *c;
root=talloc();
fp = fopen("list.txt","r");
if(fp == NULL) {printf("cannot open file\n"); exit(0);}

c = fgets(dat,40,fp);
while ((c != NULL)) {
c = fgets(dat,40,fp);
root=gentree(root,dat);
}

struct tnode *gentree(struct tnode *p,char *c)

{
if (p==NULL) {
p = talloc();
strcpy(p->name,c);
p->left=p->right=NULL;
}
else if(strcmp(c,p->name)<0)
p->left=gentree(p->left,c);
else
p->right=gentree(p->right,c);
return p;
}
835828:2007/01/31(水) 19:52:05
>>833
不等号の向きはあっていると思います。
試しに逆にしてみてもうまくいきませんでした
836デフォルトの名無しさん:2007/01/31(水) 19:56:04
リストの中身がどうなのかわからないけど、改行文字も保存したりしてない?
あと、最初の40文字分は飛ばしちゃっていいの?
837828:2007/01/31(水) 23:26:20
>>836
リストの中身は

tanaka_tarou 26
isida_junichi 1
kurima_tasumi 17

こんな感じのランダムな文字列が数十行ほどならべてあるものです。

確かに一行とんでいました!
while ((c != NULL)) {
root=gentree(root,dat);
c = fgets(dat,40,fp);
}
こうすべきでしたね。ご指摘ありがとうございます。

838デフォルトの名無しさん:2007/02/01(木) 00:14:21
fgetsで読み込むと改行文字も含んだ文字列になるから、scanfで入力した文字列とは一致しないよ。
839デフォルトの名無しさん:2007/02/01(木) 01:52:28
>>827
strncpy()はナル文字を詰めてくれないからsprintf()の方がいいぞ。
5文字目から7文字目ならこんな感じだ。
sprintf(extractedString, "%.*s", (7 - 5) + 1, moji + (5 - 1));
840デフォルトの名無しさん:2007/02/01(木) 05:12:04
C言語を学びたいのですが、
コマンドプロンプトの環境の作り方を教えていただけないでしょうか?
また、コンパイラはフリーで提供されているんでしょうか?
841デフォルトの名無しさん:2007/02/01(木) 06:00:20
getsの存在理由を教えてください
842デフォルトの名無しさん:2007/02/01(木) 08:18:56
過去との互換性。
843デフォルトの名無しさん:2007/02/01(木) 14:42:07
>>840
環境の作り方っつーと、どういう事が言いたいか判らんが
コマンドプロンプトでプログラミングする時知っておくべき事は
・コマンドの実行の仕方
・カレントディレクトリと cd コマンド
・PATH(パス)の通し方
この辺が解ると迷いが少ないだろう。

フリーC言語コンパイラ、は数多く存在する。
ググれば色々出てくると思うがパッと思い付くのは
・Borland C++ Compiler / Turbo C++
・Microsoft Visual Studio Express
・mingw / cygwin + gcc
こんなところか。
BCC は少し古いのが難点だが、勉強用なら充分。容量も動作も軽い。
最近ボーランドは Turbo の名前で色々出してるからこれも良いかもな。
MSの環境は当然WindowsやMS由来の技術との相性が良い。
DirectX とか扱いたいならMSの環境が無難。
mingwやcygwinは Linux用ソフトの移植の為によく使われる環境。
LinuxやUNIX を扱うならコレだろうな。
844デフォルトの名無しさん:2007/02/01(木) 15:02:04
環境変数を忘れるな
845デフォルトの名無しさん:2007/02/01(木) 17:04:19
for(;;){}

これってどういう意味ですか?
846デフォルトの名無しさん:2007/02/01(木) 17:08:52
>>845
無限ループの一つ
847デフォルトの名無しさん:2007/02/01(木) 17:21:12
>>845
無限ループ
848デフォルトの名無しさん:2007/02/01(木) 17:22:27
>>845
無限ループに決まってるだろ
849845:2007/02/01(木) 17:26:24
みなさん、ありがとうございます><
850デフォルトの名無しさん:2007/02/01(木) 17:28:57
>>845
無限ループかもしれない
851デフォルトの名無しさん:2007/02/01(木) 17:29:13
自分の人生を1行プログラムにするスレ
http://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 
852デフォルトの名無しさん:2007/02/01(木) 19:43:43
きっと、、、無限ループ
853デフォルトの名無しさん:2007/02/01(木) 20:02:13
#include<stdio.h>
#define SIZE 10

void reversePrint(int [], int);

main()
{
int i, a[SIZE];

for(i = 0; i <= SIZE - 1; i++)
a[i] = i * 3;

printf("配列の値は : \n");
reversePrint(a, SIZE);
printf("\n");
return 0;
}
void reversePrint(int b[], int size)
{
if(size > 0){
reversePrint(&b[1], size - 1);
printf("%d ", b[0]);
}
}
配列要素の逆向きプリントなのですが、reversePrint関数の再帰部分の働きがよく理解できません。
どなたかご教示ください。特に&b[1]が???です。
854デフォルトの名無しさん:2007/02/01(木) 20:11:38
↓3つをASCII文字値順にソートすると、
 AElig, Ascute, Acirc
↓ で間違いないですか?
AElig Acirc Ascute

プログラミング作法でツリーの説明のページで、
AElig Ascute Acirc
となっていたので疑問に思いました。
855デフォルトの名無しさん:2007/02/01(木) 20:48:21
Windows.hって、初心者でも作れますか?
856デフォルトの名無しさん:2007/02/01(木) 20:51:12
>>855
どっかからダウンロードできるんじゃないの?
857デフォルトの名無しさん:2007/02/01(木) 20:52:38
初心者には無理
858デフォルトの名無しさん:2007/02/01(木) 20:59:31
いえ、学校で使いたいのですが学校にはネット環境が無くて…
自分のPCでダウンロードして、それを学校側に移せばいいんですかね?
学校のPC、フロッピーしか入れられないけど。
859デフォルトの名無しさん:2007/02/01(木) 21:05:33
まずは学校側とお前の環境書け
860デフォルトの名無しさん:2007/02/01(木) 21:07:14
環境というと?
861デフォルトの名無しさん:2007/02/01(木) 21:10:11
開発環境
862デフォルトの名無しさん:2007/02/01(木) 21:11:16
今のWindows.hはそれ自身で完結せず多数のファイルをインクルードしている。
しかも実行可能ファイルを作るには各種インポートライブラリも必要。
結局フロッピーディスク1枚に収まる量にならない。

おとなしくPlatform SDKのISO版をダウンロードしてCD-Rか何かにISO焼きして持っていけ。
CDドライブもないようなPCだったら諦めろ。
863デフォルトの名無しさん:2007/02/01(木) 21:11:33
864デフォルトの名無しさん:2007/02/01(木) 21:13:51
開発環境ですか…
自分のPCには何もありません。
学校のもよく分からないけどウルトラ.cって言うの使ってます。
865デフォルトの名無しさん:2007/02/01(木) 21:18:56
よく分かっていないものにフィーリングで何かしようとしても悪化させるだけだ
866デフォルトの名無しさん:2007/02/01(木) 21:20:45
わかりました。どうも有難うございました。
867デフォルトの名無しさん:2007/02/01(木) 21:28:18
http://www.proton.co.jp/products/ultra-c/index.html
これでしょ。どうみても直接Win32APIをたたけるとは思えないな。
868デフォルトの名無しさん:2007/02/01(木) 22:43:38
>>840です。
>>843さん、回答ありがとうございます。
えっと、ボーランド社からダウンロードしてインストールしたんですけど、
あとは、
・コマンドの実行の仕方
・カレントディレクトリと cd コマンド
・PATH(パス)の通し方
に注意して、コマンドプロンプトで入力したらいいんでしょうか??
メモ帳に書いて貼ったんですが、最初のHello World!が表示できません・・・。
869デフォルトの名無しさん:2007/02/01(木) 22:52:15
870デフォルトの名無しさん:2007/02/01(木) 23:56:56
ライブラリー関数qsort()と、自分で作った関数isort()を共に実行した結果、
qsort()の方が明らかに早く整列されるんです。
この差は何が原因なんでしょうか?
871デフォルトの名無しさん:2007/02/02(金) 00:13:07
何回比較して何回入れ替えたかの差
872デフォルトの名無しさん:2007/02/02(金) 00:14:52
ライブラリ側はqsortって言っても、数が少なくなったらソート方式を切り替えたり、
分割点の選択方式が優れているんじゃないの。
873デフォルトの名無しさん:2007/02/02(金) 07:57:30
qsort()はクイックソートとは限らないね。
874デフォルトの名無しさん:2007/02/02(金) 09:41:52
ここ一ヶ月で住人入れ替わったな
875デフォルトの名無しさん:2007/02/02(金) 10:35:44
そりゃ1ヶ月もあれば初心者卒業するだろ不通
876デフォルトの名無しさん:2007/02/02(金) 10:47:47
それはない
プログラムだけやってりゃわからんが・・・
877デフォルトの名無しさん:2007/02/02(金) 11:05:30
そりゃ中一にでもなれば童貞卒業するだろう普通
878デフォルトの名無しさん:2007/02/02(金) 11:46:59
それはない
オナヌーだけやってりゃわからんが・・・
879デフォルトの名無しさん:2007/02/02(金) 14:19:04
すいませんfor文の二重ループで

1
12
123
1234
12345
123456
1234567
12345678
123456789
と表示されるにはどうしたらいいですか
#include <stdio.h>
void main( void )
{
int i,j
こっからお願いします
880デフォルトの名無しさん:2007/02/02(金) 14:28:01
;
for(i = 1;i <= 9;i++){
for(j = 1;j <= i;j++){
printf("%d", j);
}
printf("\n");
}
881879: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
882デフォルトの名無しさん:2007/02/02(金) 15:24:49
883デフォルトの名無しさん:2007/02/02(金) 18:08:10
プラグインを作れるようになりたいと思ったんですが、C言語とVC++Expressで作れますか?
もし可能ならば解説してるサイトのようなものも教えてもらえれば嬉しいです
884デフォルトの名無しさん:2007/02/02(金) 18:15:26
何のプラグイン?
885デフォルトの名無しさん:2007/02/02(金) 18:33:26
スリムタイプで初めてでも安心をプラグインだろ
886デフォルトの名無しさん:2007/02/05(月) 03:37:39
とりあえず、
ハーバート・シルトの、独習Cって本から始めて見る。

・・・・・・・・・・・・

・・・・・・・・・・・・

メモ帳で test.c を製作して、コマンドプロンプトを開いて、
ソースファイルを保存したディレクトリに移動して、次のコマンドを入力します。

cl test.c

・・・・・・・・・・・・

メモ帳の方に書けってことですよね?

コマンドプロンプトの方に入力して見たら、
cl : fatal error C1083: ソース ファイルを開けません。
とか出てきたけど・・・。 なんだろ?

この本判りにくいのか?
887デフォルトの名無しさん:2007/02/05(月) 03:48:27
コマンドプロンプトの方だよ。

ソースのディレクトリに移動してないとか
test.c.txtになってるとか。
888デフォルトの名無しさん:2007/02/05(月) 04:34:44
「ソースファイルを保存したディレクトリに移動して・・・」

って説明だけじゃあ、どうも判りにくいんですけど・・・、
それはどうすればいいんでしょう?

やっぱ、以外にカンタンな事なんですかね?
889デフォルトの名無しさん:2007/02/05(月) 04:39:16
>>888
まず、おまいはコマンドプロンプトの扱い方を勉強したほうがいい
890デフォルトの名無しさん:2007/02/05(月) 04:40:58
>やっぱ、以外にカンタンな事なんですかね?
とりあえず今日はもう寝ろ
891デフォルトの名無しさん:2007/02/05(月) 05:05:20
つーか、それC言語の話じゃないだろ。
と足蹴にするのもなんなので、windows限定でひとつ。

スタートメニューのアクセサリの中のコマンドプロンプトをソースファイルを保存したフォルダにコピーする。
コピーしたやつを右クリックしてプロパティを選択して開くと作業フォルダの項目に
%HOMEDRIVE%%HOMEPATH%
と書いてある(ハズ)。これを
%CURRENTDIR%
に書き変える。「OK」をクリックして閉じる。
それをダブルクリックするとコマンドプロンプトのカレントディレクトリが
ソースファイルのフォルダに最初からなっているので移動する手間が省けて便利。
892デフォルトの名無しさん:2007/02/05(月) 17:06:38
アルファベットと日本語が混在した文字列から、特定の日本語1文字の位置を
みつけて出力するにはどうすれば良いのでしょうか?
以下では、3が出力して欲しいのですが、実行すると0が出力されます、
日本語は2バイトかと思いmemcmpの1を2にしても同じ0が出力されました。
助けて下さい・・。

char *str="abcのdefgです。";
char *word="の";

for (i=0; i < strlen(str); i++) {
  if(memcmp(str+i, word, 1)) {
    break;
  }
}
printf("%d\n", i);
893デフォルトの名無しさん:2007/02/05(月) 17:11:14
>>886
統合開発環境もってるんでしょ
そっち使ったらいいじゃん
894デフォルトの名無しさん:2007/02/05(月) 17:12:00
memcmpの戻り値を調べてみ
895デフォルトの名無しさん:2007/02/05(月) 17:58:36
>>894
ありがとうございます全然気が付かなかった
if(0 == memcmp(str+i, word, 1)) {
にしたら3が出力されました!

forとmemcmpを使った泥臭いやり方以外にないですよね・・?
896デフォルトの名無しさん:2007/02/05(月) 18:05:03
ちゃんと、日本語の文字のバイト数を指定しないと、他の文字でも引っかかるぞ。

strstrは?
897デフォルトの名無しさん:2007/02/05(月) 18:31:27
>>896
memcmpの第三パラメーターは2ですね!
strstrは「の」のポインタが帰ってくるんでだめでした
898デフォルトの名無しさん:2007/02/05(月) 18:38:09
>>897
「の」のポインタ - strのポインタ = 君の求める答えではないのかね?
899デフォルトの名無しさん:2007/02/05(月) 19:16:45
>>898
ポインタの引き算の結果を%dで出力したら3になりました
ポインタ同士の演算は思いつきませんでした
目から鱗です
900デフォルトの名無しさん:2007/02/06(火) 00:01:36
やりたい事は、関数aで変数raに1を設定、関数bで構造体bのcntに1を設定です。
試行錯誤の結果、以下のソースで期待通りの結果が得られたのですが、疑問があります。
なぜ、関数bの引数の型がchar *rbではなくchar **rbになるのでしょうか?
「C言語では関数は値渡しのため、呼び出した関数内で値を変えるためには、アドレスを渡す」
との事なのですが、それならばchar *rbでも正しいと思えます。よろしくお願いします。
#include <stdio.h>
#include <memory.h>
struct b {
  int cnt;
};
main() {
  int ra;
  struct b *rb;

  ra = 0;
  rb = (struct b *)malloc(sizeof(rb));
  memset(rb, '\0', sizeof(rb));

  a(&ra);
  printf("ra=%d\n", ra);

  b(&rb);
  printf("rb->cnt=%d\n", rb->cnt);
}
a(int *ra) {
  *ra = 1;
}
b(char **rb) {
  ((struct b *)*rb)->cnt = 1;
}
901デフォルトの名無しさん:2007/02/06(火) 00:08:58
b(rb)で呼ぶならchar*rbでも動くような気もする。
なんぜまた一旦char*で受けるのかは解らんが。
902デフォルトの名無しさん :2007/02/06(火) 00:23:44
>>900
それコンパイル通るの?
一応書き直したけど、質問以前に、まだ勉強不足すぎる。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int cnt;
}B;
void a(int *ra);
void b(B *rb);
int main(){
int ra;
B *rb;
ra = 0;
rb = (B *)malloc(sizeof(B));
memset(rb, '\0', sizeof(rb));
a(&ra);
printf("ra=%d\n", ra);
b(rb);
printf("rb->cnt=%d\n", rb->cnt);
return 0;
}
void a(int *ra){
*ra = 1;
}
void b(B *rb) {
rb->cnt = 1;
}
903900:2007/02/06(火) 00:31:09
>>901
>>902
即レス&訂正ありがとうございます
少し考えるのでレス遅れます
904デフォルトの名無しさん:2007/02/06(火) 01:40:53
ポインタって難しいからねえ。これが理解できずにCを挫折する香具師も多い。

一度、アセンブラとかマシン語の世界に逝ってくると理解しやすいと思う。
905デフォルトの名無しさん:2007/02/06(火) 06:51:47
というか、その世界ではそれしかないだろ
906デフォルトの名無しさん:2007/02/06(火) 13:55:31
すいません、お聞きしたいのですが、
コンパイル・リンクで問題なく通っていても、
DOS窓で実行中に特定部分にくると強制終了されてしまいます。

こういうのは、やはりその特定部分のソースがよくないのでしょうか?
それと、強制終了は結構よくあることなのでしょうか?

コンパイラはBCC++です。
907デフォルトの名無しさん:2007/02/06(火) 14:35:54
>>906
コンパイルできてもバグがないわけではない
908デフォルトの名無しさん:2007/02/06(火) 14:58:54
>>902
12行目で警告が出ています、できたa.outを実行すると一見期待通りの結果が出力されました・・。

>>902で示されたソースについてなのですが、関数bの呼び出し側の引数が&rbではなくrbの理由は、
「rbがB型の構造体へのポインタのため、呼ばれた関数bの中でrbの値を変えることができるから」
の考え方をすればよいのですね。

これとは別に質問がまた出てきました・・次レスに書きます
909デフォルトの名無しさん:2007/02/06(火) 15:06:34
やりたいことは、関数bの中でB型構造体の領域を1件確保して、
B型構造体のメンバーcntに1を設定、呼び出し側に返却し
呼び出し側で構造体のメンバーcntを出力する。です。
これも試行錯誤の末、以下のソースで期待通りの結果が得られたのですが、
やはり、>>900同様可笑しな間違いをしていますでしょうか・・?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
  int cnt;
}B;
void b(B **rb);
int main(){
  B *rb;

  b(&rb);
  printf("rb->cnt=%d\n", rb->cnt);

  return 0;
}
void b(B **rb) {
  *rb = (B *)malloc(sizeof(B));
  memset(*rb, '\0', sizeof(rb));
  ((B *)*rb)->cnt = 1;
}

(※>>902さんのソースを拝借して変更しました)
910デフォルトの名無しさん:2007/02/06(火) 15:18:46
>>907
どうもです、色々考えながらバグ取りしてみようと思います。
911デフォルトの名無しさん:2007/02/06(火) 17:59:06
doubleの変数aをfprintfで出力すると、
fprintf(foutfile,"%f\n",a);
小数6位までしか出力されないのですが、小数第10位、有効な桁まで
出力するにはどのように書けばいいのでしょうか?
912デフォルトの名無しさん :2007/02/06(火) 18:26:58
%g
913デフォルトの名無しさん:2007/02/06(火) 19:11:28
以下が作ったプログラムと実行結果です(どちらもpass:momo)
http://www.uploda.org/uporg682980.cpp.html
http://www.uploda.org/uporg682990.txt.html
環境 XP Borland c++

コンパイルはできているのですが、答えが正しくないのでご指南をお願いしたいです
最大得点がおかしいのでそこを直したいのと、最大得点のルートを求めるのもまだ未完成なので
そこもできたらお願いしたいです
プログラムは縦シューの制限がついたものと考えてください、制限として
@自機、敵機とも弾は打たず体当たりでのみ倒すことができる。
A自機の移動はx軸のみ、敵機の移動はy軸のみ(敵は直線に落ちてくる)
日本語下手ですみません><分からないことあったら聞いてください
914デフォルトの名無しさん:2007/02/06(火) 20:43:04
コードを5秒程みてみたけど

×totalscore = score[po][i];
○totalscore += score[po][i];

ここ?
915913:2007/02/06(火) 21:00:54
変更してやってみたのですが、得点が27になってしまいました><
正しくは5にならないといけないんですけど(このプログラムでは2になってしまいます)
916デフォルトの名無しさん:2007/02/06(火) 21:31:43
J[10]=0
とかインデクスがなぜか1からとか意味がわかりません
917デフォルトの名無しさん:2007/02/06(火) 21:40:25
今みてるけどなんで変数名の意味から考えないかんの
918デフォルトの名無しさん:2007/02/06(火) 21:47:15
点数のルーチンだけ抜き出してみて。

単純ミスだと思うけどな。
5に成るはずの計算は、1点が5回?
919デフォルトの名無しさん:2007/02/06(火) 22:19:00
3次元空間で
自機が高度変わらずにx軸移動のみ
敵は x:5 y:5 ポイントに高度1-5に積み重なってたら
最高ポイントは1になるはずじゃねーの?
920デフォルトの名無しさん:2007/02/07(水) 03:17:27
>>910
コンパイル通るのに強制終了ってことは
アドレス関連で躓いてる可能性が
文字列、配列、メモリ確保、ポインタ等
921デフォルトの名無しさん:2007/02/07(水) 03:34:27
0で割ってる可能性も高いな。
922913:2007/02/07(水) 15:55:19
皆さんありがとうです、そしてすみません
>>917 変数名付け足しながらやってたらめちゃくちゃになってしまいました、見苦しくてすみません><
>>919 2次元じゃなくて3次元でした(自機はx,y平面を自由に動く、敵機はz軸方向に降りてくる)
です
上の入力だと途中経過で3点までは普通に出て、3番目に入力された点から見たときに得点が4にならずに2点になっています
このあたりと思うんですが、私の知識ではどこを改善すれば直るのかいまだ見つけきりません
また気づいた点在ったらご教授お願いします

923デフォルトの名無しさん:2007/02/07(水) 16:30:45
>>920
まさしくそれでした、ポッ抜けることが結構あります。

>>921
悲しいかな、これも経験済みです。

なので、今はポインタ関連徹底させるのと、更に打つのに慣れるために、
ポインタを色々含んでるのを考えながら黙々と打ち込んでます。
924デフォルトの名無しさん:2007/02/07(水) 16:35:44
んーと、ソース見て間違いを探すのも重要だけど
デバッガや変数の内容を実行時に表示して
何がおきてるのか調べるのも重要だよ。

今後、大規模なプログラミングで不可解なバグにあったときは
ソース見るよりデバッグのやり方がものを言う、場合もある。
925デフォルトの名無しさん:2007/02/07(水) 16:49:28
>>924
助言どうもです。
そういえば、変数の内容を逐一表示はさせてませんでした。
ずっとソースと格闘してたので、これは是非やってみようと思います。

実は統合開発環境?とデバッガを入れたのが昨日なので、
デバッグのやり方はまだ全然分かってません。
なので、こっちも並行して覚えていきたいと思います。
926デフォルトの名無しさん:2007/02/07(水) 17:02:13
業務だと、大規模開発はモジュール単位に成るから、切り分けスキルと、モジュール単位のデバック能力が重要。
古典的なところではprintfデバック。
点数加算ルーチンの変数を適宜表示させてみたら?
927マイコン:2007/02/08(木) 11:10:40
今はマイコンを使ってLEDを点灯させたりしてるのですが、
点灯と消灯を繰り返して明度を減少させるには、具体的にどうしたらいいですか?
デューティー比10%
とか書いてました。
928デフォルトの名無しさん:2007/02/08(木) 14:13:14
プロトタイプって書いたほうがいいんでしょうか?
929デフォルトの名無しさん:2007/02/08(木) 15:20:07
>>928
一人でやる分にはいらないかもな
930デフォルトの名無しさん:2007/02/08(木) 16:39:02
>>929
今一人なんで書かないことにします

複数でやるときって、どこに書けばいいんでしょうか??
プロトタイプ用のファイル作って、各ソースの頭でインクルードする感じ??
実際に業務でやってるやり方とか知りたいです
931デフォルトの名無しさん:2007/02/08(木) 16:51:02
↓こう、下位の関数をファイルの前に書いとけば、プロトタイプなしで、
プロトタイプと同じ効果が得られる。

func2()
{
}

func1()
{
func2();
}

main()
{
func1();
}

(最近Cで書いてないから忘れたけど、プロトタイプ無しだと、警告でない?)
932デフォルトの名無しさん:2007/02/08(木) 18:42:16
>>931
ありがとう
プロトタイプ書いてないけど警告でないです・・
1関数1ファイルにしてるからかなあ

よくわからないけど、
prototype.hに
int a(int, int);
int b(char *, char *);
って書いて各関数で#include "prototype.h"
ってやるのがいいのかなー
933デフォルトの名無しさん:2007/02/08(木) 18:55:05
a.c のプロトタイプは a.h にいれて、 b.c のプロトタイプは b.h にいれりゃいいだろ
934デフォルトの名無しさん:2007/02/08(木) 20:37:25
int sample[2][5]のような二次元配列があって
for分で列数の5回回したい場合、forのxxxの部分にどうかくのがスマートですか?
sizeofもstrlenも試したけどうまくいきません

for (i = 0; i < xxx; i++)
935デフォルトの名無しさん:2007/02/08(木) 20:40:07
要素数を変数に持っておくと確実。
936デフォルトの名無しさん:2007/02/08(木) 20:47:03
>>935
即レスthx
sample_max = 5
for (i = 0; i < sample_max; i++)って感じですね
937デフォルトの名無しさん:2007/02/08(木) 20:52:41
sizeof(sample[0])/sizeof(int)
これでいけないの?
938デフォルトの名無しさん:2007/02/08(木) 21:31:56
>>937
どうもです
今日は帰っちゃったんで明日試してみますね
939デフォルトの名無しさん:2007/02/08(木) 22:55:40
え?
940デフォルトの名無しさん:2007/02/08(木) 23:23:38
初歩的な質問で恐縮なんですけど
int型の一次元配列を関数に参照渡しをしたいのですが上手くいきません
どうすればいいかご教授お願いいたします
941デフォルトの名無しさん:2007/02/08(木) 23:32:41
>>940
普通にポインタで渡せば?
942デフォルトの名無しさん:2007/02/08(木) 23:42:38
>>941
こんな感じですか?

sub(int *ary);

main(){
int ary[10]={0,1,2,3,4,5,6,7,8,9};
sub(ary);
}
943デフォルトの名無しさん:2007/02/09(金) 09:59:26
sub(int ary[]);
でもいいけどな
944デフォルトの名無しさん:2007/02/09(金) 10:36:28
っていうか参照渡し以外にどうやって関数に配列を渡すんだろ。
945デフォルトの名無しさん:2007/02/09(金) 12:19:39
グローバルな宣言をされた配列
946デフォルトの名無しさん:2007/02/09(金) 12:20:20
値呼び出し
947デフォルトの名無しさん:2007/02/09(金) 12:30:14
>>940
てか普通に関数プロトタイプの中のパラメータリストにint型の配列を入れておけばいいんじゃね?
void sub(int []);

main(){
int ary[10]={0,1,2,3,4,5,6,7,8,9};
sub(ary);
}
948デフォルトの名無しさん:2007/02/09(金) 12:33:25
>945
それは関数に渡すとは言わないんじゃ?
>946
どうやって?
949デフォルトの名無しさん:2007/02/09(金) 12:41:09
構造体でくるむとかw
950デフォルトの名無しさん:2007/02/09(金) 12:42:15
手渡し
951デフォルトの名無しさん:2007/02/09(金) 12:42:23
うお、ちょっと来ない間について行けなくなってた
952デフォルトの名無しさん:2007/02/09(金) 12:42:26
>>948
添え字付きの配列を引き数にする
953デフォルトの名無しさん:2007/02/09(金) 12:44:24
>>952の場合、配列要素を渡すと言った方がいいのか
954デフォルトの名無しさん:2007/02/09(金) 12:48:40
>952
添え字付いてても参照渡しでしょ?
955デフォルトの名無しさん:2007/02/09(金) 12:49:28
つか元々Cって、配列の実体はポインタだったような (語弊がある?
>>942-943のどちらの方法でも渡されてるものは同じだから問題なく動くんじゃ


いい加減スレ違ってきそうだが
>>952
sub(array[0], array[1], array[2], ...);
main内部とかでこうやって呼び出すってこと?
不可能ではないが、一体なんの意味があるのかと。
特定の要素を渡すのなら問題無いと思うけど
956デフォルトの名無しさん:2007/02/09(金) 12:52:14
いや>>946>>944へのレスだから
あくまで可能性を言ったまでで
そこまでマジレスされても困る
957デフォルトの名無しさん:2007/02/09(金) 12:57:31

( д)     ゚ ゜   >>956

         ↑
         めろこ
958デフォルトの名無しさん:2007/02/09(金) 13:09:48
>>955
配列全体か配列要素を渡すかケースバイケースだけど意味はあるはず
例えば
・値呼び出しで配列要素を渡した場合、呼び出された関数が元の配列の値を変更できない
・大きな配列全体を頻繁に渡すと実行速度に差がでる
とか
959デフォルトの名無しさん:2007/02/09(金) 15:46:14
>>958
いや、だからCでは配列を(そのまま)値渡しする手段がないんだってばさ。
960デフォルトの名無しさん:2007/02/09(金) 16:25:37
以下のwork構造体をaかつbで昇順にqsortする場合、qsortの比較関数は
どう書けばいいのでしょうか?
struct work {
char a[5];
char b[5];
}
aだけで昇順ソートなら↓とわかるのですが・・
int cmp (const void *p1, const void *p2) {
contst struct work *s1 = p1;
contst struct work *s2 = p2;
return strcmp(s1->a, s2->a);
}
961デフォルトの名無しさん:2007/02/09(金) 16:32:57
>>960
>aかつbで昇順
ここを詳しく。

例えばaを主キーに、bを副キーにするならこうなる。
int foo = strcmp(s1->a, s2->a);
if (foo < 0 || foo > 0) return foo;
return strcmp(s1->b, s2->b);
962デフォルトの名無しさん:2007/02/09(金) 16:41:41
>>961
そういうことです!なるほどわかりました
qsort二回呼ぶ必要無かったんですね・・
963デフォルトの名無しさん:2007/02/09(金) 17:52:38
>>962
逆に、qsort()は非安定なソートで実装されている可能性が高いから二度呼んじゃいけません。
#安定なソートなら副キーでソートしてから主キーでソートすればできるけど。
964デフォルトの名無しさん:2007/02/09(金) 18:33:21
>>959
構造体なら値渡しできるということでは駄目か。
965デフォルトの名無しさん:2007/02/09(金) 18:56:01
初めまして。最近C言語を勉強し始めた者です。
早速質問なのですが、Visual C++ 6.0で

#define max 30;
struct _test
{
int a;
int b;
int c;
}test[max];

とやると

構文エラー : ']' が ';' の前に必要です。
構文エラー : ';' が ']' の前に必要です。

と出てしまいます。
こう言う[]の使い方は出来ないのですか?
966デフォルトの名無しさん:2007/02/09(金) 18:59:00
#define max 30;
        ~~~~
すなわち

struct _test test[30;];
967デフォルトの名無しさん:2007/02/09(金) 19:33:00
>>966
ありがとうございました。解決しました。
#defineは;はいらないんですね…。
968デフォルトの名無しさん:2007/02/09(金) 19:54:58
#define max 30; < 最後の ;(セミコロン)要らないんじゃね?
969デフォルトの名無しさん:2007/02/09(金) 20:18:29
>>965
#define max 30;
セミコロン要らない
970デフォルトの名無しさん:2007/02/09(金) 20:31:34
971デフォルトの名無しさん:2007/02/10(土) 15:55:16
最近もぐらたたきのプログラムに触れてすごいと思ったんですが、少し疑問が。
ソース見て、ん?となり、これってコンピュータは処理が高速だから、
リアルタイムに動いているように見えているだけなんでしょうか?

だとすると普通のCで同時に処理する事はできないんでしょうか?
972デフォルトの名無しさん:2007/02/10(土) 16:10:00
同時に処理する必要性が感じられない。
973デフォルトの名無しさん:2007/02/10(土) 17:47:03
>>971
どんなコードか判らないが…

「高速に動いている」ことと
「同時に動いている」ことは
直接の関連性は無い。

そのコードが出力(描画含む)結果の反映を
即時(or自動)でやってるならば「高速で処理しているから同時に見える」。
逆に、反映を一度にするよう制御しているなら
「コード上は、本当に同時に動いている」。
974デフォルトの名無しさん:2007/02/10(土) 17:57:23
>>971
リアルタイムは同時である必要はないし
処理には時間がかかるはずなので完全な同時ということはありえない。
遅れた情報を捨てて最新の情報を常に表示するのがリアルタイム。

操作すると瞬時にモグラを叩いている画像に変わるということか?

昔に比べると画像の作成して表示する処理はとてもなく速くなったね。
十数年前のパソコンだと作成に少し待たされ
しかも描画している様子まで見えたが
今はパソコンで動画を見ることが余裕に出来るくらいの性能になった。
975デフォルトの名無しさん:2007/02/10(土) 18:01:05
そのもぐらたたきはループ回して入力チェックと描画を交互にやってるんではないかとエスパー

同時に処理とはマルチスレッドのことを言ってるんではないかとエスパー
976デフォルトの名無しさん:2007/02/10(土) 23:59:21
>>972->>975
レスありがとう&分かり辛くてすみませぬ
確かfor(;;)ループ内で何個かループ処理がありました
マルチスレッドはまだ分かりません

もぐらたたきのソースを見たのはこのhpです
ttp://www.geocities.co.jp/SiliconValley-Bay/7437/index.html
977デフォルトの名無しさん:2007/02/11(日) 08:38:45
>976
そのサイトは参考にしてはいけません。
もしブックマークしてるなら速やかに削除してください。
978デフォルトの名無しさん:2007/02/11(日) 10:26:31
速やかに登録しました
979デフォルトの名無しさん:2007/02/11(日) 10:47:52
うぁはは、こっちでも叩かれてる。
http://pc10.2ch.net/test/read.cgi/tech/1170064980/501-
980デフォルトの名無しさん:2007/02/11(日) 12:24:39
ネットの検索で上位に来るというだけで、いんちき占い師を一途に信じ続ける信者のごとく初心者が惑わされていく。
これまでも、そしてこれからも。
それは誰にも止められない。
願わくば犠牲者の魂の安らかならんことを。
981デフォルトの名無しさん:2007/02/11(日) 12:30:13
気持ち悪い底の浅い言い回しだなあ・・・
982デフォルトの名無しさん:2007/02/11(日) 12:49:43
ttp://wisdom.sakura.ne.jp/programming/c/index.html

ここは大丈夫ですか??
983デフォルトの名無しさん:2007/02/19(月) 20:45:30
大丈夫なんじゃないっすかね。
984デフォルトの名無しさん:2007/02/20(火) 14:32:51
アライメントというのがよく理解出来てなく、ネットで検索してみたのですが
class TestA {
char c;
int i;
double d;
};
class TestB {
int i;
double d;
char c;
};
というクラスは並びかたが違うだけだが、オブジェクトのサイズが異なる。(アライメントが8以上の場合。)

テスト(実行)する環境がないからサイズがどう違うのかも判りません。
テストAとBのサイズ(バイト数)はどうなっているのでしょうか?
985デフォルトの名無しさん:2007/02/20(火) 14:45:44
Aが16バイト
Bが24バイト
986デフォルトの名無しさん:2007/02/20(火) 14:59:24
>>985
成る程。変数宣言の時に今までのバイト数(char2つ、int1つ)に組み合わせられない(doubleやint)場合、
以前のサイズは余白を使って8バイトとするといったイメージで宜しいのでしょうか?
Aは
char,int 1+4+余白3バイト
double 8バイト 合計16バイト
Bは
char 1+余白7バイト
double 8バイト
int 4+余白4バイト 合計24バイト
即レス有難う御座いました。
987デフォルトの名無しさん:2007/02/20(火) 15:09:35
アーキテクチャによっては、例えばdoubleの値は8バイト境界に存在しないといけない。つまり、こういうこと。
┌───────────────┐
│        double値         │8の倍数のアドレス
├───────────────┤
│        double値         │上記+8
└───────────────┘
こういうアーキテクチャで8バイト境界を無視してアクセスすると異常終了に繋がる。そうでなくてもパフォーマンスが落ちる。例えばこういうこと。
┌───────┬───────┐
│    空き    │doubleの前半分 │8の倍数のアドレス
├───────┼───────┤
│doubleの後半分 │    空き    │上記+8
└───────┴───────┘
これを踏まえて構造体を考える。TestAは詰めればこうなるかもしれない。
┌─┬───────┬─────┐
│ c │     i      │ d(一部)  │8の倍数のアドレス
├─┴───────┼─────┘
│    d(残り)     │         上記+8
└─────────┘
しかし、先程示した通りdouble値は8バイト境界にないといけないとしたら(恐らくはint値も4バイト境界にないといけないだろうから)こうなるだろう。
┌─┬─────┬───────┐
│ c │  隙間  │     i     │8の倍数のアドレス
├─┴─────┼───────┤
│           d          │上記+8
└───────────────┘
同じように、TestBもこうなると考えられる。
┌───────┬───────┐
│     i     │    隙間    │8の倍数のアドレス
├───────┴───────┤
│           d          │上記+8
├─┬─────────────┤
│ c │        空き        │上記+8
└─┴─────────────┘
988デフォルトの名無しさん:2007/02/20(火) 19:19:57
たいていのコンパイラはオプションでパディングを制御できる
989デフォルトの名無しさん:2007/02/20(火) 19:36:01
>>988
随分と狭い見識をお持ちのようで。
990デフォルトの名無しさん:2007/02/20(火) 20:10:14
>>989
ん?なんで?
991デフォルトの名無しさん:2007/02/20(火) 21:59:25
>>989
抽象論で批判するなんて随分と矮小な知性をお持ちのようで。
992デフォルトの名無しさん:2007/02/20(火) 22:07:04
次スレは?
993デフォルトの名無しさん:2007/02/20(火) 23:34:28
似たようなスレ多いし、要らないんでない?
994デフォルトの名無しさん:2007/02/20(火) 23:37:42
995デフォルトの名無しさん:2007/02/21(水) 13:16:21
パディング
996デフォルトの名無しさん:2007/02/21(水) 14:18:44
ここでいいと思う
C言語なら俺に聞け(入門篇) Part 8
http://pc10.2ch.net/test/read.cgi/tech/1171946674/l50
997デフォルトの名無しさん:2007/02/21(水) 23:12:25
膿め
998デフォルトの名無しさん:2007/02/21(水) 23:41:39
産め
999デフォルトの名無しさん:2007/02/22(木) 04:51:39
1000デフォルトの名無しさん:2007/02/22(木) 05:23:20
埋め
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。