C言語なら俺に聞け(入門篇) Part 6
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/12/29(金) 02:04:50・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 4
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/
関連スレ
C/C++の宿題を片付けます 80代目
http://pc8.2ch.net/test/read.cgi/tech/1166969820/
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/l50
【初心者歓迎】C/C++室 Ver.33【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1164376287/l50
0002デフォルトの名無しさん
2006/12/29(金) 02:07:400003デフォルトの名無しさん
2006/12/29(金) 02:33:27kaijoがs<0だと0しか帰ってこないのはおいといても、関数ncmもおかしいな
kaijoを使うんなら
int ncm(int n, int m){
return kaijo(n)/kaijo(m)/kaijo(n-m);
}
こうだろ。
書き方見る限り再帰で呼び出したいように見えるんだけど。
int ncm(int n, int m){
return (n==m || m==0) ? 1 : ncm(n-1,m-1) + ncm(n-1, m);
}
ついでに宿題スレにあった別パターンの再帰
int ncm(int n, int m){
return m==0 ? 1 : ncm(n, m-1) * (n-m+1) / m;
}
0004デフォルトの名無しさん
2006/12/29(金) 04:03:33きちんとエラーを吐き出すようにして欲しいものだな。
0005デフォルトの名無しさん
2006/12/29(金) 09:30:400006ぼるじょあ ◆yBEncckFOU
2006/12/29(金) 12:54:15(・3・) エェー 重複だYOp
ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc8.2ch.net/test/read.cgi/tech/1165718021/
0007デフォルトの名無しさん
2006/12/29(金) 13:07:450008デフォルトの名無しさん
2006/12/29(金) 13:38:01宿題片付けるのと初心者の質問を答えてやるのでは趣旨が違うだろ?
0009デフォルトの名無しさん
2006/12/29(金) 13:58:28Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
bintori2.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_janken' が未解決(D:\CLANG\BINTORI2\BINTORI2.OBJ が参照)
以前は問題なくコンパイル出来たのですがこんなエラーが出てコンパイル出来ません。
どこがおかしいのでしょうか?
一応ソースとobjファイルとtdsファイルです。
http://eggrice.no.land.to/up/src/tohoh0090.zip
0010デフォルトの名無しさん
2006/12/29(金) 14:10:56今月の頭か先月見たような…
そのjankenとやらを
0011デフォルトの名無しさん
2006/12/29(金) 14:12:11つ bcc32 bintori2.c janken.c
ソースの中身までは見てないので、ちゃんと動くかどうかは知らん。
0012デフォルトの名無しさん
2006/12/29(金) 14:16:02久しぶりだったのですっかり忘れてました(;´д`)
>>11
ありがとうございました。
>>10
参考書のソース改変しただけなので・・・
0013デフォルトの名無しさん
2006/12/29(金) 14:19:38どう発音するんだ?
0014デフォルトの名無しさん
2006/12/29(金) 14:32:390015デフォルトの名無しさん
2006/12/29(金) 14:39:260016デフォルトの名無しさん
2006/12/29(金) 14:40:17{
int i,j,k;
hoge(){}
hoge(int _i, int _j, int _k){
i = _i;j = _j;k = _k;
}
};
void func()
{
int a,b,c;
hoge* ph = 0;
〜略
for(〜){
ph[〜] = hoge(a,b,c);
}
}
上のようなプログラムを見たのですが、
構造体をnewもせずに突然hoge(a,b,c)とか書いていいのですか?
特にエラーも出ずにコンパイルできました。
これはどういうことでしょうか?
0017デフォルトの名無しさん
2006/12/29(金) 14:45:20引数付きのコンストラクタを呼び出して 一時オブジェクトを作っている。
が、ここは 「C」スレ。 上記のやっていることは「C++」の範疇であり C では文法違反。
0018デフォルトの名無しさん
2006/12/29(金) 15:33:23そのなかで一番多く入ってる整数が何か知るというようなものを
書きたいのですがどうすれば?
一番多いというのは、たとえば13という整数が10個、9が5個入ってたら
13を取り出したいという意味です
0019デフォルトの名無しさん
2006/12/29(金) 15:35:03C++の話しですか。すいませんでした。
一時オブジェクトというんですね。
ありがとうございました。
0020デフォルトの名無しさん
2006/12/29(金) 15:49:03int ary1[NUM]={0};
int ary2[NUM]={0};
while(i=0;ary[i];i++){
if(ary1[i]==target){
ary2[i]++;
break;
}
}
if(ary2[i]==0){
ary1[i]=target;
ary2[i]++;
}
/*あとなんか総当りで比較*/
>>18
こんな感じじゃね?
ソートしてから比較したほうがよさそうな気がしてきたが、こういう方法もあるということで
0021デフォルトの名無しさん
2006/12/29(金) 15:54:25{
int num, cnt;
struct numcnt_tag *next ,prev*;
}numcnt;
こういうのあったよね。
これでどうだ
0022デフォルトの名無しさん
2006/12/29(金) 15:54:52C, C++ 両方をコンパイルできる環境だと、どっちでコンパイルされているかを意識する必要があるよ。
コンパイルできたからといって Cに適合しているとは限らないから。
# >>16 で 「new もせずに」と書いているけど、C には new 演算子無いw
0023デフォルトの名無しさん
2006/12/29(金) 15:55:28やり方はいろいろあると思うけど、とりあえず一例。
元の配列と同じサイズの領域を確保し、内容をコピー。
コピーした配列のほうをソート。
(元の配列の内容を更新可能なら、コピーせずそれを使ってよい。
ソートについてはqsort関数を使うか、ぐぐる。)
ソート済み配列を先頭から見ると、同じ数値は連続して固まって並んでいる。
最初に現れた数値がa, その個数をNaとすると、
val=a, num=Na
つぎに表れた数値bの個数を数え、それがNbとする。
Nb>numなら val=b, num=Nb
これを配列の最後まで繰り返す。
最終的にvalが求める値。
0024デフォルトの名無しさん
2006/12/29(金) 16:03:17ビットマップの輝度のような(たかだか 0〜255) 整数でかつ値のとりえる範囲が極めて小さいときは
個数カウンタを値域分用意する って手段もありだね
0025デフォルトの名無しさん
2006/12/29(金) 16:38:14有難うございます。
マイナスが付いてたのが意味が分からなくて困ってました。。
(左詰ってことなんですね。。
0026デフォルトの名無しさん
2006/12/29(金) 16:47:30配列の中身の数がもっとも大きい配列番号をしるには
どうすればいいですか?
0027デフォルトの名無しさん
2006/12/29(金) 16:48:38もっと具体的に。
単に最大値が欲しいのなら、単純なループで探すかソートして端を採るか。
0028デフォルトの名無しさん
2006/12/29(金) 16:55:19単純なループより高速にソート完了できるアルゴリズムなんてあるか?
非難したり馬鹿にしたりしてるわけじゃなくて、興味本位なんだが
002926
2006/12/29(金) 16:57:41中身の一番大きいarray[1]の配列番号1がほしいいんですが
0031デフォルトの名無しさん
2006/12/29(金) 18:43:05その中の問題の答えがわからないのです。どなたかベストな方法を教えてください。
P.44 問題1-10
「潜在的な間違いを最小限に食い止めるには、次の定義をどのように書き直したらいいだろうか」
#define FT2METER 0.3048
#define METER2FT 3.28084
#define MI2FT 5280.0
#define MI2KM 1.609344
#define SQMI2SQKM 2.589988
整数型のマクロは enum にしたほうがよい、との記述がありました。
問題の主旨は、どうにかしてマクロを避けなさい、ということだと思うのですが。
0032デフォルトの名無しさん
2006/12/29(金) 19:06:02結構凄いことなってる。助言とかお願いします
http://ex17.2ch.net/test/read.cgi/news4vip/1167379476/
問題の物
ダウンロードパス vip
http://www.uploda.org/uporg635455.rar.html
0033デフォルトの名無しさん
2006/12/29(金) 19:09:40一箇所だけ書くとこんな感じ
#define FT2METER (0.3048)
#define METER2FT (1/FT2METER)
0034デフォルトの名無しさん
2006/12/29(金) 19:32:33#define FT2METER (0.3048)
#define MI2FT (5280.0)
#define METER2FT (1/FT2METER)
#define MI2KM (MI2FT*FT2METER/1000)
#define SQMI2SQKM (MI2KM*MI2KM)
003533=34
2006/12/29(金) 19:44:05この場合はこっちのほうが正解
#define METER2FT (3.28084)
#define MI2FT (5280.0)
#define FT2METER (1.0/METER2FT)
#define MI2KM (MI2FT*FT2METER/1000.0)
#define SQMI2SQKM (MI2KM*MI2KM)
0036デフォルトの名無しさん
2006/12/29(金) 20:02:25003735
2006/12/29(金) 20:07:590038デフォルトの名無しさん
2006/12/29(金) 20:32:01なるほどさんくす
視野が狭かったよ
0039デフォルトの名無しさん
2006/12/30(土) 01:26:50それぞれ何回使われたか集計するプログラムを作りたいです。
txtファイルの入出力はできてるんですが
アルファベットの数を分けるプログラムはどうすればいいですか?
ちなみに問題文は
fgets で文字列にデータを一行づつ読み込み, 文字列中の文字を一文字づつ
調べて出現回数を配列に記録することにより数えよ.
例えば, 配列を int count[26] とすると, 'a' の個数を count[0] で,
'b' の個数を count[1] で, …, 'z' の個数を count[25] で数えるようにすればよい.
とのこと
>例えば, 配列を int count[26] とすると, 'a' の個数を count[0] で,
まれに見るクソ問題だ。学校名と担当教官を晒したら教えてやる。
0041デフォルトの名無しさん
2006/12/30(土) 01:44:37main() {
int count[26], i;
char buf[128], c;
for (i = 0; i < 26; i++) {
count[i] = 0;
}
while(fgets(buf, sizeof(buf), STDIN)) {
for (i = 0; c = buf[i]; i++) {
if (isalpha(c)) {
count[tolower(c) - 'a']++;
}
}
}
for (i = 0; i < 26; i++) {
printf("%c: %d", i + 'a', count[i]);
}
return 0;
}
0042デフォルトの名無しさん
2006/12/30(土) 07:10:18やっぱり #define は使うのですね。
小数の場合でも文字列置換を使わない工夫があるのかと思ってました。
0043デフォルトの名無しさん
2006/12/30(土) 08:44:49あなたにとってこの程度の問題すら難しくて解けない、と解釈します
0044デフォルトの名無しさん
2006/12/30(土) 08:46:19紹介文
俺の子を産んでくれる繁殖可能な女性を広く募集中。
模型・プラモ@2ch専用うpろだ
http://mokei.net
模型・プラモってw
0045デフォルトの名無しさん
2006/12/30(土) 08:57:540046デフォルトの名無しさん
2006/12/30(土) 09:54:37count[26]={0}でおk
あとint main(void)にしとこうよ。
0047デフォルトの名無しさん
2006/12/30(土) 09:55:52→X
↓一二三十・・
Y 四五六・・・
七八九・・・
・・・・・・
の順番で一から走査させたいのですが、アルゴリズムが思いつきません。
図がわかりにくくてすみません。
要は、3×3の配列ごとに画像の左上Xを増加させて、
右端までいったら、Yを1増加させて・・・と言う具合です。
ヒントだけでもいいので教えていただけたらと思います。
よろしくお願いします。
0048デフォルトの名無しさん
2006/12/30(土) 10:01:27for(;;i++)
for(;;j++)
function(3i,3j);
}
function(int y,int x){
for(i=0;i<3;i++)
for(j=0;j<3;j++)
/*
ary[y+i][x+j]が必要な要素
*/
}
004947
2006/12/30(土) 10:02:23Yを1増加でなくて、3増加でした、すみません。
005047
2006/12/30(土) 10:07:39ありがとうございます
早速試してみます。
0051デフォルトの名無しさん
2006/12/30(土) 10:11:36レスアンカーのつけかたぐらい覚えれや
<<じゃなくて>>だ
0052デフォルトの名無しさん
2006/12/30(土) 11:12:570053デフォルトの名無しさん
2006/12/30(土) 13:42:13なかなかうまい方法が見つからないので教えてもらえないでしょうか?
array[0]→2,array[1]→13,array[0]→5だとしたら
中身の一番大きいarray[1]の配列番号1がほしいです
こんな問題なんですが
0054デフォルトの名無しさん
2006/12/30(土) 14:26:38技巧を凝らさないなら
max確保用に変数maxをセット、初期値をa[0]にしとく
添字確保用に変数max_numを用意、初期値を0にしとく
配列の数-1までループを回す。中身は→条件:a[i]とmaxを比較 a[i]の方が大きかった時 操作1:maxにa[i]を代入 操作2:max_numにiを代入
これじゃ駄目?
0056デフォルトの名無しさん
2006/12/30(土) 15:32:44int main()
{
0057デフォルトの名無しさん
2006/12/30(土) 17:02:10#include <stdio.h>
int getmaxsuffix(int *a, int len);
int main(void){
int a[10] = {1, 2, 13, 4, 25, 6, 7, 8, 9, 10};
int i = getmaxsuffix(a, 10);
printf("%d\n",i);
}
int getmaxsuffix(int *a,int len){
int i;
int max = 0;
for (i = 1;i < len;i++){
if (a[max] < a[i]){
max = i;
}
}
return max;
}
005839
2006/12/31(日) 02:57:45頑張って解読しようとしたけど、知らない関数多すぎで降参です。
fopenとか全く使ってないけど省略しただけなんでしょうか?
もっと簡単で理解できる範囲でアドバイスが欲しいんですが、
自分が何処までやっているのかをどう言えば分かってもらえるのか分からない。
005939
2006/12/31(日) 03:09:20int main(void)
{
FILE *fpin,*fpout;
char s[128];
if((fpin=fopen("aaa.txt","r"))==NULL)
{
printf("ファイルが見つかりません。---aaa.txt\n");
exit(EXIT_FAILURE);
}
while(fgets(string,STRING_SIZE,fpin))
{
}
if((fpout=fopen("aaaaa.txt","a"))==NULL)
{
printf("ファイルが作成できません。---aaaaa.txt\n");
exit(EXIT_FAILURE);
}
fclose(fpin);
fclose(fpout);
return EXIT_SUCCESS;
}
自分で考えた分なんですがwhileの中身が全く分からないのと
他に間違い等あればお願いします。
0060デフォルトの名無しさん
2006/12/31(日) 03:12:54>>41 を参考にすればおk
0061デフォルトの名無しさん
2006/12/31(日) 06:38:21#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
FILE *fp = fopen("alpha.txt", "r");
if(fp == NULL){ return -1; }
int count[26], i;
char buf[128];
memset(count, 0, sizeof(count));
while(fgets(buf, sizeof(buf) - 1, fp)){
for(i = 0; i < strlen(buf); ++i){
if(isalpha(buf[i])){
++count[tolower(buf[i]) - 'a'];
}
}
}
fclose(fp);
for(i = 0; i < 26; ++i){
printf("%c: %d\n", i + 'a', count[i]);
}
return 0;
}
0062デフォルトの名無しさん
2006/12/31(日) 09:49:44それやばくない?(苦笑
0063デフォルトの名無しさん
2006/12/31(日) 10:13:18#include <stdio.h>
long int nx;int ny = 1;
int shisuu;int kaisuu;
intmain(void){
printf("任意の数字(整数nx)をn乗します。\n整数を入力してください。\n");
printf("整数nx:"); scanf("%d",&nx);
printf("整数shisuu:"); scanf("%d",&shisuu);
for (kaisuu = 0; shisuu > kaisuu; kaisuu++)
ny = ny * nx;
if (shisuu > 0)
printf("nx^%d = %d\n",shisuu,ny);
else if (shisuu = 0)
printf("nx^%d = 1\n",shisuu);
else
printf("nx^%d = 1 / %d\n",shisuu,ny);
return (0);
}
↑がソースファイル。
2番目のif文で”おそらく不正な代入”とされ、コンパイルできません。
どうすればいいでしょうか?あと、まだポインタは勉強してません。
0064デフォルトの名無しさん
2006/12/31(日) 10:17:350066デフォルトの名無しさん
2006/12/31(日) 11:20:14配列の0クリアは初期化で済ませろ。
memset()は極力使うな。
fgets()の第2パラメータは配列サイズで充分。
ループの継続条件で毎回strlen()を呼ぶな。
main()から-1を戻すな。汎用性が失われる。
C99スタイルで書くならループ制御変数をループ外で宣言するな。
C++ならインクルードファイルの名前が違う。
C89ならエラーになる。
0067デフォルトの名無しさん
2006/12/31(日) 11:39:13whileの継続条件がよくわからんってことだよな?
まずひとつ、C言語では偽を0、真をそれ以外の全ての数と定義している
で、whileは継続条件が偽でないときにループを続けるんだが、これは論理式でなくても構わない
つまり継続条件にある式の値が0でない限りループを続けることになる
今回の場合、継続条件となる値が関数fgets()の戻り値であることはいいと思う
だからfgets()が0を返さない限りループする
fgets()が0を返すタイミングを調べてみると、対象の文字列を全て読みきった時だ
よって、fpinから文字列を全部読み込むまでループする、といった感じだ
いくつか正しくない表現もあるけど、説明が長くなりそうだからとあえてそうしてるつもり
0068デフォルトの名無しさん
2006/12/31(日) 11:44:380069デフォルトの名無しさん
2006/12/31(日) 11:49:47while(fgets(string,STRING_SIZE,fpin))
{
}
これのどこを説明せよと
・・・こうかな?
>>59
while(1==1){
if(fgets(string,STRING_SIZE,fpin)==NULL)break;
}
これと同じ事を簡単に済ませています
NULLは、この場合0と等価と考えてもらって構いません
0070デフォルトの名無しさん
2006/12/31(日) 11:52:21お前アホだろ?
全くわからないから空欄なんじゃねーか。
0071デフォルトの名無しさん
2006/12/31(日) 11:55:21コードの解説を求めてるのかと思った
0072デフォルトの名無しさん
2006/12/31(日) 14:36:50(・ω・`) コイッ!
(⊃⌒*⌒⊂)
/__ノωヽ__)
0073デフォルトの名無しさん
2006/12/31(日) 15:37:320075デフォルトの名無しさん
2006/12/31(日) 19:14:56fpoutへは何もしないでクローズしてるようだが・・・
0076デフォルトの名無しさん
2006/12/31(日) 20:38:03int array[N];
int MaxNum = 0;
int MapPoint = 0;
temp = array[0];
for(i = 0; i < N; i++){
if(temp<=aray[i]){
temp = aray[i]:
MaxNum = temp;
MaxPoint = i;
}
}
007761
2007/01/01(月) 07:25:29色々ダメ出しされてるな…
そこで今後の為にちょっと質問いいでしょうか?
・memset()は極力使うなというのは何故?
・strlen()は処理コストの問題という事ですか?
・main()から-1を戻すと汎用性が失われるというのは何故?
0078デフォルトの名無しさん
2007/01/01(月) 07:49:17> memset
int count[26] = {0};
のほうが読みやすい
> strlen
計った事無いから分からないけど(最適化されそうだし)
C99かC++なら
for (int i = 0, length = strlen(buf); i < length;...
のほうがいいかと
007961
2007/01/01(月) 08:36:31レスどうもです。
>int count[26] = {0};
しかし、それだと「count[0]」しか初期化されないのでは?
>strlen
う〜ん、とりあえず26回程度のループだったので
for文中で使ったんですけどね…
やっぱCプログラマの人って、ほかの言語のプログラマの人に比べて
みんな処理効率に拘りますねやっぱ。
0080デフォルトの名無しさん
2007/01/01(月) 08:51:19>しかし、それだと「count[0]」しか初期化されないのでは?
教科書読み直したほうがいい。
人の質問に答えるのはまだ早いな
0081デフォルトの名無しさん
2007/01/01(月) 08:54:59もうちょっと場数踏んだ方がいいね
0082デフォルトの名無しさん
2007/01/01(月) 09:17:05ここの回答者全員に言えることだが・・・
0083デフォルトの名無しさん
2007/01/01(月) 09:31:49> ・main()から-1を戻すと汎用性が失われるというのは何故?
Unix系のシステムで実質的に終了ステータスとして使える値は
0〜127なんだわ。
なので、普通は終了ステータスとしては、0, 1, 2などの小さい整数を使う。
0が正常終了で他が異常終了ね。
成功か失敗かだけでいいんなら、stdlibで定義されている
EXIT_SUCCESS, EXIT_FAILUREマクロを使うのもいい。
多分その定義は0, 1になってるはずだ。
長ったらしいし、俺はあまり好かんがな。
008461
2007/01/01(月) 10:24:32うぉーーーー
c[3]={0} これで 配列全部0で初期化出来たのか
今まで気づかなかったよ…
同様に、char s[3]={'\0'} 等の場合も同じなんだね…
いや、本当に今まで気づかなかった… ありがと。
>>83
うぉーーーー
これも全然知らなかったよ。
そうなのか、という事はLinuxサーバにアップしてるスクリプトとかの
終了ステータスも全部-1にしてるが、それは間違いだったって訳なのか…
自分の無知さ加減に情けなくなるよ。色々勉強になったありがと。
0085デフォルトの名無しさん
2007/01/01(月) 17:48:080086うぉーーーー
2007/01/01(月) 18:08:000087デフォルトの名無しさん
2007/01/01(月) 19:11:030088デフォルトの名無しさん
2007/01/01(月) 20:19:430089デフォルトの名無しさん
2007/01/01(月) 21:28:130090デフォルトの名無しさん
2007/01/01(月) 21:32:590091デフォルトの名無しさん
2007/01/01(月) 22:42:520092デフォルトの名無しさん
2007/01/02(火) 21:16:32char *p
stop = string + strlen( string );
この式を実行したら、stopは一体何を表してるんですか?
%s で呼び出すと 何も表示されないし、
%d は 4万なんたらって数字がでるんだけど。
0093デフォルトの名無しさん
2007/01/02(火) 21:17:160094デフォルトの名無しさん
2007/01/02(火) 21:22:18そこに"AAAA"の文字の長さ4を足すんだから
stopには"AAAA"の4文字目の次のアドレスが入る
"AAAA" は A A A A \0 なので、"" と同じ。%s では0文字出力
%dでは、アドレスが出力される
0095デフォルトの名無しさん
2007/01/02(火) 21:28:13入れられているという事になる、でいいんですね。
なるほど、ありがとうございました。
0096デフォルトの名無しさん
2007/01/02(火) 21:50:11今月号の日経ソフトウェアに書いてあることのもっと深いことが
書いてあるようなソフトウェア設計について学べる本を教えてくださいお願いします
0097デフォルトの名無しさん
2007/01/02(火) 21:55:36スレ違い。 図書スレに行きなさい
0098デフォルトの名無しさん
2007/01/03(水) 01:54:121000本ぐらいのフラグを作りたいのですが
どうやるのか分かりません。
今のところnumOfFlags本のフラグの用意は↓
int *flags = (int *)calloc(sizeof(int), numOfFlags / sizeof(int) + 1);
のようにして、flagNum番目のフラグをオン↓
*flags |= 1 << flagNum;
flagNum番目のフラグをチェック↓
if(*flags & 1 << flagNum)
foo;
のようにしているのですが、
これで正しいのか分かりません。
たぶん、intは32ビットなので
フラグの本数numOfFlagsが1000本ぐらいになったら
どういう動作になるのかよく分かっていません。
こういうことするのに最適な方法を教えてください。
お願いします。
0099デフォルトの名無しさん
2007/01/03(水) 02:37:19ビットじゃなくてバイトを確保してたり、確保した領域の先頭しか使ってなかったりわけわからんが、
int *flags = (int *)calloc(numOfFlags/(sizeof(int)*8)+1, sizeof(int));
flags[flagNum/(sizeof(int)*8)] |= 1 << flagNum % (sizeof(int)*8);
if(flags[flagNum/(sizeof(int)*8)] & 1 << flagNum % (sizeof(int)*8)) foo;
こんな感じのことがしたいのか?
010098
2007/01/03(水) 02:44:38ありがとうございます。
こういう感じのことがしたかったんです。
IA32のEFLAGSレジスタの任意ビットバージョンみたいなのです。
ただ、このコードについて一点質問してもいいですか?
sizeof(int)*8
ではなぜ8を掛けているんでしょうか?
0101デフォルトの名無しさん
2007/01/03(水) 03:00:19intで何ビットなのかてこと
0102デフォルトの名無しさん
2007/01/03(水) 03:00:46最近の学校は
010398
2007/01/03(水) 12:40:11なるほど。よく分かりました。
>>99のコードは非常に参考になりました。
こういうのは自分で思いつきそうにも無いです。
本当にありがとうございました。
>>102
いや、別に学校で習ったわけじゃなくて
ほとんど独学でやってます。
0104デフォルトの名無しさん
2007/01/04(木) 13:01:050105デフォルトの名無しさん
2007/01/04(木) 13:11:340106デフォルトの名無しさん
2007/01/04(木) 13:16:390107デフォルトの名無しさん
2007/01/04(木) 13:22:260108デフォルトの名無しさん
2007/01/04(木) 13:52:250109デフォルトの名無しさん
2007/01/04(木) 14:26:240110cygwinで
2007/01/05(金) 00:14:06collect2:ld returned 1 exit status
という文がgcc a.c -o a.x で出ました。
直訳?だとldの未定義の参照は1つの出口
状態を返しましたですか?? この文で、何がダメか分かりますか??
変な文章ですみません。もし分かれば、教えてください。
0111デフォルトの名無しさん
2007/01/05(金) 00:16:20↑に注目せいや
0112デフォルトの名無しさん
2007/01/05(金) 00:19:52> ld returned 1 exit status
コマンド "ld" はステータスコード 1 を返して終了しました。
つまりコンパイル後のリンクでエラーが発生。
> undefined reference to '_scnaf'
_scanf というシンボルが定義されてないぞゴラァ。
libc とかを一緒にリンクしてあげましょう。
0113cygwinで
2007/01/05(金) 00:24:34scanfをscnafと入力ミスしている所がありました。
でも、scnafでもgccできるんですね。初めて知りました。
すみません。
0114デフォルトの名無しさん
2007/01/05(金) 00:26:44そのケースは、コンパイルはできるがリンクできないのでldの段階でエラーが発生した、ということ。
(どういう意味で使っているのか知らんが)「gccできる」わけじゃない。
0115cygwinで
2007/01/05(金) 00:32:02入力ミスもコンパイルできないと思っていました。
ありがとうございます。
0116デフォルトの名無しさん
2007/01/05(金) 00:38:370117デフォルトの名無しさん
2007/01/05(金) 01:17:13strlenとか使う時は、size_tでしたほうがいいよとか聞いたけど
0118デフォルトの名無しさん
2007/01/05(金) 01:21:21hoge_t の _t は type のことで、size_t bヘサイズを格納bキる型ってこと=B
実体は unsigned int なことが多い。
0119デフォルトの名無しさん
2007/01/05(金) 01:28:04サイズを格納するときは素直にsize_tを使っておけということだ。
0120デフォルトの名無しさん
2007/01/05(金) 01:31:310121デフォルトの名無しさん
2007/01/05(金) 01:36:49構造体から西暦で入力されたデータを取り出して、年齢算出関数を呼び出すには、
どうしたらいいですか?
0122デフォルトの名無しさん
2007/01/05(金) 01:46:37localtimeでstruct tmに変換して、その年数やら月やらを使え。
年齢算出関数なんて都合のいいもんは用意されてない。
0123デフォルトの名無しさん
2007/01/05(金) 03:08:00順番的におかしいでしょうか?因みに、Cのイメージなどは使えました。
0124デフォルトの名無しさん
2007/01/05(金) 03:18:27理解にも色々あるし
実用的な理解力、
また業務的な理解力、
そうでない理論的な理解力もある
実用的なソフト作る為にも
実用的な思考を育てとこう
0125デフォルトの名無しさん
2007/01/05(金) 03:24:28順番的におかしくないですね?因みに、Cのイメージなどは使えました。
0126デフォルトの名無しさん
2007/01/05(金) 06:20:10最近は 8 バイトの型のこともあるね。
size_t を使うときの注意は、通常 unsigned だから、
for 文で int のカウンタとの比較してしまうと鬱陶しい警告が出る・・・というか、
size_t が 8 バイトの場合は int をカウンタとして使う事自体が危ない。
そういうわけでカウンタにも size_t を使うべき。
さらに、unsigned だから
for(i = length - 1; i >= 0; i--) { ... } /* i, length は size_t 型の変数 */
のようにカウントダウンしようとしても、
i は常に >= 0 だから無限ループになる。
この場合は for(i = length; i > 0; ) { i--; ... } とすればいい。
0127デフォルトの名無しさん
2007/01/05(金) 09:28:15そもそもfor文のカウンタをsize_tにすんな
0128デフォルトの名無しさん
2007/01/05(金) 09:42:48なんだそりゃw
根拠を書けよ
0129デフォルトの名無しさん
2007/01/05(金) 09:44:590130デフォルトの名無しさん
2007/01/05(金) 09:46:25>この場合は for(i = length; i > 0; ) { i--; ... } とすればいい。
こんなアホなことやってるやつがいるんだな
0131377
2007/01/05(金) 09:48:28して
case WM_USE:
SendMessage(*, WM_USER, *, *);
しても無限にSendMessageされないのなんで?
0132デフォルトの名無しさん
2007/01/05(金) 09:49:24して
case WM_USER:
SendMessage(*, WM_USER, *, *);
しても無限にSendMessageされないのなんで?
0133デフォルトの名無しさん
2007/01/05(金) 09:50:53して
case WM_USER:
SendMessage(*, WM_USER, *, *);
しても無限にSendMessageされないのなんで?
0134デフォルトの名無しさん
2007/01/05(金) 10:10:48実際のアルゴリズムに関係のないループ変数は分かりにくい
0135デフォルトの名無しさん
2007/01/05(金) 11:00:48ここの住人には回答は無理ぽ
Win32 API専用スレに行こう
0136デフォルトの名無しさん
2007/01/05(金) 11:32:260137デフォルトの名無しさん
2007/01/05(金) 12:41:18for(i = 0; i < length; i++) で i と length の型は揃えるべきだろ?
値域や符号付き符号無しが違うとバグの温床になる可能性があるじゃん。
length がどうしても size_t になるのなら、i は size_t にすべき。一番安全。
0138デフォルトの名無しさん
2007/01/05(金) 13:57:59lengthの最大値がUNSIGNED_MAXより小さい保証があるならfor (unsigned i = 0; i < length; ++i)でいいじゃん。
0139デフォルトの名無しさん
2007/01/05(金) 14:02:41> lengthの最大値がUNSIGNED_MAXより小さい保証があるなら
こういう「仮定」を置けるなら、それこそ別にintだって構わないだろう。
仮定を置きたくない、robustなコードを書きたいならsize_tにすべきって
話じゃね?
0140デフォルトの名無しさん
2007/01/05(金) 14:08:37等号含んでないから length は UNSIGNED_MAX 含んでもセーフじゃね?
0141デフォルトの名無しさん
2007/01/05(金) 17:56:42そのすべてを組み合わせた平面上の11x11個の点(x,y)を考える.
これらの点のうちで、
y = 2 ( x -7 ) * ( x -7 )
y = 8
の2つの線に囲まれた領域内(線上は除く)に含まれる点の数を出力するプログラムを作成せよ。
1日ぐらい考えてるが、どう解いてよいのかさっぱり分からない。どなたかおしえて下さい。
0142デフォルトの名無しさん
2007/01/05(金) 18:08:07点自体は 11x11 の 121 個しかないから、それ一個ずつ調べればよさそう。
で、2つの関数がどちらも y= の式になってるから、x を一致させたときに
点の y 座標が2つの関数の間にあればいいだろう。
問題はどっちの関数を天井にして床にするかだが…
一次関数と下に凸な二次関数だから、二次関数が床で一次関数が天井になるのかな。
0143デフォルトの名無しさん
2007/01/05(金) 18:38:43void click(HWND,int*);
void click(HWND hWnd,int *scene) {
*scene++;
return;
}
:
static int scene; //シーン番号
:
case WM_LBUTTONUP:
{
click(hWnd,&scene);
scene++;
timOn = TRUE;
InvalidateRect(hWnd , NULL , FALSE);
break;
}
:
//出力方法
//互換性のあるhBufからhdcへ
wsprintf(str , "%d %d" , scene, tzkX);
TextOut(hBuf , 0 , 10 , str , 5);
BitBlt(hdc , 0 , 0 , 640 , 480 ,
hBuf , 0 , 0 , SRCCOPY);
関数内で変数sceneを加算してるのに
全然加算されません。外では加算しても認識されるのに・・・
なんででしょうか。教えてください。
お願いします。
0144デフォルトの名無しさん
2007/01/05(金) 18:44:45ポインタを進めているだけで中の値はかわっていない。
(*scene)++; /* 分かり難いなら scene[0]++ でも等価か */
すれば?
0145デフォルトの名無しさん
2007/01/05(金) 18:48:50ありがとうございます。
初めて知りました。
ポインタ薦めてただけなのか・・・
0146デフォルトの名無しさん
2007/01/05(金) 18:55:08文字列複写なんかの例で良く見る
while(p) *p++ = *q++;
は、中身をインクリメントせずに pなりqなりのポインタをインクリメントしてるし。
評価順がややこしいのは慣れるしかないな。
0147デフォルトの名無しさん
2007/01/05(金) 19:22:07while( *p++ = *q++ );
じゃないかのう。
少なくとも while の中がポインタじゃマズイと思われ。
0149ただ
2007/01/05(金) 21:05:390150デフォルトの名無しさん
2007/01/05(金) 21:41:44マルチポスト氏ね
0151デフォルトの名無しさん
2007/01/06(土) 09:11:14>どっちの関数を天井にして床にするか
そのくらい、比較すればわかることジャン。
0152デフォルトの名無しさん
2007/01/06(土) 10:23:220153デフォルトの名無しさん
2007/01/06(土) 10:32:19紙と鉛筆で計算して、求めた答えを出力するだけのプログラム書いてもいいことになるし
0154デフォルトの名無しさん
2007/01/06(土) 10:35:290155デフォルトの名無しさん
2007/01/06(土) 10:36:51そうすりゃ、141の例だけじゃなく、全ての放物線と直線に一般化できる。
もちろん接するときや交わらない場合なんかも判定してな。
0156デフォルトの名無しさん
2007/01/06(土) 11:43:42今までは普通にプログラムできてたのに、いきなりコンパイルできなくなった…。なにを
しでかしたのか自分でもあんま覚えてない。
ターゲットは「Windowsアプリケーション」にしてるし、「14歳からはじめるC言語〜」という
本の通り完全に設定してるはずなんだけど、どこか設定ファイルがおかしいのかな。
Borlandのサイトとか色々見て回ったけど、解決しない…。
0157デフォルトの名無しさん
2007/01/06(土) 11:45:080158デフォルトの名無しさん
2007/01/06(土) 11:53:35今まではできてたんだけど-wとか付けた覚えないなぁ。
なんか「WinMainが未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照)」とか表示されてる
んだけど、このC0W32.OBJって関係あるのかな…。
0159デフォルトの名無しさん
2007/01/06(土) 11:53:570160156
2007/01/06(土) 12:21:11プログラム自体はコンパイルできなかったプロジェクトのコピペだし、
設定も全く一緒なのになんでだろ…。
つか今日昼から仕事だっつーのにしょーもないことで時間食わされて
かなりイライラして、軽く発狂気味だったことが悔やまれるorz
死ねぼけええええええ!とかWindowsSATUGAIするぞ!とかイロイロ
喚いて怖かったでしょう、お隣さん。ごめん。
0162デフォルトの名無しさん
2007/01/06(土) 13:17:50「囲まれた領域」であるならどっちが底でどっちが天井かはどうでもいいと思うが。
0163デフォルトの名無しさん
2007/01/06(土) 13:59:280164デフォルトの名無しさん
2007/01/06(土) 16:30:06環境をまとめて提出しない
win32apiということでもスレ違い
エスパータイプかよ
0165デフォルトの名無しさん
2007/01/06(土) 17:12:40それだとWinMainが重複して定義されてるとか言われるだろ
>WinMainが未解決
プロトタイプ宣言があるのに実体が無い場合
0166デフォルトの名無しさん
2007/01/06(土) 17:32:41プロトタイプ宣言があって実体がない関数でそんなメッセージは出ないよ。
Cだったらありえない。
リンカが吐いているエラーでしょ。ライブラリとかスタートアップコードとかが
WinMainを参照しているのに、オブジェクト中どこを探してもそれがない、
とリンカが言ってるんだよ。
たとえばこんなコードで同様のエラーを起こせるよ。
int ahoaho(void);
main() {
bakabaka();
}
これをコンパイル・リンクしたらbakabakaが未解決とか出るよ。
ahoahoについてはなんの言及もない。
0167デフォルトの名無しさん
2007/01/06(土) 19:51:28単にWinMain()入りのソースをプロジェクトに入れ忘れとか、そんな悪寒
0168デフォルトの名無しさん
2007/01/06(土) 22:08:46void store(int *arg){
*arg = 1;
}
int main(void){
int *p;
store(p);
return 0;
}
こんな風に関数にポインタ変数渡すことって出来ないんだっけ?
Segumentation faultがでるんだが
int p;
store(&p);
0170168
2007/01/06(土) 22:16:56そいつに対して値を代入する関数を書こうと思ったんだが・・・
やっぱ168に書いたみたいにはできんのな・・・
0171デフォルトの名無しさん
2007/01/06(土) 22:29:22家をたててないのに住所だけ作って、そこに手紙を届けようとしてるようなもんだ
届くわけが無い。
0172デフォルトの名無しさん
2007/01/06(土) 22:39:090173デフォルトの名無しさん
2007/01/06(土) 22:41:15int a;
int *p = &a;
store(p);
0174デフォルトの名無しさん
2007/01/06(土) 22:42:48つまり
#include <stdio.h>
void store(int *arg){
*arg = 1;
}
int main(void){
int *p,a;
p = &a;
store(p);
printf("%d", *p);
return 0;
}
ならばいいわけですね。ってかこれだけ実行してみたら上手くいきました。
上手く理解できました。直面している問題の解決にも役立ちそうです。ありがとう。
0175デフォルトの名無しさん
2007/01/07(日) 01:04:565回分kazuに乱数(10の整数まで)を足していって
最後にkazuの値が偶数か奇数かを表示するプログラムを練習で作ってみたのですが、
なぜか答えが627556で固定されてしまいます
1時間半ほど睨めっこしてみたのですが解決することが出来なかったので
どうかお助けください・・・
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
int i,a,kazu=0,ransu;
printf("aを入力:");
scanf("%d",&a);
while(a!=0){
srand((int)time(NULL));
for(i=0;i<=5;i++){
kazu=kazu+rand()%11;
printf("%d\n",&kazu);
}
{
if(kazu%2)
printf("奇数\n");
else
printf("偶数\n");
}
scanf("%d",&a);
}
return 0;
}
0176デフォルトの名無しさん
2007/01/07(日) 01:11:06計算結果ではなくポインタを表示しようとしている。
0177デフォルトの名無しさん
2007/01/07(日) 01:26:12printf("%d\n",&kazu);
は
}
{
の↓でいいんでしょうか・・・?
0178デフォルトの名無しさん
2007/01/07(日) 01:42:050179デフォルトの名無しさん
2007/01/07(日) 03:30:58#include<stdlib.h>
#include<time.h>
int main(void){
int i,a,kazu=0;
srand((int)time(NULL));
do {
printf("aを入力:");
scanf("%d",&a);
if(a!=0){
for(i=0;i<5;i++){
kazu+=rand()%11;
printf("%d\n",kazu);
}
}
if(kazu%2)
printf("奇数\n");
else
printf("偶数\n");
} while(kazu%2 != 0);
return 0;
}
これでどうだろうか
0180デフォルトの名無しさん
2007/01/07(日) 03:35:24最後のwhileはwhile(kazu%2==0);だった
0181デフォルトの名無しさん
2007/01/07(日) 03:45:16メモリ"番地"なんだから言われてみれば至極当然な説明だが
素晴らしいと思った
0182デフォルトの名無しさん
2007/01/07(日) 04:28:17int *p,a;
っておかしくない?
int* p,a
って事にならないの?
0183デフォルトの名無しさん
2007/01/07(日) 04:32:02int* p,a; って書いても a はポインタにはならないってのは超基本だろ?
0184デフォルトの名無しさん
2007/01/07(日) 04:42:32すまん、そうみたいだな
0185デフォルトの名無しさん
2007/01/07(日) 04:44:420186デフォルトの名無しさん
2007/01/07(日) 08:06:020187デフォルトの名無しさん
2007/01/07(日) 08:45:29勿論コンパイル・リンクは問題なく行なわれるが、入力に*cがないと次の数値入力が行なわれないはず。
0188デフォルトの名無しさん
2007/01/07(日) 08:51:36あと、最初の引数は""で括らないとコンパイル通らないんじゃまいか。
0189デフォルトの名無しさん
2007/01/07(日) 08:54:040190186
2007/01/07(日) 09:15:17読み飛ばし(というか入力区切り)に使える事を知らなくて *c はコンパイラ特有のマクロかと
思っちゃいました。*cを区切りとして入れると標準入力バッファから変数にちゃんと格納されました(爆
ありがとうございました。
0191爆
2007/01/07(日) 10:03:23_ゝ -''` ー- _
/ \
/ ヽ 、′ 、 ’、 ′ ’ ; 、
,':.. ', . ’ ’、 ′ ’ . ・
!:::::. , -────── 、 | 、′・. ’ ; ’、 ’、′‘ .・”
|:::::::. | `ィェァ `ィェァ| | ’、′・ ’、.・”; ” ’、
|::::::::.. `───────' | ’、′ ’、 (;;ノ;; (′‘ ・. ’、′”;
.|:::::::::::.. | ’、′・ ( (´;^`⌒)∴⌒`.・ ” ; ’、′・
|::::::::::::::.. l 、 ’、 ’・ 、´⌒,;y'⌒((´;;;;;ノ、"'人 ヽ
l:::::::::::::::::.... / 、(⌒ ;;;:;´'从 ;' ;:;;) ;⌒ ;; :) )、 ヽ
|:::::..ヽ:::::::::::.... / ( ´;`ヾ,;⌒)´ 从⌒ ;) `⌒ )⌒:`.・ ヽ ,[]
|:::::::....` 、:::::::::.. / ′‘: ;゜+° ′、:::::. ::: >>000´⌒(,ゞ、⌒) ;;:::)::ノ ヽ/´
}::::::::::::::::...`ヽ_人,ノ{ `:::、 ノ ...;:;_) ...::ノ ソ ...::ノ
 ̄:::::::::::::::.:::::::::::::::::::..  ̄ ー- _
::::::::::::::::::::::::::::::::::::::::::::::::.... \
0192物乞い
2007/01/07(日) 16:49:56メールを読み込んで
添付ファイルを保存したい。
欲しいもの
Cソース
ギブミーチョコレート!!!
0193デフォルトの名無しさん
2007/01/07(日) 17:02:33#include <strdio.h>
#include <mail.h>
int main(void){
FILE *fp;
MAIL *mail;
CONTENT *con;
fp=fopen("hogehoge.mail", "r");
mail=getmail(fp);
fclose(fp);
printf("Mail: %d\n", getmailsbj(mail));
printf("MIME: %s\n", getmailmime(mail));
con=getmailcontents(0);
...
}
みたいに
0194デフォルトの名無しさん
2007/01/07(日) 17:22:40前提条件がなさ過ぎる上にどのみちなんかのコンポーネントでも
利用しない限り、数十行程度のコードでは収まらん。
前提条件(※)を明示して宿題スレかどっかに逝け。
※↓最低でもこれぐらいは書け。
・OSはなんなのか。
・サーバから読むのか、メーラのデータを読むのか。
・サーバから読むのなら、プロトコルはなんなのか?
・メーラのデータを読むのなら、どのメーラなのか?
0195デフォルトの名無しさん
2007/01/07(日) 17:24:42メールの保存形式って色々あるからねぇ
0196物乞い
2007/01/07(日) 18:05:16やりたいことは193のやってることです。
#include <mail.h>
OS:FreeBSD
サーバーのファイルから読み込み。
で、欲しいのはそのコンポーネントが欲しいです。
#include <mail.h> //<--コレ
0197デフォルトの名無しさん
2007/01/07(日) 18:31:24char buf[MAX_LINE];
int getline(FILE *fp)
{
int i;
for (i=0; (buf[i++]=fgetc(fp)) != '\n';)
if(feof(fp)) return 0;
buf[i]='\0';
return i-1;
}
こんな感じでファイルから一行だけ読み込む関数書いてます
毎回ループの中(もしくは条件式)でファイルの終端かどうか調べるのが
納得いかないのですがどうするのが妥当でしょうか?
0198デフォルトの名無しさん
2007/01/07(日) 18:54:26サーバから読むのなら、プロトコルがなんなのか書けって言ってるだろが!
てか、ここじゃなくて宿題スレあたりに逝け!
0199物乞い
2007/01/07(日) 19:00:33ごめん言い方が悪かったな。
サーバーから読むといっても
ローカルのファイルから読み込むんだ。
いまSSHで接続してるのでサーバーっていったけど。
0200デフォルトの名無しさん
2007/01/07(日) 19:02:23・なんで素直にfgets()を使わないのか。
・MAX_LINEを越える行長だった場合はバッファオーバーフローを引き起こすぞ。
こんな用途でいちいちグローバル変数を用いるのもよろしくない。
・fgetc()の戻り値をチェックせずにbufに突っ込むのはよろしくない。
EOFが返された時、多分0xffのような値がbuf末尾に入る。
・このままだとファイル末尾に改行が無いようなケースでは、その行は
破棄されることになる。
どうしてもそういうデザインでやりたいのなら、せめて以下のように
書いたほうが良い。
int getline(FILE *fp)
{
int i, c;
for (i = 0; i < MAX_LINE-1 && (c = fgetc(fp)) != EOF && c != '\n'; ++i)
buff[i] = c;
buff[i] = '\0';
return i;
}
0201物乞い
2007/01/07(日) 19:06:27宿題スレのほうにいくよ。
0202デフォルトの名無しさん
2007/01/07(日) 19:08:43それならそれで、どんな形式のファイルか明示(※)しないと誰も答えようがない。
ちなみにおまいが言ってるファイルがPOPサーバなんかが一時保管しているメールデータの
ことであれば、違うアプローチを採用することを強く推奨する。
それと、ここじゃなくて他所のスレに逝けって言ってるだろが。
※
いい例:hogeメーラのhigeディレクトリにあるhageファイル
悪い例:メールのファイル
0203デフォルトの名無しさん
2007/01/07(日) 19:15:041ファイル1メッセージの。
RFC822なりMIMEなりのキーワードでぐぐるのが早いんじゃね?
google code searchを利用してもいいし
オープンソースのメーラからコードパクるのもいいわな。
mnewsとかmuttとか。
ライブラリもあるだろ。
0204物乞い
2007/01/07(日) 19:17:15律儀に答えてくれてすまんね。
俺が聞きたかったのはそれだよ。
メールデータ(POP3のパケットをダンプしたのを結合したファイル)
を読み込ませるつもりなんだ。
で、Cで書かれたMIMEデコーダがどっかにあるだろうと
思ったので聞いてみたんだ。
0205デフォルトの名無しさん
2007/01/07(日) 19:19:19ちょ、最初からそれを書けw
0206デフォルトの名無しさん
2007/01/07(日) 19:20:09>メールデータ(POP3のパケットをダンプしたのを結合したファイル)
>を読み込ませるつもりなんだ。
>で、Cで書かれたMIMEデコーダがどっかにあるだろうと
>思ったので聞いてみたんだ。
奇遇だな。俺らが聞きたかったのはそれだよ。最初から言ってくれよ。
0207物乞い
2007/01/07(日) 19:30:48たしかに読み返すとわからないな。
0208197
2007/01/07(日) 19:48:37ご指摘&参考コードありがとうございます
fgets使わないのもint型変数に代入してからbufに代入し直さないのも
どうにも無駄なことをしているって感触が気持ち悪くて…
最近のコンパイラはめちゃくちゃ優秀なのも
そもそも自分が読ませようとしてるファイルの容量(精々数百KB)くらいなら
体感で大差ないのも良く分かってるんですが…
最後のreturn分でfp->_flagを返すようにすればいいかなと思ったんですが、これでも駄目みたいですね
0209デフォルトの名無しさん
2007/01/07(日) 19:59:08何で「無駄」と考えるのか全く理解できないな。
速いが正しく動作しないコードには全く意味が無いし、
本当に速くなるかどうかすら疑問ときている。
一体なぜfgetc()で手書きする方がfgets()より速いと思うんだ?
マルチスレッド環境下では、一般にfgetc()は一文字単位での排他制御を引き起こす。
むしろ遅くなるんだぞ。
シングルスレッドかつ、マクロで実装されている可能性の高いgetc()を
使うなら、fgetc()よりはマシだが、それでも行読みしたいのなら、
fgets()のほうがより最適化されている可能性が高い。
想像だけでモノを語っても無駄だ。せめて実測しろ。
プログラムは遅くなる、わざわざ手書きして標準より劣る仕様で
車輪の再発明をするのはプログラマの時間の無駄。
何もいいことなどありはしない。
0210197
2007/01/07(日) 20:34:22すいません、理由を省いてました
fgets()でMAX_LINE分文字を読み込む場合だと余分に読み込む場合がほとんどになりそうで
そういうのがむしろfgetsの方が速いと知らされても気に掛かるんです
お金じゃないんだから気にせずジャンジャン行った方がいいんですかね
趣味でやっているだけなので、効率より自分が納得いくこと優先させたいなと…
0211デフォルトの名無しさん
2007/01/07(日) 20:47:26いいえ。
>効率より自分が納得いくこと優先させたい
理解できていないのに勝手な憶測するだけ無駄です。
0212デフォルトの名無しさん
2007/01/07(日) 20:48:13余分に読み込むって何が何を余分に読み込むんだ?
どうしても気になるならプロファイルとって自分で書いたほうが本当に速いのを確認してから最適化したら?
現状だと100%君が書いたコードのほうが遅いと俺は思うがな。
0213デフォルトの名無しさん
2007/01/07(日) 20:55:24stdio系の関数は特に対処しないとBUFSIZ単位で読むので、
1行読むなんて場合だとfgetsを使おうがfgetc使おうが
関係なしに余分に読み込むと思うよ。
0214デフォルトの名無しさん
2007/01/07(日) 21:08:01一定量データ読み込んだ中からさらに第二引数の分だけ返すんですね
内部でfgetc()何度も呼んでると思ってた自分が馬鹿でした、素直にfgets()使います
お騒がせしてすみませんでした、助言ありがとうございます
なんかBUFSIZを勘違いしてないか?
0216ぽぽ
2007/01/08(月) 00:21:44以下のプログラムは、入力された10個の数値を引き算し、その結果を表示するプログラムです
9〜11行目を別の関数(関数名はFuncDev)とし、修正しなさい。ただし、グローバル変数は使わないこと。
また、FuncDev内のローカル変数名は任意とする。
FuncDev関数は、以下の定義とする。
int FuncDev(void);
FuncDev関数の戻り値は、画面入力されたint型データとする。
#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);
}
0217デフォルトの名無しさん
2007/01/08(月) 00:35:32for(n1=0;n1<10;n1++){
printf("0-9の数値を入力");
scanf("%d",&n2);
nt-=n2;
}
↓
for(n1=0;n1<10;n1++){
nt-=FuncDev();
}
かな...
問題出せばいいのに。。。
0219ぽぽ
2007/01/08(月) 01:04:48このプログラムで本来なら入れるべき処理は何か。それを指摘しなさい。
1:char*pstr;
2:
3:pstr=malloc(100);
4:sprintf(pstr,"123");
5:pstr=malloc(10);
6:sprintf(pstr,"456");
7:free(pstr);
0221ぽぽ
2007/01/08(月) 01:13:200222デフォルトの名無しさん
2007/01/08(月) 01:14:344行めと5行目の間に、7行目と同じのを入れればいいと思う。
(しかし出題者がすごいレベル低そう)
0224デフォルトの名無しさん
2007/01/08(月) 01:28:520225デフォルトの名無しさん
2007/01/08(月) 01:31:505. と 6. の間に */
でもいいかもw
0226デフォルトの名無しさん
2007/01/08(月) 01:51:45それは処理ではないからだめでそw
0227デフォルトの名無しさん
2007/01/08(月) 03:02:03表示形式は日付と時間が表示されればいいんですが。
お願いします。
0228デフォルトの名無しさん
2007/01/08(月) 03:26:00#include <stdio.h>
#include <time.h>
int main(void)
{
time_t t = time(NULL);
struct tm *tim = NULL;
t+=15*60*60;
tim = localtime(&t);
if(tim) printf("%s",asctime(tim));
return 0;
}
恐ろしくやっつけ仕事
0229デフォルトの名無しさん
2007/01/08(月) 04:04:32次のプログラムにおいてFunc_read関数はstrcmpを使用しています。
これをmemcmpを利用したロジックに作り直しなさい。
int Func_read(void)
{
char *prtn1;
char *prtn2;
char szdat1[81];
char szdat2[81];
int nrtn;
prtn1=fgets(szdat1,81,Fp1);
prtn2=fgets(szdat2,81,Fp2);
if(prtn1==NULL||prtn2==NULL)
return(9);
nrtn=strcmp(szdat1,szdat2);
if(nrtn!=0)
return(-1);
return(0);
}
0230デフォルトの名無しさん
2007/01/08(月) 04:18:45sizeof(szdat1)はもはや81でいいのかも...
0231デフォルトの名無しさん
2007/01/08(月) 04:19:47↓
nrtn=memcmp(szdat1,szdat2,81);
memcmpとstrcmpは実装がほぼ一緒。
strcmpはnull終端文字列を扱う事を想定して実装されてるから
nullで処理が止まるけど、memcmpはそれがないだけ。
後は引数の型がちょっと違うけど、ポインタ同士だし
それはどうでもいいよね(´・ω・`)気になるならキャストすればいい
0232デフォルトの名無しさん
2007/01/08(月) 04:21:350233デフォルトの名無しさん
2007/01/08(月) 04:25:40nrtn=strcmp(szdat1,szdat2);
↓
nrtn=memcmp(szdat1,szdat2,81);
にするだけでいいんですか?
0234デフォルトの名無しさん
2007/01/08(月) 04:30:44多分組込の世界のヒトなんでせう。
0235デフォルトの名無しさん
2007/01/08(月) 04:35:27> printf("0-9の数値を入力");
> scanf("%d",&n2);
なんてやるわけねーw
0236デフォルトの名無しさん
2007/01/08(月) 04:45:25void main(void)は組み込み系ということでわかるが
scanf()って。
でも最近「C勉強しだしました」って人でたまにvoid main(void)を見る
なんでだろ。
いくらなんでも最近の本でvoid main(void)が主流みたいな書き方
してる本て無いと思うんだけど。
大学とかではそういう風におしえんのかな。電気電子学科卒の俺には
情報系の学科の履修によっての教え方はわかんねぇ。
0237デフォルトの名無しさん
2007/01/08(月) 05:17:20というか情報学科でも最初っから全員C知ってるわけじゃないから
基本的に1から教える事になる。だからそういう細かい事は全部省略される。
言語の細かい仕様を教えるんじゃなくて「C言語の一般的な扱い方」だけ教える感じ。
授業のレベルは上がっても講義は全部基本的な事に留まる。
細かい事は全部教授に質問にいかないといけない。
0238デフォルトの名無しさん
2007/01/08(月) 13:27:24挿入法とクイックソートではどうやるんでしょうか?
交換法のやり方では作れたんですが、サンプルをください
0239デフォルトの名無しさん
2007/01/08(月) 13:28:41googleさんに聞いてみたりとかWikipediaで調べてみたりとか
0240デフォルトの名無しさん
2007/01/08(月) 14:09:15挿入法が即効で解決しました。
クイックソートも粘ってみます。どうも
0241デフォルトの名無しさん
2007/01/08(月) 14:14:240242デフォルトの名無しさん
2007/01/08(月) 14:51:36void quick_sort(int n,int a[])に合わせないと不都合があるのですが
0243デフォルトの名無しさん
2007/01/08(月) 14:56:120244デフォルトの名無しさん
2007/01/08(月) 14:59:240245デフォルトの名無しさん
2007/01/08(月) 14:59:33あっちのテンプレ通り問題文を貼ったりする意味がないと判断してこっちにしました。
要は関数の中身だけなんですよ。
乱数とかエラーチェックの関数とか全部nとa[]で作っているので
合わせないと不都合なのですが変数2つのクイックソートが見つからないです。
0246デフォルトの名無しさん
2007/01/08(月) 15:00:54ライブラリの qsort() って本当にクイックソートなのかどうかわからないのでは?
0247デフォルトの名無しさん
2007/01/08(月) 15:02:13それはまだ調べてなかったです。そういえば問題文に禁止って書いてないし
使っていいのかな・・・
変数3つのやつは多分配列の最初と最後とポインタで3つなんですが
配列の個数とポインタだけで作れないかで悩んでました。
0248デフォルトの名無しさん
2007/01/08(月) 15:26:10変数2つのやつは、単に変数3つのやつを、その中から呼べば良いじゃん?
0249デフォルトの名無しさん
2007/01/08(月) 15:28:27配列のアドレスでは先頭要素を知ることができない。というわけで>248
0250デフォルトの名無しさん
2007/01/08(月) 15:32:57あんま見ない実装だけど。
0251デフォルトの名無しさん
2007/01/08(月) 15:35:17変数3つでクイックソートの関数を作って
変数2つでそれを呼び出すだけの関数を作るという意味?
0252デフォルトの名無しさん
2007/01/08(月) 15:36:50そう。
0253デフォルトの名無しさん
2007/01/08(月) 15:40:410254デフォルトの名無しさん
2007/01/08(月) 15:41:48普通に使う時には必要ない、ってな時によく使う手じゃん?
0255デフォルトの名無しさん
2007/01/08(月) 15:50:00引数さえあわせこめば「変数2つでそれを呼び出すだけの関数」はいらないじゃん。
0256デフォルトの名無しさん
2007/01/08(月) 15:53:27呼び出す側の都合を考えろよw
0257デフォルトの名無しさん
2007/01/08(月) 15:55:410258デフォルトの名無しさん
2007/01/08(月) 16:00:47丸投げはあそこが一番むいとる
0259デフォルトの名無しさん
2007/01/08(月) 16:07:59void 関数の名前(int n,int a[]){
int left,right,i;
quick_sort(a,left,right);
printf("結果\n");
for(i=0;i<n;i++){
printf("%d\n",a[i]);}
}
何がまずいんでしょう。
コンパイルエラーは出ませんが実行したらエラーが出ます。
0260デフォルトの名無しさん
2007/01/08(月) 16:09:040261デフォルトの名無しさん
2007/01/08(月) 16:09:540262デフォルトの名無しさん
2007/01/08(月) 16:10:45left と right を宣言して、何も代入せずに、
そのまま quick_sort につっこんでるじゃん?
0263デフォルトの名無しさん
2007/01/08(月) 16:11:48クイックソートはここを参考にして組みました。
最初の変数の*ptrをa[]にしてポインタを入れた以外は変更してないです。
0264デフォルトの名無しさん
2007/01/08(月) 16:14:36宿題スレにいきな。
0265デフォルトの名無しさん
2007/01/08(月) 16:17:20right=a[n];
を宣言した直後に入れてみると一応エラーが出なくなったかわりに
クイックソートが機能しなくなりました><
0266デフォルトの名無しさん
2007/01/08(月) 16:19:210267デフォルトの名無しさん
2007/01/08(月) 16:22:41表示機能は完全に分離する。
これ、基本。
デバッグ用の一時的な出力はまあ別だけど。
0268デフォルトの名無しさん
2007/01/08(月) 16:23:220269デフォルトの名無しさん
2007/01/08(月) 16:24:37void quick_sort(int n,int a[])
{
int i;
int left=0;
int right=n-1;
quick_sort2(a,left,right);
printf("結果です\n");
for(i=0;i<n;i++)
{
printf("%d\n",a[i]);
}
}
できました。最初nでやって無理だったんでn-1で
宿題スレで丸投げしたら後で余計分からなくなるんでこっちに寄生させてもらいました。
ありがとうございました。
0270デフォルトの名無しさん
2007/01/08(月) 16:26:460271デフォルトの名無しさん
2007/01/08(月) 16:26:49そうだったんですか。
デバッグの関数もあるしややこしいから中に入れちゃったんだけど。
覚えておく
0272デフォルトの名無しさん
2007/01/08(月) 16:31:330273デフォルトの名無しさん
2007/01/08(月) 17:15:40或いは、%数字で空ければいいのでしょうか?
0274デフォルトの名無しさん
2007/01/08(月) 17:16:300275デフォルトの名無しさん
2007/01/08(月) 17:18:57俺なんか変なこと言ってる?
0276デフォルトの名無しさん
2007/01/08(月) 17:19:15printf("%*s", n, "");
でおk。n が入れるスペースの数。
0277デフォルトの名無しさん
2007/01/08(月) 17:20:240278デフォルトの名無しさん
2007/01/08(月) 17:30:090279デフォルトの名無しさん
2007/01/08(月) 17:34:580280デフォルトの名無しさん
2007/01/08(月) 17:58:05大丈夫、それを読むくらいならまともに質問できるから。
0281デフォルトの名無しさん
2007/01/08(月) 18:07:52確かに。Metroworks CodeWarriorではqsortはヒープソートで実装されている。
0282デフォルトの名無しさん
2007/01/08(月) 18:46:57int main()
{
double a = 0.5, b = 10.5;
int c = 215, d;
char e = 'A';
printf("%f + %f = %f\n", a, b, a + b);
d = c + 11;
printf("cの値は%dでこれに11を加えると%dとなります\n", c, d);
printf("eには\"%c\"が代入されています\n", e);
return 0;
}
これのdの意味がわからない。
ためしにd = c + 11抜いてみたら4235448とかいう値になったんだが。
0283デフォルトの名無しさん
2007/01/08(月) 18:57:31こりゃ間違いなくコンパイラのバグだな。
0284デフォルトの名無しさん
2007/01/08(月) 18:58:37exit -1;
という表記があったんですが、
makeすると
`exit' undeclared
と怒られます。
これはexit(-1)と書き換えてしまえばいいだけのことですか?
それとも、何か環境依存のせいでerrorを吐いてるんでしょうか。
これだけ直せば全体のmakeが完了するプログラムなのですが、
ここの対処をexit(-1)とするだけでよいのか判断できないので、
どうするべきか分かれば教えてください。
もちろん書き直してよいかはプログラムによりけりなのですが、
exit -1;
と書いて通らないのはうちの環境だけかも知れないので、
ぜひ教えてください。
Scientific Linux上でgcc 3.4.6です。
0285デフォルトの名無しさん
2007/01/08(月) 18:59:44その数に演算をするような文脈ではありません。
0286デフォルトの名無しさん
2007/01/08(月) 19:35:460287デフォルトの名無しさん
2007/01/08(月) 19:39:27exit(-1); でいいんじゃね?
>>286
多倍長演算ライブラリがどっかにあると思うのでそれを使う。
0289デフォルトの名無しさん
2007/01/08(月) 20:52:12変数は初期化しないとランダムな値が入ってる
0290デフォルトの名無しさん
2007/01/08(月) 20:58:32じゃぁ乱数関数の実装ってこんな感じ
int rand() {
int a;
return a;
}
0291デフォルトの名無しさん
2007/01/08(月) 21:32:34ソレダ!!!1!!11!
0292デフォルトの名無しさん
2007/01/08(月) 22:50:250293デフォルトの名無しさん
2007/01/08(月) 23:01:210294デフォルトの名無しさん
2007/01/08(月) 23:45:46予測不能ってことなら、セキュリティ用途でもバッチリじゃん! スッゲー!!1!!1!
0295デフォルトの名無しさん
2007/01/08(月) 23:52:00int fake_rand(void){
int a;
return a;
}
int hoge(void){
int a=1234;
return a;
}
int hoga(void){
int a=5678;
return a;
}
int main(void){
hoge();
printf("%d\n", fake_rand());
hoga();
printf("%d\n", fake_rand());
return 0;
}
0296デフォルトの名無しさん
2007/01/08(月) 23:52:12あんまり揚げ足とっていじめてやるなよw
確保したメモリ上にもともとあった情報が値として入るっていうだけで
無作為性も予測不可能性も再現不可能性も無い。
0297デフォルトの名無しさん
2007/01/09(火) 00:37:29#defineKAMOKU5
main()
{
intten[KAMOKU]={73,59,92,83,75};/*得点*/
intgoukei = 0;/*合計点*/
doubleheikin;/*平均点*/
charshimei[20]="太郎";/*氏名*/
charkamokuName[KAMOKU][10] = {"国語","数学","英語","社会","理科"};
charhyouka = '_';/*評価*/
inti;/*科目数*/
/*合計点と平均点の算出*/
for(i = 0;i < KAMOKU;i++)
{
goukei += ten[i];
}
heikin = (double)goukei / i;
/*評価を求める*/
if(heikin >= 60)
{
hyouka = '+';
}
else
{
hyouka = '-';
}
0298デフォルトの名無しさん
2007/01/09(火) 00:39:19printf("氏名:%s\n",shimei);
for(i = 0;i < KAMOKU;i++)
{
printf("%-6s:%3d点\n",kamokuName[i],ten[i]);
}
printf("\n");
printf("%sさんの合計:%3d点 平均:%5.1f点",shimei,goukei,heikin);
printf(" 評価:%c\n",hyouka);
}
これで、最初にintten[KAMOKU]={73,59,92,83,75};/*得点*/ とありますが
要素数の所に、[KAMOKU] と入っています、これは数字が本来入るべきではないのでしょうか?
もし、入って良いとしたら、何故でしょうか?ご教授お願い致します。
0299デフォルトの名無しさん
2007/01/09(火) 00:41:36これ以降は KAMOKU と書かれている箇所は 5 と書いたとみなされるd(^^)
0300デフォルトの名無しさん
2007/01/09(火) 00:43:30"教示"だろ
0301デフォルトの名無しさん
2007/01/09(火) 00:44:29…
>>298
プリプロセッサ でググってみては?
0302教授
2007/01/09(火) 00:50:15いえ、私はとある大学の教授です
どこの学校かは言えませんが
先月、パンツ盗んで捕まりましたが、ハッハッハ
今は塀の中ですよ、、ハッハッハ
0303デフォルトの名無しさん
2007/01/09(火) 00:52:53>ご教授お願い致します。
"教示"
0304デフォルトの名無しさん
2007/01/09(火) 01:14:19そんな何度も念押ししなくてもw
0305デフォルトの名無しさん
2007/01/09(火) 01:44:53教授:http://dictionary.goo.ne.jp/search.php?MT=%B6%B5%BC%F8&kind=jn&mode=0&base=1&row=0
教示:http://dictionary.goo.ne.jp/search.php?MT=%B6%B5%BC%A8&search_history=%B6%B5%BC%F8&kind=jn&kwassist=0&mode=0
教示は堅苦しすぎないか?w
0306sage
2007/01/09(火) 01:47:56それでこのスレに来たんだけど宇宙語が飛び交ってる・・・。
プログラマーって皆これくらいの知識持っていないと駄目なんですか?
それともレスをつけてる人達はめちゃくちゃハイレベルな人なんですか?
0307デフォルトの名無しさん
2007/01/09(火) 02:48:420308デフォルトの名無しさん
2007/01/09(火) 02:50:00友人には、csvを使えば楽といわれたのですが結局わかりません。
やり方を教えて頂けないですか?
0309デフォルトの名無しさん
2007/01/09(火) 02:58:170310デフォルトの名無しさん
2007/01/09(火) 03:00:57教養無さすぎワロタ
0311デフォルトの名無しさん
2007/01/09(火) 03:33:10struct celldata{
int color;
};
上の様な構造体を定義して、main関数で以下のように
構造体を宣言しています。
struct celldata *cell[DEPTH][HEIGHT][WIDTH];
ここで、cell[0][i][j]に数値を入れていきます。(0<i<HEIGHT, 0<j<WIDTH)
次にcell[1][i][j]にcell[0][i][j]の数値をコピーします。
その後cell[1][2][2]->colorの数値を直接変えるのですが、
同時にcell[0][2][2]->colorの数値も同じ値に変わってしまいます。
cell[1][2][2]の数値だけを変えたいのですが、どのようにすればいいのでしょうか?
0312デフォルトの名無しさん
2007/01/09(火) 03:35:21^^^^^^^^^^^^^^^^^^↑これがあるのに...
> cell[1][i][j]=cell[0][i][j];
って、同じアドレスにしたいのかなw
0313311
2007/01/09(火) 03:36:40//セルのコピー
for(i=0; i<HEIGHT; i++){
for(j=0; j<WIDTH; j++){
cell[1][i][j] = cell[0][i][j];
}
}
//値を書き換える
cell[1][2][2]->color = 2;
ここでcell[1][2][2]->colorは2に書き換えられるのですが、
同時にcell[0][2][2]->colorも同様に2に書き換えられてしまいます。
助けてください・・・。
0315デフォルトの名無しさん
2007/01/09(火) 03:51:260316デフォルトの名無しさん
2007/01/09(火) 03:52:34int x[3][4];
for(j = 0; j<4; i++){
for(i = 0; i<3; i++){
x[j][i] = 0;
}
}
この反復構造の二重ループで、わからない事があります
参考書の解説に依れば、
for(i = 0; i<3; i++){
x[j][i] = 0;
}
これは、内側のループでiをカウント、3*4回繰り返すと
書かれていますが、合計12回なんでしょうか?
それと、二重ループの解説を簡単にでいいので
解説お願いします。
0317デフォルトの名無しさん
2007/01/09(火) 03:53:29できるだけポータブルな方法で・・・・ってのは無理な相談ぽいですよね
0318316
2007/01/09(火) 03:55:22内側で繰り返す事を外側で、4回繰り返すと言う事でしょうか?
0319デフォルトの名無しさん
2007/01/09(火) 03:58:25その通りです。すなわち
x[j][i] = 0;
を合計12回実行する事になります。
0320316
2007/01/09(火) 04:05:24ありがとうごいます。
しゃかし、二重ループの意味が掴めません・・・・
>>318で書いた通りなのでしょうか?
となると、計48回になるのでしょうか?
0321デフォルトの名無しさん
2007/01/09(火) 04:05:29ポータブルな方法で扱いたいなら多倍長整数を自分でポータブルな実装をするとか。
0322デフォルトの名無しさん
2007/01/09(火) 04:09:57難しく考えず
for(j = 0; j<4; i++){
...
}
は、中身を4回繰り返し、
中身である
for(i = 0; i<3; i++){
...
}
は、その4回の繰り返しの1回ごとに、3回中身を繰り返す、と考えればいい。
だから、内側のループの中身である
x[j][i] = 0;
は全部で12回繰り返して実行されることになる。
0323316
2007/01/09(火) 04:16:40違うものや比喩にして、考えたいのですが、何か良い比喩表現はないでしょうか?
頭が爆発しそうです。
0324デフォルトの名無しさん
2007/01/09(火) 04:23:31の代わりに
printf("i=%d, j=%d\n", i, j);
にして実行してみると、何が行われているか理解しやすくなる…かも。
表示が12回行われることも含めて。
0325316
2007/01/09(火) 04:26:33あの回転円盤の上に更に回転カップがあると連想しますが微妙です。
皆さんの助言を改めて整理して考えました
では、その12回は中と外を合わせて(3×4)と考えて宜しいでしょうか?
0326デフォルトの名無しさん
2007/01/09(火) 04:27:27そこで以下の文について教えてください。
char *mnthp[4] = {
"January", "February", "March", "April"
};
int i;
for (i = 0; i < 4; i++) {
printf("%s\n", mnthp[i]);
}
これを実行すると結果は
January
February
March
April
になります。
ですが
printf("%s\n", mnthp[i]);
が
printf("%s\n", *mnthp[i]);
では無いのが理解できません。
なぜ最後に*が要らないのかを教えてください。
0327316
2007/01/09(火) 04:27:59ありがとうございます、やってみます。
0328デフォルトの名無しさん
2007/01/09(火) 04:32:20添字の範囲をオーバーしちゃうような。
x[j][i] = 0;
は
x[i][j] = 0;
だよね。
もしくは、
int x[3][4];
が
int x[4][3];
の間違い。
0329デフォルトの名無しさん
2007/01/09(火) 04:33:14はい。
0330デフォルトの名無しさん
2007/01/09(火) 04:36:44たぶん参考書の説明がおかしいと思います。
(著者の言いたいことは正しいのだろうが、日本語がおかしいって事)
つまり
iのループを3周したら、jのカウントが一つ増える。
そのjのカウントが増えるループは4周するのだから
3周×4周で12週(12回)と言うことでしょ
0331316
2007/01/09(火) 04:37:33ご指摘、ありがとうごいます。
>>329
何となくは理解?できました・・・
もう一つ疑問なのがあります
for(j = 0; j<NINZUU; j++)
{
/*合計点と平均点の算出*/
for(i = 0;i < KAMOKU;i++)
{
goukei[j] += ten[j][i];
}
heikin[j] = (double)goukei[j] / i;
/*評価を求める*/
if(heikin[j] >= 80)
{
hyouka[j] = 'A';
}
else if(heikin[j] >= 60)
{
hyouka[j] = 'B';
}
else
{
hyouka[j] = 'C';
}
}
これは反復に中に反復と多分岐が混ざっているのでしょうか?
0332デフォルトの名無しさん
2007/01/09(火) 04:38:16文字列は先頭の文字へのポインタってのは理解してる?
で、変数の型は、
*mnthp[] is char // これが宣言
mnthp[] is pointer to char
mnthp is an array of pointer to char
0333330
2007/01/09(火) 04:39:19再度すみません。
ひょっとしてc言語スタートブック(高田美樹著)をやっているのではありませんか?
0334316
2007/01/09(火) 04:40:19はい、そうですが・・・何故おわかりに・・・・
これは入門に不向きでしょうか?
0335デフォルトの名無しさん
2007/01/09(火) 04:41:06printfで%sに対応する引数は\0終端な文字配列へのポインタ。
mnthp[i]がまさにそれに当たる。
*mnthp[i]はmnthp[i]の最初の文字を意味する。
確かめるなら、
printf("%s\n", mnthp[i]);
でなく、
printf("%c\n", *mnthp[i]);
とすれば、
J
F
M
A
となるはず。
0336330
2007/01/09(火) 04:42:07一緒に頑張りましょう!!
ただ私のは初版なので誤字脱字が多いのが大変です。
0337316
2007/01/09(火) 04:45:29おーそうなんですかW
是非、がんばりましょう!
もう少し詳細な解説が欲しいです。
>>336さんは、穴埋めを敢えて自分で全てソースを書き直して
やってます?自分はそうしてます。時間はかかるけど。
0338311
2007/01/09(火) 04:46:07で宣言したd_maxという変数をmovement();という関数の引数として
渡しているのですが、movement();の関数の前と後で何故か値が変化しています。
printf("movementに入る前のd_max=%d\n", d_max);
movement(cell, x, y, 0, d_max);
printf("movementに入った後のd_max=%d\n", d_max);
↑を実行すると、
movementに入る前のd_max=4
movementに入った後のd_max=4561248
のような出力になっちゃいます。d_maxはポインタで
渡してるわけではないのですが、なぜこのような現象が起きるのでしょうか?
0339330
2007/01/09(火) 04:49:02私も全部書いています。
やはり書かないと覚えないですね。
0340デフォルトの名無しさん
2007/01/09(火) 04:49:34参考書を元に構造体でのソートを勉強中ですがとある例題がどうしても解けません。
お手数ですがどなたか教えてください。
#include <stdio.h>
#define MAX 5
typedef struct student
{
charname[20];
intkoku;
intsuu;
} mem;
int sort_student(struct student * const seito, int max)
{
return 0;
}
int main(void)
{
mem sankumi[]={
{"田中",56,72},{"佐藤",89,94},{"鈴木",35,80},{"山田",68,79},{"山本",23,31}
};
int i;
sort_student(sankumi,MAX);
printf("国語\n\n");
for(i=0;i<MAX;i++)
{
printf("氏名 %-6s 点数 %2d\n"
,sankumi[i].name,sankumi[i].koku);
}
}
0341316
2007/01/09(火) 04:52:29自分は一日、一章ごとにやっていますが
>>339さんは、どのくらいのペースでやっていますか?
因みに自分は一章終わるのに、4時間はかかります。
0342340
2007/01/09(火) 04:52:32コピペしたらタブのスペースが消えちゃいました。
わからない所はsort_studentの関数です。
よろしくお願いします。
0343330
2007/01/09(火) 04:55:16その後には関数があります。
そのあたりからかなりペースダウンしました。
0344316
2007/01/09(火) 04:57:37自分は、今4章ですが苦戦中でペ−スダウンに・・・
イメージは掴みつつ十日以内には終わらせたい。
0345デフォルトの名無しさん
2007/01/09(火) 04:57:42何の値をもとにソートすればいいのでしょうか?
国語と数学の合計点ですか?
0346デフォルトの名無しさん
2007/01/09(火) 04:57:51(1)実はd_maxはグローバル変数として宣言している。
(2)movementの実引数または何かのグローバル変数にd_maxへのポインタが含まれている。
で、movementがd_maxを書き換えている。
(3)確保した配列の範囲を超えてアクセスしてd_maxの領域を侵犯している。
ありそうなのは、cellの前後でd_maxを宣言してて、cellの添字限界を超えて書き換えているため、d_maxが変になってる。
0347340
2007/01/09(火) 05:03:42すいません説明不足でした。
国語の点数です。
0348330
2007/01/09(火) 05:13:28Januaryの“アドレス”がmonthp[0]に入っていると考えてしまうのです。
だから「January」と表示したいときには*monthp[i]じゃなかろうかと思うのです。
当然これは間違っているのですが、どうしても上手く理解できないのです。
申し訳ないのですが、もう少し教えていただけないでしょうか?
0349338
2007/01/09(火) 05:13:53>(1)
再確認したところ、ちゃんとd_maxはmain()関数内で
int d_max;で宣言しています。
>(2)
movement()の引数は↓のようになってます。
void movement(struct celldata *cell[DEPTH_MAX][HEIGHT][WIDTH], int x, int y, int depth, int d_max);
また、グローバル変数は
#define HEIGHT 3
#define WIDTH 9
#define DEPTH_MAX 4
の3つのみです。movementの引数またはグローバル変数にd_maxへの
ポインタが含まれてる事はないと思います。また、movement内では
d_maxは一切書き換えていません;;
>(3)
main()関数で
int d_max;
struct celldata *cell[DEPTH_MAX][HEIGHT][WIDTH];
のような感じで宣言をしています。確保した配列の範囲を
超えてアクセスするというのはよく分からないのですが、
どういった場合にそういうことが起こるのでしょうか?
0350デフォルトの名無しさん
2007/01/09(火) 05:16:170351デフォルトの名無しさん
2007/01/09(火) 05:19:33国語の点数をもとにバブルソート
int sort_student(struct student * const seito, int max)
{
mem temp;
int i, j;
for (i = 0; i < max - 1; i++){
for (j = 0; j < max - i - 1; j++){
if (seito[j].koku > seito[j + 1].koku){
temp = seito[j];
seito[j] = seito[j + 1];
seito[j + 1] = temp;
}}}
return 0;
}
0352330
2007/01/09(火) 05:20:22私の考え違いでした!!(当たり前ですね)
有難う御座いました!!
さてこんな私ですが、今日プログラマーの仕事の面接に行ってきます。(wr
みなさん応援してください。
0353340
2007/01/09(火) 05:20:26ありがとうございます!!
早速やってみます!!
0354デフォルトの名無しさん
2007/01/09(火) 05:21:55movement()の中でcellなり、他にポインタで渡された変数の中身を書き換えていない?
そのとき、ポインタで指していたデータ本来の領域を超えてアクセスしている可能性がある。
すると、別領域として確保していたd_maxまで間違えて書き換えてしまう恐れが。
よくあるパターンは配列のインデックスの範囲を超える(0より小さいとか最大値以上とか)とか、
ポインタに間違った値を加減算するとか。
0355338
2007/01/09(火) 05:23:26>>338に対する回答でしょうか?
あまり関係ないと思ったので書いてないのですが、for文で
for(d_max=0; d_max<DEPTH_MAX; d_max++){
for(x=0; x<HEIGHT; x++){
for(y=0; y<WIDTH; y++){
printf("movementに入る前のd_max=%d\n", d_max);
movement(cell, x, y, 0, d_max);
printf("movementに入った後のd_max=%d\n", d_max);
}
}
}
のように書いているので、printfの仕様ではないかと思います。
意図しない場所でd_maxがDEPTH_MAXを超えてしまいループから
出てしまうので、表示だけの問題でなく実際の数値も変になってると思います。
0356デフォルトの名無しさん
2007/01/09(火) 05:28:28monthp[0]に入っているのは先頭の'J'のアドレス。
printfの立場として、欲しいのは'J'の位置であって、'J'の値そのものじゃない。
printfは与えられたアドレスからヌル文字が出てくるまで一文字ずつ手繰っていくからね。
メモリの中身はこんな具合:
J a n u a r y \0 F e b r u a r y \0 M a...
^monthp[0] ^monthp[1] ^monthp[2]
0357340
2007/01/09(火) 05:30:18できました!!!
これで丸2日悩んでました・・・
こんな時間に本当にありがとうございました!!!
0358デフォルトの名無しさん
2007/01/09(火) 05:36:01問題点とは関係ないが、#define HEIGHT 3 のHEIGHTはグローバル変数ではない。
コンパイル前にソース内のHEIGHTという文字列を3に置換することをプリプロセッサに指示しているだけ。
ある意味グローバルな存在ではあるけれどね。
0359338
2007/01/09(火) 05:49:15movement()の中ではcellの値を書き換えまくってます・・・。
理論はなんとなく分かるのですが、どこでそうなってるのかが分からないです;;
mallocを使って動的にメモリを確保しているのですが、
本来の領域を超えてアクセスしたら、エラーがでますよね?
プログラム自体は正常に最後まで実行されています。
もしかして根本的に俺が理解してないのかも知れないです・・・
cell[4][3][9]で宣言してるのにcell[4][3][10]にアクセスしてるとか
そういうのとはまた別次元の話ですか?
0361デフォルトの名無しさん
2007/01/09(火) 05:53:43まさに最後の文の通り。
本来の領域を超えてアクセスしてもエラーにならない場合もある。
d_maxの領域を書き換えただけで終ってるなら、
それは書き換えてもいい領域だから、エラーにはならない。
とりあえず、デバッガかprintfデバッグでmovement()内のcellのインデックスを追ってみては?
範囲を超えたインデックスを検出したら表示する、とかの方針で。
0362デフォルトの名無しさん
2007/01/09(火) 06:10:26cellの各要素が指す構造体そのものはヒープに確保しているから、
cell[][][]->colorとかの構造体の中身の書き換えではなく、
cell[][][]そのものの値を書き換えているところで、
インデックス範囲外アクセスがないか探してみて。
たとえば、main()中で、
int d_max = 2;
struct celldata *cell[4][3][9];
.
.
.
printf("%d\n", d_max);
movement(cell, 1, 2, 0, d_max);
printf("%d\n", d_max);
で、
void movement(struct celldata *cell[4][3][9], int x, int y, int depth, int d_max)
{
cell[3][2][9] = 0xffffff;
}
ってすると、
2
16777215
になる。ちなみに、gcc。
0363338
2007/01/09(火) 06:23:13一応一通り見たのですが、本来の領域を超えるような
記述は見当たりませんでした。今日ずっと悩みっぱなしの頭で
探したので確実にないとは言い切れないのですが。。。
>>362
cell[][][]そのものの値を書き換えているところもないはずです。
直接ポインタのアドレスを指定したところに変えるって事ですよね?(汗
とりあえずソースをここに全部載せるにはちょっと長いので、
適当なうpろだにあげてみようかと思います。。。っ-_-)っ
0364デフォルトの名無しさん
2007/01/09(火) 06:27:58void astrcpy(char a[2], char b[2]){
int i;
for( ;*b != '\0'; a++, b++){
*a = *b;
}
*a = '\0';
}
int main(void){
char b[6];
char a[6];
astrcpy(b,"a[4]");
astrcpy(a,b);
printf("a=%s\n", a);
return 0;
}
0365338
2007/01/09(火) 06:29:43ソースファイル
ttp://www.uploda.org/uporg648099.c.html
データファイル(これを構造体に読み込みます)
ttp://www.uploda.org/uporg648100.txt.html
パスは338です。
0366デフォルトの名無しさん
2007/01/09(火) 06:53:13実行していないけど、ざっとソースを見た感じ、
swap()の所と、
movement()の各階層での構造体確保の所で、cellの要素の値そのものを書き換えているよね。
movement()の領域確保のところは問題無さそうだから、
movement()から直接、間接に使ってるswap()の中でdepth,i,jの値がインデックスの範囲外になっていないかチェックしてみて。
swapの先頭にif文入れて範囲外ならprintfするようにすればいいと思う。
さすがに人様のソースをデバッグするには徹夜で根が尽きたよ。
というか、そろそろ朝ごはん食べて、出掛ける準備をしないと。
もちろん、今までの指摘が見当外れの可能性もないわけではないが……
0367デフォルトの名無しさん
2007/01/09(火) 06:56:13depth,i,jというか、depth,x1,y1,x2,y2だな。集中力が切れてきたw
0368338
2007/01/09(火) 07:00:11movement()だけみててswap()は結構無視してましたw
今から調べてみます
0369デフォルトの名無しさん
2007/01/09(火) 07:06:37|| x1 < 0 || x1 >= HEIGHT || y1 < 0 || y1 >= WIDTH
|| x1 < 0 || x1 >= HEIGHT || y1 < 0 || y1 >= WIDTH) {
printf("DEBUG:%d,%d,%d,%d,%d\n", depth, x1, y1, x2, y2);
}
をswapの先頭に入れて実行してみたらdepthが5になってたりで、
大量に出てきたなり。
movement()やdown()等で与える引数を確認してみるべし。
0370デフォルトの名無しさん
2007/01/09(火) 07:08:53main()の
for(d_max=1; d_max<=DEPTH_MAX; d_max++){
だ!
for(d_max=1; d_max<DEPTH_MAX; d_max++){
でないとダメじゃよ。そこまで配列が確保されてない。
0371338
2007/01/09(火) 07:21:51そんなところに落とし穴が・・・
>>369をswap()の先頭に入れたら謎のエラーが出てきて
変なところで悪戦苦闘してたんですが、>>370で解決しました!
たかが条件式の=の有無でここまで手こずらされるとは。。。
というか、こんなことで朝まで付き合わせてごめんなさいm(_ _)m
そしてありがとうございました!あと少しでこのプログラムも完成しそうです;;
また何か分からない事があったらその時はよろしくお願いします。
今日はもう寝ます・・・っ-_-)っ
今日から学校始まるというのに、初日から寝過ごしそうです。
0372デフォルトの名無しさん
2007/01/09(火) 07:37:46>>371
パズルを解くプログラミングは面白そうだ。がんばって完成させて。
境界にはバグが潜み易いから気をつけないと。助けてゆかりん
0373デフォルトの名無しさん
2007/01/09(火) 08:32:370374デフォルトの名無しさん
2007/01/09(火) 20:40:46*foramat_string
と書かれているものを見るんですが、どういう意味ですか?
0375デフォルトの名無しさん
2007/01/09(火) 23:21:300376デフォルトの名無しさん
2007/01/10(水) 17:31:06printf()とかのフォーマット指定文字列じゃね?"%d"とか
0377デフォルトの名無しさん
2007/01/10(水) 23:07:44int y[5];
p = y;
はおkで
int a[5];
int y[5];
a = y;
はダメな理由が分かりません。
後者はa[0]にy[0]のアドレスが入れるますと思います。
0378デフォルトの名無しさん
2007/01/10(水) 23:10:210379デフォルトの名無しさん
2007/01/10(水) 23:39:22のpは「変数」、yは「値」
a = y;
のaは「値」、yは「値」。
値に値を代入するわけにはいかんべ?
0380デフォルトの名無しさん
2007/01/10(水) 23:39:42しかし、aは配列aの先頭要素を指すポインタとしてyのように右辺値に使うことはできても、
動的に変更できない実行前に決定される一種の定数だからa自体に代入することはできない。
>>378の言うようにポインタ変数と配列名は似て非なるものだ。
0381デフォルトの名無しさん
2007/01/10(水) 23:40:15あるプロセスにしかそのポートを触れない様にするのはどうすればよい?
同じコマンドを2回走らせると、
両方ともそのポートを弄れちゃうんだけど。
0382デフォルトの名無しさん
2007/01/10(水) 23:45:590383デフォルトの名無しさん
2007/01/11(木) 00:03:020384デフォルトの名無しさん
2007/01/11(木) 00:34:39超えられる
0385デフォルトの名無しさん
2007/01/11(木) 00:39:290386デフォルトの名無しさん
2007/01/11(木) 00:43:32ゲームによるだろぎゃい
0387デフォルトの名無しさん
2007/01/11(木) 00:43:530388デフォルトの名無しさん
2007/01/11(木) 00:44:20つ >>386
0389デフォルトの名無しさん
2007/01/11(木) 00:45:560390デフォルトの名無しさん
2007/01/11(木) 00:51:32CreateMutexとかってさ
CreateMutexの処理が完了するまで他のプロセスにCPU渡さないよね?
0391デフォルトの名無しさん
2007/01/11(木) 03:01:25スケジュール帳みたいなプログラムを作りたいのですが、全然分かりません。
西暦〜年〜月のカレンダーを表示。
スケジュールを追加しますか?→1
スケジュールを確認しますか?→2
[1の場合]
何日かを入力し、そのスケジュールを記入し、書き出す
[2の場合]
何日かを入力し、そのスケジュールを表示
カレンダーの作成は分かるのですが、スケジュールの表示や書き出しが分かりません。
どなたかご教授お願いします。
0392デフォルトの名無しさん
2007/01/11(木) 03:26:42つ printf じゃだめなの?
0393デフォルトの名無しさん
2007/01/11(木) 03:50:22CreateMutexってWinAPI?
WinAPIはよく知らないんだが、普通はアトミックな処理になっているんじゃないかな。
0394381
2007/01/11(木) 05:38:58ありがとう。調べてみる。
そのコマンド以外には全く触れなくも出来る?
そのコマンドが一回終了してパラレルからビット立てて外部装置をONにして、
もう一回そのコマンド打つとOFFになるようにしたい。
ONとOFFの間でコマンドは一旦終了するんだけど、
その間で他の人がパラレルポートを弄ったりすると困る。
0395デフォルトの名無しさん
2007/01/11(木) 05:57:48コマンドが終ったらコマンドのプロセスは無くなるからそれはたぶん無理。
そういうことなら、パラレルポートのドライバか外部装置そのものにロック機構を組み入れるしかない。
そこまでできない場合、ポートが使用中かどうかを管理するデーモンを作って走らせて、
ポートを使うときには必ずそのデーモンにお伺いを立てるルールを全員に守らせられれば少し簡単になるかもしれんが。
ルール破りされれば終わりだ。
0396デフォルトの名無しさん
2007/01/11(木) 06:25:06ふと気になったけど、コマンドってmutexのことをコマンドと勘違いしてたら、それは間違い。
395ではポートを使用しているプロセスに関連したコマンドのことだと勘違いしてた。
mutexはOSがサポートする一種の排他機構の名称。
0397デフォルトの名無しさん
2007/01/11(木) 11:04:05そか
つかアトミックな処理・・・って?
まぁレスありがと
0398デフォルトの名無しさん
2007/01/11(木) 11:08:480399デフォルトの名無しさん
2007/01/11(木) 14:50:580400デフォルトの名無しさん
2007/01/11(木) 15:10:41文字列を逆順からコピーする関数のプログラミングの作業中に疑問が発生しました。
下記のNGソースはコンパイラはNGを出しませんが結果がNGです。
具体的にどのような理由で結果が正しく出ないのでしょうか。当方の実力では分かりかねますので
解説の程よろしくお願い致します。
引数1はコピー元となる文字列の先頭アドレスを渡しており引数2は逆順コピー先
となる配列の先頭アドレスを渡しております。
// NG
void strrev ( char *c_array , char *c_carray ) {
int i = 0 ;
while ( *c_array++ ) i++ ;
while ( i ) *c_carray = c_array[--i] ;
*c_carray = 0x00 ;
}
//OK
void strrev ( char *c_array , char *c_carray ) {
int i=0;
while ( c_array[++i] ) ;
while ( i ) *c_carray++ = c_array[--i] ;
*c_carray = 0x00 ;
}
0401デフォルトの名無しさん
2007/01/11(木) 15:18:44FILE *fp;
fp = stdin;
てやると、fpはバイナリモードでopenされてますか?テキストモードでopenさ
れてますか?バイナリモードでは無い場合、バイナリモードにするにはどうす
れば良いでしょうか?
0402400
2007/01/11(木) 15:24:37//NG
void strcopy ( char *c_array , char *c_carray ) {
int i=0 ;
while ( c_array[i++] ) ;
while ( i ) *c_carray++ = c_array[--i] ;
*c_carray = 0x00 ;
}
//ok
void strcopy ( char *c_array , char *c_carray ) {
int i=0 ;
while ( c_array[++i] ) ;
while ( i ) *c_carray++ = c_array[--i] ;
*c_carray = 0x00 ;
}
0403デフォルトの名無しさん
2007/01/11(木) 15:29:48それ以上分割不可能ってことで、
390の推測のように処理が途中で分割されない=割り込まれない。
unix畑なんでCreateMutexについてはよくは知らないんだが。
0404デフォルトの名無しさん
2007/01/11(木) 15:36:26read(0,buf,buflen)
0405デフォルトの名無しさん
2007/01/11(木) 15:37:47linuxも含めPOSIX準拠のシステムだったら、
バイナリモードとテキストモードの区別はないよ。
二つを区別するシステムでは、
例えばDOSとかならsetmodeとかの非標準関数で変更できた気がする。
0406400
2007/01/11(木) 15:45:040407デフォルトの名無しさん
2007/01/11(木) 15:53:02NGは文字数をカウントしようとしているwhile(c_array[i++]);が、
0を検出した後にiをインクリメントしているので1文字多くカウントしてしまう。
逆順に文字をコピーしようとすると、0をコピー先の先頭にコピーしてしまうので、
コピー先の文字配列を0終端文字列として表示しようとすると、いきなり終ってしまう。
0408デフォルトの名無しさん
2007/01/11(木) 15:53:560409400
2007/01/11(木) 15:59:530x00を検出した後でもインクリメントするんですね。orz
0410400
2007/01/11(木) 16:00:450x00を検出した後でもインクリメントするんですね。orz
0411デフォルトの名無しさん
2007/01/11(木) 16:32:26いや以前にあるサイトで安全な排他処理について議論(てほどでもないが)あってね
でも確かこの関数が実行中は他のプロセスから再入されないことが保証されていると思ったんだけど否定されてね
ありがとん
0412デフォルトの名無しさん
2007/01/11(木) 16:36:18確かに、fopenのmanだと "modeの'b'はPOSIX準拠システムだと無視される" と
ありますね。
てことは、質問からそれるんですが、バイナリデータを扱う際でもfgetc使って
いいってことでしょうか?今まではバイナリデータならfread、テキストデータ
ならfgetcと使い分けていたのですが、、、
0413デフォルトの名無しさん
2007/01/11(木) 16:59:11後置インクリメントは式を評価した後に値をインクリメントする。
0414391
2007/01/11(木) 17:04:36全然C言語が分からないため、他の部分で詰まっています。
自分で可能な限り考えてみましたが、やはり失敗しました。
ttp://loda.dip.jp/upload/data/loda00066.txt
fopenのところで、入力された文字のファイル名を作成したいのですが、さっぱり分かりませんでした。
0415デフォルトの名無しさん
2007/01/11(木) 17:05:03>>412
fgetc()をバイナリデータに使うことには何の問題も無い。
fgetc()よりはgetc()を薦めるが(機能は同じだが、より効率が良い
可能性が高い)。
0416デフォルトの名無しさん
2007/01/11(木) 17:10:24そういうあなたにsprintf
0417デフォルトの名無しさん
2007/01/11(木) 17:11:00気になったのでちょっと調べてみた。
ttp://msdn.microsoft.com/library/ja/jpdllpro/html/_win32_createmutex.asp?frame=true
CreateMutexの処理がアトミックであるとは書いていないね。
よく考えたら、CreateMutex自体はmutexオブジェクトのハンドルを返すだけだから、
処理の途中で割り込まれても実は問題ない。
もちろん、CreateMutex内でオブジェクトを中途半端に作成している状態で、
他が二重にオブジェクトを作成するようなことはできないようにはしているはずだけど、
CreateMutex全体で一つのクリティカルセクションになっている必要はないと思う。
CreateMutexの第2引数でTRUEを指定しても、所有権を即座に要求できるだけで、
実際に即座に所有できることは保証されていないから、
オブジェクトが作られてから所有権を得るまでに割り込まれることは織り込み済みのようだし。
CreateMutexの中で他のプロセスから再入されないことが保証されているわけではないが、
悪いようにはしないって感じかね。
MSDNなんて久しぶりに覘いたよ。
0418デフォルトの名無しさん
2007/01/11(木) 17:19:00アプレット(?)上に円を描いたのちランダムな座標に点を複数個マッピング、
点を打った総数と円の中に打たれた点の数を元に確率的に円周率を求めるプログラムを作っています。
URL内の説明だけでできるらしいのですが、「円の中に点が入った場合」について分岐したいのですが
条件文がどうにも分かりません。ご助力お願いします。
0419デフォルトの名無しさん
2007/01/11(木) 17:40:23simpleXは知らないが
円の中心から点まで距離と円の半径を比べるのではだめ?
0420デフォルトの名無しさん
2007/01/11(木) 17:55:15わざわざどうも・・・・
>よく考えたら、CreateMutex自体はmutexオブジェクトのハンドルを返すだけだから
そうそう、そこで WaitForSingleObjectなんだった.前のことだったから忘れていた.
mutexによって”完全な”排他処理は出来るかというやり取りだったか・・・
CreateMutexの段階では所有権を要求せずにWaitForSingleObject系に処理渡す…
最初にオブジェクトを所有してしまえば次に入ったプロセスはオブジェクトを所有できない
オブジェクトを所有できなければプロセスは待機するってわけだけど…
もしこれが再入可能だとすると最初に呼び出したプロセス=オブジェクトの所有プロセスとはならない
その人いわく「両プロセスがもし(ほぼ)同時に入った場合は”完全な”排他処理が出来ない可能性がある」と言われたわけだが…
でもいかに再入可能でもオブジェクトを所有しないプロセスが戻り値 WAIT_OBJECT_0 を返すとは思えないわけだが…
って確かこういう議論だった
んで、そのときMSサイトとかいくつか見て回ったけどその点に触れてるサイトがなくてね
んで、俺自身確証もなく否定できる明確な要素もなかったので事実上俺の負け(?)で終了したと…
まあ書いて無いってことはやっぱ保証はされないってことなのかな
実際↑こんな状況に直面することなど無いだろうからあくまでちょっとした疑問だったんだがmutexの話でたからつい便乗してしまった
と・・・・スレタイと違うこんな話に付き合ってくれてありがとね
0421デフォルトの名無しさん
2007/01/11(木) 18:28:18立ち読みしても何を基準に選べばいいのか分からないので、結局何も買えませんでした。
プログラム板ではどの入門書の評価が一番高いのでしょうか?
スレ違いだったらごめんなさい。
0423デフォルトの名無しさん
2007/01/11(木) 18:57:31推薦図書/必読書のためのスレッド PART33
http://pc10.2ch.net/test/read.cgi/tech/1167140188/
ただ入門レベルの知識ならネットにいくらでも転がってるから
そこでお金使うのは勿体無いんじゃないかな、と貧乏学生がのたまってみる。
0426421
2007/01/11(木) 20:16:57専用スレあったんですね、すみませんでした。
あと>>424は俺じゃないです。
俺も貧乏学生なんでネットの入門サイトで十分というのはありがたいです。
0428デフォルトの名無しさん
2007/01/11(木) 20:24:360429デフォルトの名無しさん
2007/01/11(木) 20:25:12ウンコしても見れるから俺は本も買うけどね。
0430デフォルトの名無しさん
2007/01/11(木) 20:36:16それが自分で探せないなら、素質ないし、もう諦めるしかないよ
0431デフォルトの名無しさん
2007/01/11(木) 20:38:40ここにくる宿題をやってみる
C/C++の宿題を片付けます 80代目
http://pc10.2ch.net/test/read.cgi/tech/1166969820/
0432デフォルトの名無しさん
2007/01/11(木) 20:43:11・一つの言語の学習を完了した(つもり)
・しかし高度なモノを作るには言語以外の知識が要求される
・(自分の今のスキルでは)作るものが無いとぼやき始める ←いまここ
0433デフォルトの名無しさん
2007/01/11(木) 23:58:57なるほど!
それでは私はこれから当面興味のある分野の専門知識を得ることを
考えればよいのですね!
新たな道が開けてきそうな気がしてきました。サンクス。
とでも言うと思ったかwwwww
0434FLAST
2007/01/11(木) 23:59:22本来はFORTRAN(スペル合ってるか知らん)でやるべきだが円周率でも計算させたら?
0435デフォルトの名無しさん
2007/01/12(金) 01:20:27main(){
int tanaka [4] = {}100,200,100,300};
int i;
for(i = 0; i < 4;i++)
tanaka[i] = tanaka[i]*1.05;
return 0;
}
これを、繰り返し文を使わずに書くと、どのようになるんでしょうか?
何処がどうなると、ご指摘お願い致します。
その改訂ソースを書いて戴けたら幸いです。
0436デフォルトの名無しさん
2007/01/12(金) 01:26:210437デフォルトの名無しさん
2007/01/12(金) 02:10:20int tanaka[4] = {100, 200, 100, 300};
iter(tanaka, 4);
return 0;
}
void iter(int *tanaka, int i) {
if (!i) return;
*tanaka *= *tanaka;
iter(tanaka + 1, i - 1);
}
0438437
2007/01/12(金) 02:12:18*tanaka *= *tanaka;
は以下のように訂正
*tanaka *= 1.05;
だけどこれ、intにfloatをかけてintに代入しているわけで、
意味のない計算のような気もしないではないけどそれはいいのかな。
0439デフォルトの名無しさん
2007/01/12(金) 02:20:12tanaka[1] = tanaka[1]*1.05;
:
tanaka[4] = tanaka[4]*1.05;
繰り返し文さえ使わなきゃ何でもアリなら再起で
#include<stdio.h>
void arr_mult(int, int *); /* 再起関数の宣言 */
int main(void) {
int tanaka[4] = { 100, 200, 100, 300}; /* 処理する配列 */
arr_mult(4, tanaka); /* 処理 */
return 0;
}
void arr_mult(int cnt, int *pMul) { /* cnt:配列の要素数 pMul:配列の先頭アドレス */
if(0 < cnt) { /* 1コ目(0番目)までは以下処理 */
cnt--; /* 今回処理する配列の添え字に */
*(pMul + cnt) = *(pMul + cnt) * 1.05; /* 添え字位置の要素を乗算処理 */
arr_mult(cnt, pMul); /* 1コ前の要素を処理 */
}
}
みたいのでどうでしょ。
0440デフォルトの名無しさん
2007/01/12(金) 02:22:570442デフォルトの名無しさん
2007/01/12(金) 04:20:03#defineKAMOKU5
#define NINZUU4
main()
{
intten[NINZUU][KAMOKU]={/*得点*/
{ 73,59,92,83,75},
{ 52,95,70,69,80},
{ 22,19,31,41,55},
{100,99,96,85,82}
};
intgoukei[NINZUU] ={0,0,0,0};/*合計点*/
doubleheikin[NINZUU];/*平均点*/
charshimei[NINZUU][20]={"太郎","次郎","三郎","四郎"};/*氏名*/
charkamokuName[KAMOKU][10] = {"国語","数学","英語","社会","理科"};
charhyouka[NINZUU];/*評価*/
intmax[NINZUU];/*最高点*/
intmin[NINZUU];/*最低点*/
intkamokuMax[KAMOKU+1];/*科目ごとの最高点*/
intkamokuMin[KAMOKU+1];/*科目ごとの最低点*/
inti,j;/*添え字*/
for(j=0;j<NINZUU;j++)
{
/*合計点と平均点の算出*/
for(i = 0;i < KAMOKU;i++)
{
goukei[j] += ten[j][i];
}
heikin[j] = (double)goukei[j] / i;
0443デフォルトの名無しさん
2007/01/12(金) 04:21:01if(heikin[j] >= 80)
{
hyouka[j] = 'A';
}
else if(heikin[j] >= 60)
{
hyouka[j] = 'B';
}
else
{
hyouka[j] = 'C';
}
/*最高点・最低点を求める*/
max[j] = ten[j][0];/*この生徒の先頭のデータで初期化*/
min[j] = ten[j][0];/*この生徒の先頭のデータで初期化*/
for(i = 1;i < KAMOKU ;i++)
{
if(max[j] < ten[j][i]) /*データがそれまでの最高点より大きかったら*/
{
max [j] = ten[j][i];/*最高点を入れ替える*/
}
if(min[j] > ten[j][i])/*データがそれまでの最低点より小さかったら*/
{
min [j] = ten[j][i]; /*最低点を入れ替える*/
}
}
}
0444デフォルトの名無しさん
2007/01/12(金) 04:23:22for(i=0;i<KAMOKU;i++)
{
kamokuMax[i] = ten[0][i];/*先頭の人のデータを初期値とする*/
kamokuMin[i] = ten[0][i];/*先頭の人のデータを初期値とする*/
for(j=1;j<NINZUU;j++)
{
if(kamokuMax[i] < ten[j][i])
{
kamokuMax[i] = ten[j][i];
}
if(kamokuMin[i] > ten[j][i])
{
kamokuMin[i] = ten[j][i];
}
}
}
/*合計点の最高点・最低点を求める*/
kamokuMax[i] = goukei[0];/*先頭の人のデータを初期値とする*/
kamokuMin[i] = goukei[0];/*先頭の人のデータを初期値とする*/
for(j=1;j<NINZUU;j++)
{
if(kamokuMax[i] < goukei[j])
{
kamokuMax[i] = goukei[j];
}
if(kamokuMin[i] > goukei[j])
{
kamokuMin[i] = goukei[j];
}
}
0445デフォルトの名無しさん
2007/01/12(金) 04:24:00printf(" 氏名 ");
for(i = 0;i<KAMOKU;i++)
{
printf("%-6s",kamokuName[i]);
}
printf("合計 平均 評価 最高点 最低点\n");
for(j=0;j<NINZUU;j++)
{
printf(" %-10s",shimei[j]);
for(i = 0;i<KAMOKU;i++)
printf("%5d ",ten[j][i]);
printf("%5d%6.1f %c %5d %5d\n",
goukei[j],heikin[j],hyouka[j],max[j],min[j]);
}
printf("最高点 ");
for(j=0;j<KAMOKU+1;j++)
{
printf("%5d ",kamokuMax[j]);
}
printf("\n");
printf("最低点 ");
for(j=0;j<KAMOKU+1;j++)
{
printf("%5d ",kamokuMin[j]);
}
printf("\n");
0446デフォルトの名無しさん
2007/01/12(金) 04:27:300447デフォルトの名無しさん
2007/01/12(金) 04:29:17一つ目は
>>intkamokuMax[KAMOKU+1];/*科目ごとの最高点*/
intkamokuMin[KAMOKU+1];/*科目ごとの最低点*/
これの +1 です。何故 +1 なのかです。
二つ目は
>>444の
>>/*科目ごとの最高点・最低点を求める*/ と
>>/*合計点の最高点・最低点を求める*/で
i,jが途中で入れ替わっています、これが何故で何なのかが疑問です。
入門書には詳しく書かれていません。
自分で考えても混乱するばかりで、ご助言をお願いします。
0448デフォルトの名無しさん
2007/01/12(金) 05:15:45struct node{
struct node **link;
};
でいいんでしょうか?
また、これで
struct node *a,*b;
a=NULL;
b=(struct node*)malloc(sizeof(struct node));
として、aとbを線形につなぎたいのですが、
b->link[0]=a;
とすると、エラーが出てうまくいきません。
どうすればよいでしょうか?
解りにくい説明ですみません。
0449デフォルトの名無しさん
2007/01/12(金) 05:31:42ポインタ配列の領域は用意してる?たとえば、
b->link = (struct node **)malloc(n_link * sizeof(struct node *));
「エラーが出た」だけでは何も報告していないのと同じなので、
コンパイル時or実行時のエラーメッセージくらいは晒さないと。
0450448
2007/01/12(金) 05:39:15コンパイルはできましたが、実行時にエラーがでて終了するだけでメッセージは出ないようでした。
ポインタ配列の領域は用意してなかったです。
ただ、配列数が未知なので、448のn_linkの値が決定できないのです。
そういう場合、どうすれば良いんでしょうか。
n_linkに大きな値を設定しておくしかないですか?
0451デフォルトの名無しさん
2007/01/12(金) 05:43:49もし、実行中にその大きさを超える数のポインタを格納する時には、
reallocで配列数を増やしたポインタ配列を再取得して元の配列をコピーする。
0452デフォルトの名無しさん
2007/01/12(金) 05:44:590453448
2007/01/12(金) 05:47:53なるほど、やってみます。
ありがとうございます。
0454デフォルトの名無しさん
2007/01/12(金) 05:55:30配列領域へのポインタと確保している配列サイズとのペアで常に扱うと分かりやすいと思う。
0455デフォルトの名無しさん
2007/01/12(金) 16:50:24に /a/b/c/d/e/f/g/ までのフォルダが無ければ自動的に作成、という機能はな
いのでしょうか?
また、そのような機能が無い場合は代替関数はありませんでしょうか?
0456デフォルトの名無しさん
2007/01/12(金) 17:12:30C標準関数ではディレクトリの概念がない環境を考慮して、ディレクトリ操作関連の関数は一切ありません。
デファクトスタンダードであるPOSIXにはmkdir()がありますが、途中のディレクトリがなければエラーになります。
0457デフォルトの名無しさん
2007/01/12(金) 17:26:39Windows限定でいいならMakeSureDirectoryPathExists
0458デフォルトの名無しさん
2007/01/12(金) 17:31:18区切り文字が \ じゃなくて / であることから、多分非Windowsな人だと思われ。
system("mkdir -P /aa/bb/cc");
0460330
2007/01/13(土) 04:29:55C言語の勉強中にint、long int、doubleのビット数を調べることになりまして実行したところ
int 32ビット
long int 32ビット
double 64ビット
だったんです。
どうしてintとlong intが同じなんでしょうか?
そういうパソコンもあるのですか?
それとも壊れた?
0461330
2007/01/13(土) 04:31:26この32ビットのせい?
0462デフォルトの名無しさん
2007/01/13(土) 05:01:53CPUが32ビットの場合、16ビットに分割するとかえって実行速度が落ちる。
んでかつてのlong型と同じ長さになった訳。
10年後にはintは64ビットになってるだろう。
>>461
全然関係ない
0463デフォルトの名無しさん
2007/01/13(土) 08:22:42>CPUが32ビットの場合、16ビットに分割するとかえって実行速度が落ちる。
根拠は?
今のIntelCPUならレジスタ数も豊富だから32ビットレジスタを16ビットで使用するコストを
メモリアクセス数の削減が上回って実行速度にも貢献しそうな気がするんだけど。
>10年後にはintは64ビットになってるだろう。
これもなんだかなぁ。
longが64bitになればそれで充分な気がするんだが。
>>460
という訳で、16bitでも32bitでも処理速度的に大きく変わらないなら
元々Unix系ではintが32bitだし16bitでは何かと不便だから、という方が未だ真相に近いと思う。
ちなみに、C言語規約としてはshort, int, longが全て同じビット数でも構わない。
0464デフォルトの名無しさん
2007/01/13(土) 08:37:30なんていうかなぁ・・・・
ちょっとコンピュータの基礎から勉強しなおせば?
ちなみにintが何bitかなんてどこにも決まってない。
「16bit以上で、かつそのCPUにおいて処理に最も適したbit幅」とされてるだけ。
もっとも、64bit版Winは移植性優先でint/longは32bit据え置きだが。
0465デフォルトの名無しさん
2007/01/13(土) 08:45:220466デフォルトの名無しさん
2007/01/13(土) 08:45:270467デフォルトの名無しさん
2007/01/13(土) 09:11:560468デフォルトの名無しさん
2007/01/13(土) 09:22:31> どうしてintとlong intが同じなんでしょうか?
たまたまコンパイラ側でそう定義されていたから
> そういうパソコンもあるのですか?
パソコンじゃなくてコンパイラ依存
> それとも壊れた?
壊れてない
全く正常
> 実行速度にも貢献しそうな気がするんだけど。
shortを不用意につかうと、あちこちで、short -> int の変換がはいって
遅くなりそうな気がするなあ。
ためしたことはないけど。
0470デフォルトの名無しさん
2007/01/13(土) 11:27:350471デフォルトの名無しさん
2007/01/13(土) 12:23:55ばーか。
相変わらず回答になってないな
次スレでスレタイ↓に変えたら?
【馬鹿】C言語なら入門者の俺に聞け Part 7【でーす♥】
0472デフォルトの名無しさん
2007/01/13(土) 14:08:31なるほど、そーだったのか。
なら俺はjava言語習得したつもりになってるのか
で、次はc++でもしてみるかって思ってんのか
よーくわかった、お前天才だわ
0473とかいってみる
2007/01/13(土) 19:08:580474デフォルトの名無しさん
2007/01/13(土) 19:53:560475デフォルトの名無しさん
2007/01/13(土) 20:01:36無駄じゃない
0476デフォルトの名無しさん
2007/01/13(土) 20:17:38発想が逆。
「無駄にならないような時に int を使え」って事だよ。
0477デフォルトの名無しさん
2007/01/13(土) 20:18:560478デフォルトの名無しさん
2007/01/13(土) 20:29:39このプログラムではぜんぜんだめでした。指導してください
.txtのなかみ
a
t
r
v
s
a
#include<stdio.h>
main(){
char src[8];
FILE* fp;
fp=fopen("moji.txt","r");
if(fp!=NULL){
strcpy(fp,"%c",&src[8]);
fclose(fp);
}
for(i=0;i<8;i++)printf("%c ",src[i]);
}
0479デフォルトの名無しさん
2007/01/13(土) 20:31:29ファイル読んでねーじゃん
0480デフォルトの名無しさん
2007/01/13(土) 20:33:190481デフォルトの名無しさん
2007/01/13(土) 20:34:060482デフォルトの名無しさん
2007/01/13(土) 20:35:09str[8]のアドレス送っても仕方あるまい
0483デフォルトの名無しさん
2007/01/13(土) 20:35:24fscanf(fp,"%c",&src[i]);
のまちがいです
0484デフォルトの名無しさん
2007/01/13(土) 20:36:10すみません
0485デフォルトの名無しさん
2007/01/13(土) 20:39:27intが8bitなら-2^7〜2^7
16bitなら-2^15〜2^15まで表示出来るってこと?
0486デフォルトの名無しさん
2007/01/13(土) 20:41:36とりあえず、その「表示出来る」という言葉の意味は何だ?
画面に「表示出来る」ってことか?
0487デフォルトの名無しさん
2007/01/13(土) 20:51:36意味わかんないけど
これだけは言えます・・・・・違いますと
0488デフォルトの名無しさん
2007/01/13(土) 20:55:11>intが8bitなら-2^7〜2^7
int は最低でも16bit以上ってC言語の規格で定めらているからそれはない。
0489485
2007/01/13(土) 21:11:26もっと勉強してきます
0490455
2007/01/13(土) 21:57:10core吐いて落ちます。(バスエラー)特に問題は無いように思うのですが…
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
FILE *_fopen(char *file, char *mode)
{
char delimiter[] = "/";
char *token[100];
int i, j, ret;
token[0] = strtok( file, delimiter );
i = 1;
while( token[i-1] != NULL ){
token[i] = strtok( NULL, delimiter );
i++;
}
for( j=0 ; j<i-2 ; j++ ){
ret = mkdir( token[j], 0777 );
ret = chdir( token[j] );
}
return fopen( token[i-2], mode );
}
0491455
2007/01/13(土) 21:57:51{
FILE *fp;
fp = _fopen("a/b/c/d/e/f/g/test.dat", "w");
fclose(fp);
}
0492デフォルトの名無しさん
2007/01/14(日) 01:02:301."_"および"__"で始まる名前はイクナイ。
2.パラメータはchar *ではなくconst char *のほうがイイ。
3.んでこの関数、"r"のときも勝手にディレクトリ作るわけ?
4.strtokとか無理して使うより再帰的にディレクトリを掘る関数を作るほうがいいんじゃね?
0493デフォルトの名無しさん
2007/01/14(日) 03:05:02追加で。
strtokは与えられた文字列をいじくる。
んで、_fopenには文字列リテラルを与えてるよね。
"a/b/c/d/e/f/g/test.dat" ← これね。
このような文字列は規格上書き換えてはいけないことになっている。
が、strtokがこの文字列を書き換えてしまう。
バスエラーはひょっとしてこのせいかもしらんぞ。
0494455
2007/01/14(日) 03:21:15ほ、ほーっ、ホアアーッ!! ホアーッ!!
_fopen( ) 内で一旦バッファを確保し、strcpy(buf, file) とした上で
strtokにはbufを使う様にしたところ、buserrorが出なくなりました。
的確なご指摘まことにありがとうございました m(_ _)m
0495デフォルトの名無しさん
2007/01/14(日) 07:55:10なんでバスエラーなんだろう
0496デフォルトの名無しさん
2007/01/14(日) 08:36:15そもそもstrtok()を使うのは如何なものかと思うわけだが。
#どうせ自分でループを回すならstrchr()で事が足りるだろ。
0497デフォルトの名無しさん
2007/01/14(日) 11:27:130498デフォルトの名無しさん
2007/01/14(日) 21:33:08入力された文章をそのままディスプレイに
出力するようにしたいのですが、
どのようにすればいいでしょうか。
任意なので、1行でも10000行でもいいようにしたいのです。
0499デフォルトの名無しさん
2007/01/14(日) 21:39:24// for Unix
system("cat");
// for MS-DOS/Windows
system("type con");
0500498
2007/01/14(日) 22:21:27やってみましたが、期待していた動作とは違いました。
質問の内容が間違っていたようです・・・。
書き直してみました。
任意の複数行の文章をキーボードから読み込みます。
入力はEOFが入力されるまで続けます。
任意なので、1行でも1万行でもいいのです。
EOFが入力されたら、入力された文章をそのまま出力します。
例えばどのように動作するのかというと、
Hello! How are you?(改行)
(改行)
I'm fine, thank you.(EOF)
と入力された場合、そのまま
Hello! How are you?
I'm fine, thank you.
と、出力するようにしたいのです。
0501デフォルトの名無しさん
2007/01/14(日) 22:26:35#include<stdlib.h>
int main(void){
system("type con > input.txt");
system("type input.txt");
return 0;
}
0502498
2007/01/14(日) 22:42:47できました!すごいですね。
ありがとうございました。
ところで、これ以外にも方法があったりしますか?
もしあるなら、それも教えていただけると非常に勉強になります。
0503デフォルトの名無しさん
2007/01/14(日) 23:02:38#include<stdio.h>
#include<stdlib.h>
#define ALLOC_UNIT (1024)
int main(void){
char *buf=NULL, *new_buf;
long buf_size=0L, input_size=0L;
int moji;
while((moji=getchar())!=EOF){
if(input_size>=buf_size){
buf_size+=ALLOC_UNIT;
new_buf=realloc(buf, buf_size);
if(new_buf==NULL){
fprintf(stderr, "\nError: Memory allocation failed.\n");
free(buf);
exit(1);
}
buf=new_buf;
}
buf[input_size++]=moji;
}
buf[input_size]='\0';
printf("%s", buf);
free(buf);
return 0;
}
0504503
2007/01/14(日) 23:05:16if(input_size>=buf_size){
↓
if(input_size+1>=buf_size){
最後に '\0' 代入する領域が足りなかった orz
0505デフォルトの名無しさん
2007/01/14(日) 23:49:45いきなり EOF を入力されたら NULL に書き込みで segv だよ
0506498
2007/01/14(日) 23:58:51ははあ。こんな方法もあるのですね。
今の自分の知識では、残念ながらよく理解できませんが・・・。
難しいことをやろうとしていたのですね・・・。
理解できるよう、これから勉強に励もうと思います。
答えていただいた方々、ありがとうございました。
0507デフォルトの名無しさん
2007/01/15(月) 00:00:39#include<stdio.h>
#include<stdlib.h>
#define ALLOC_UNIT (1024)
int main(void){
char *buf=NULL, *new_buf;
long buf_size=0L, input_size=0L;
int moji;
while(1){
if(input_size+1>=buf_size){
buf_size+=ALLOC_UNIT;
new_buf=realloc(buf, buf_size);
if(new_buf==NULL){
fprintf(stderr, "\nError: Memory allocation failed.\n");
free(buf);
exit(1);
}
buf=new_buf;
}
moji=getchar();
if(moji==EOF) break;
buf[input_size++]=moji;
}
buf[input_size]='\0';
printf("%s", buf);
free(buf);
return 0;
}
0508デフォルトの名無しさん
2007/01/15(月) 00:01:310509デフォルトの名無しさん
2007/01/15(月) 00:05:570510デフォルトの名無しさん
2007/01/15(月) 00:09:040511498
2007/01/15(月) 00:20:11間違えました・・・orz
訂正します
×答えていただいた方々
○答えてくださった方々
>>508
大丈夫です。ありがとうございました。
0512508
2007/01/15(月) 00:23:330513デフォルトの名無しさん
2007/01/15(月) 09:24:48もっと簡単な例
#include <stdio.h>
int main(void)
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
return 0;
}
もっと高速にしたければ非標準のread()やwrite()のような
システムコールを使うか、
さらにシステム依存性の高いmmap()などを検討しましょう。
0514デフォルトの名無しさん
2007/01/15(月) 16:18:03いや、それだと仕様を満たしていない。
EOFがくるまで黙っていなければならないが、
そのコードだとそれを保証できない。
0515デフォルトの名無しさん
2007/01/15(月) 21:28:19そもそもスタックの容量決まってるからナンセンスか…
0516デフォルトの名無しさん
2007/01/16(火) 00:22:10文字コードで、'A'は65、'B'は66・・・。ですから、'A'+1は'B'となり
小文字を大文字に変換するには、変換したい小文字が'a'から数えて
何番目かを調べ、'A'から数えたコードが大文字になります。
変換したい小文字のコードをcとすると、大文字のコードccは
cc = c - 'a' + 'A' で求められますと、入門書に書いてありますが
>>小文字を大文字に変換するには ここから以下の文が何を言っているのか
解りません・・・特にccと cc = c - 'a' + 'A' の公式みたいな奴です。
0517デフォルトの名無しさん
2007/01/16(火) 00:43:29だから、たとえば'b'は'a' + 1、'D'は'A' + 3と同じ値になる。
そこで、'c' == 'a' + 2だから、'A'に2を加えれば'C'の値が得られるぞという話。
cの例で言う2を求めるのがc - 'a'の部分、それと'A'を足しているのでccは'C'の値になるというわけ。
という理屈を知ったら、今後は<ctype.h>のisupperを使えばいい。
楽だし、一応Cでは英字のコードがこのように順に並んでいることを要求していないので、このことがどこでも通じるとは限らない。
0518デフォルトの名無しさん
2007/01/16(火) 00:53:16ご返答、ありがとうございます。
>>cの例で言う2を求めるのがc - 'a'の部分、それと'A'を足しているのでccは'C'の値になるというわけ。
すみませんが、此処の部分が、どうしても理解できませんので
何故、c - 'a'で -a なのか?そして、>>A'を足しているのでccは'C'の値になると
ccとは何処から出てくるのでしょうか?
再度優しくご助言、お願いします。
0519デフォルトの名無しさん
2007/01/16(火) 01:00:11kwsk説明してあげよう。ASCIIコード表を何処かで手に入れて眺めてみると理解が早まると思う。
文字はそれぞれコードがついているのは知っていると思う。
以下のようになっている。文字(16進のコード)のように表している。
A(41) B(42) C(43) 〜 Z(5a)
a(61) b(62) c(63) 〜 z(7a)
C言語では'a'という表記と0x41という表記は同じ意味を持つ。
さてここで、'c' - 'a'を考える。この値は43-41=2だ。
で、’A'+2はどうかというと、61+2=63='c'になる。
というわけなんだがわかったかな。
0520デフォルトの名無しさん
2007/01/16(火) 01:12:22丁寧な説明ありがとうございます。
今、手元のコードと照らし合わせてみています。
3分之2?程は、理解できましたが、とても難しく思います。
>>C言語では'a'という表記と0x41という表記は同じ意味を持つ。
と言う事は、'a' = 'A'なのでしょうか?
'a'は0x61でっすよね?何故、 'A'0x41なのに同じと仮定したら
同じ意味になるのでしょうか?
0521デフォルトの名無しさん
2007/01/16(火) 01:15:04ccの意味が考えても、わかkりません・・・
Cでもcでもないし、本を見ても載っていないし・・・
0522デフォルトの名無しさん
2007/01/16(火) 01:18:18ぢゃねの?
0523デフォルトの名無しさん
2007/01/16(火) 01:22:09数学的な式変形で
'c' == 'a' + 2
'c' - 'a' == 2
これを元に
'C' == 2 + 'A'
'C' == ('c' - 'a') + 'A'
'c'をc、'C'をccに置き換えれば、516のcc = c - 'a' + 'A'という式になる(=と==が違うのは気にするな)。
517のccも516のcc = c - 'a' + 'A'の式に出てくるccのこと、cも同じ。
>>520
それは519の勘違いだと思う。
0524デフォルトの名無しさん
2007/01/16(火) 01:27:45cc = c - 'a' + 'A'
これの右辺の c は 'c' の間違いか、あるいはcという変数に'c'の値を代入してあるんじゃない?
0525デフォルトの名無しさん
2007/01/16(火) 01:28:52何から何まで、ありがとうございます。
ほぼ理解はできました。
それと、勘違いといいますと・・・?
0526デフォルトの名無しさん
2007/01/16(火) 01:30:53ごめん、説明で大文字の文字コードと小文字の文字コードを丸ごと入れ替えて書いてしまったorz
通常の訂正だとわけがわからなくなるので519は丸ごと破棄して以下の説明で置き換えて欲しい。
'a'と0x61が同じ意味ってのも説明し直してみた。
---
文字はそれぞれコードがついているのは知っていると思う。
以下のようになっている。文字(16進のコード)のように表している。
A(41) B(42) C(43) 〜 Z(5a)
a(61) b(62) c(63) 〜 z(7a)
C言語では'a'という表記は文字aを表す文字コードの整数値と同じ意味を持つ。
だから、intの変数xに、「x = 'a';」と代入しても「x = 0x61;」と代入しても、
同じ値が入る。
さてここで、'c' - 'a'を考える。この値は63-61=2だ。
で、’A'+2はどうかというと、41+2=43='C'になる。
即ち 'c' - 'a' + 'A' = 'C' になる。
0527デフォルトの名無しさん
2007/01/16(火) 01:32:25cはchar型の変数ということでcという名前にしただけだろ。
そこへ517がたまたま'C'と'c'を例にしたもんだから、516の頭の中でごっちゃごちゃにかき混ぜられただけに見える。
>>525
「C言語では'a'という表記と0x41という表記は同じ意味を持つ」はどう見ても誤り。
0x41では無く、0x61と書くのが正しかった、ということだろう
0528デフォルトの名無しさん
2007/01/16(火) 01:34:06せっかくだから十六進文字定数'\x61'
0529デフォルトの名無しさん
2007/01/16(火) 01:42:02ありがとうございましたm(__)m
0530デフォルトの名無しさん
2007/01/16(火) 01:42:54そうなるとしか説明無くてわけ分からなかったが、charが256通りなら
8進数なら3桁までで、16進数なら2桁で表現できるって言う極当たり前のことだったんだよなー懐かしい
0531デフォルトの名無しさん
2007/01/16(火) 01:43:02俺に気を付けろよ
0532デフォルトの名無しさん
2007/01/16(火) 01:46:340533529
2007/01/16(火) 03:37:46サンkすです
0534デフォルトの名無しさん
2007/01/16(火) 10:21:43例えば上記のような配列があるとき(isdigit()で真になる値が入ってる)
double d に 上の例だと 15820 を入れたいのですが、
char tmp[6];
sprintf(tmp, "%c%c%c%c%c", array[0], array[1], array[2], array[3], array[4]);
d = strtod(tmp, (char **)NULL);
こんな書き方しか思いつかないのですが、
もっと、効率スピード最優先で良い方法があれば教えてください。
0535デフォルトの名無しさん
2007/01/16(火) 10:26:45atof
0536535
2007/01/16(火) 10:27:350537デフォルトの名無しさん
2007/01/16(火) 11:00:21度まで、それに対応する華氏温度を計算し,
下記のような対応表を作成しなさい。
F=5/9C+32.0
出力は、左右に2列に摂氏温度と華氏温度が{表}になるようにしなさい。
この問題が分からないのですが、誰か教えてくださいorz
0538デフォルトの名無しさん
2007/01/16(火) 11:05:17>>534
double d;
unsigned val = 0;
unsigned *begin = array:
unsigned *end = array + (sizeof(array)/sizeof(array[0]));
for (; begin != end; ++begin)
val = val * 10 + *begin - 0x30;
d = val;
0539デフォルトの名無しさん
2007/01/16(火) 12:20:15ありがとうございます。助かりました。
0540デフォルトの名無しさん
2007/01/16(火) 12:54:21>534の方法でも、>538のように整数変換のほうが速いよ。
#どっちにしても微々たるもんだと思うのだけど。
0541デフォルトの名無しさん
2007/01/16(火) 14:25:14何度やっても出来ません。どなたか教えてやって下さい。
0542デフォルトの名無しさん
2007/01/16(火) 14:32:54やったところまで貼って味噌。
char s[256]; //結果を保存する配列
sprintf(s, "%08X", n);
0544デフォルトの名無しさん
2007/01/16(火) 14:57:28while(blank!=0){
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(initial[i][j]==0){
for(m=0;m<5;m++)
hint[m]=0;
for(n=0;n<4;n++){
if(initial[i][n]!=0)
hint[initial[i][n]]=1;
}
for(n=0;n<4;n++){
if(initial[n][j]!=0)
hint[initial[n][j]]=1;
}
k1=i/2;
k1*=2;
k2=j/2;
k2*=2;
for(m=k1;m<k1+2;m++)
for(n=k2;n<k2+2;n++){
if(initial[m][n]!=0)
hint[initial[m][n]]=1;
}
total=(hint[1]+hint[2]+hint[3]+hint[4]);
for(m=1;m<5;m++)
if(total==3&&hint[m]==0){
initial[i][j]=m;
blank--;
}
の部分が理解できずにいます。
2*2マスの数独を解くプログラムなのですが、宜しくお願い致します。
0545デフォルトの名無しさん
2007/01/16(火) 15:30:33#include <stdio.h>
main()
{
int bt[256];
int i, x, b;
scanf("%d", &x);
b=0;
while(x > 0) {
bt[b] = x % 16;
x = x / 16;
b++;
}
switch(d) {
case 10:printf("A"); break;
case 11:printf("B"); break;
case 12:printf("C"); break;
case 13:printf("D"); break;
case 14:printf("E"); break;
case 15:printf("F"); break;
}
for(i=b-1; i>=0; i--) {
printf("%d", bt[i]);
}
return 0;
}
宜しくお願いします。
0546デフォルトの名無しさん
2007/01/16(火) 16:01:27switch(bt[i]) {
case 10:printf("A"); break;
case 11:printf("B"); break;
case 12:printf("C"); break;
case 13:printf("D"); break;
case 14:printf("E"); break;
case 15:printf("F"); break;
default: printf("%d", bt[i]);
}
}
0548デフォルトの名無しさん
2007/01/16(火) 16:20:13[2] 問題文(含コード&リンク):
・25個の値をrand関数(乱数)によって発生させ、一旦5×5の2次元配列に格納する(値は1から100の範囲)
・入力された値が配列内に存在するか探索する。
*存在する場合その値が格納されている配列の添え字を表示すること
*存在しない場合は、その旨を表示する
・値の一覧もあわせて表示し、これらの結果をすべてファイルに出力する。
・レポートの実行結果には、出力したテキストファイルの内容も記載すること。
・必ず自作関数を使ったプログラムにすること
・繰り返しは何度でも探索できるようにする。その際、必ず終了する場合の入力値を示せ。
[3] 環境
[3.1] OS: (Windows等々)
[3.2] コンパイラ名とバージョン: ( VC ++6.0)
[3.3] 言語: C++
[4] 期限: ([2007年1月16日23:30まで]
[5] その他の制限: C言語の初歩は習いました。
自分ではできません・・・ヒントでもいいのでください。。。
0549デフォルトの名無しさん
2007/01/16(火) 16:24:34えーっと4x4の配列の1マスで
まず横1列をチェックして使用している数字をhint[数字]で保存
次に縦1列を同上
次に2x2のブロックを同上
未使用の数字が1個だけの場合その1マスにその数字を割り当てる
0550デフォルトの名無しさん
2007/01/16(火) 16:25:16ありがとうございました。
0551デフォルトの名無しさん
2007/01/16(火) 16:58:13マルチかよ
こういう所は住人が被ってるから、そういう行為は悪影響
乱数はrand()で作れるよ、といったレベルのヒントでいいのか?
どこまでわかってるのかしっかり示せ
0552デフォルトの名無しさん
2007/01/17(水) 00:27:03また、a = x + yと b = x * yの計算を実施して表示してください。
※printf関数を使い、下のように表示してください。
x = 1,y = 10,x + y = 11,x * y = 10
魔人でわからん…orz誰か助けてください<(_ _)>
0553デフォルトの名無しさん
2007/01/17(水) 00:55:52(int *)とかはint型のポインタという意味だけど例えば
(int *)10とするとどうなるんですか?
もう一つ
void *の場合
void *lpVoid;
char chStr;
lpVoid = &chStr;
だけでキャストは必要ないのだろうか?
もしくは
lpVoid = (char *)chStr;
するべきなのだろうか?
lpVoid = (char *)&chStr;
なのかわからないです。
0554デフォルトの名無しさん
2007/01/17(水) 00:57:590555デフォルトの名無しさん
2007/01/17(水) 01:09:34(int *)10
は、よくわからんけど10番地を指すintへのポインタ値を生成する。
が、OSによってそれがどんな意味を持つのかはまちまちだし、
たいていの場合は無効なポインタ値であろう。
void *型の変数はどんなポインタ値でも保持できる。なので、
lpVoid = &chStr; // (1)
でok。キャストするならば、
lpVoid = (char *)chStr;
は(1)と意味が違っているぞ。chStrの値をcharのポインタ値と見なしている。
これは無効なポインタ値であろう。
lpVoid = (char *)&chStr;
このようにキャストするならば
lpVoid = (void *)&chStr;
とすべきだろうね。でもキャストは要らないと思う。
0556デフォルトの名無しさん
2007/01/17(水) 01:12:58((void (*)())10)();
なんてやることはままある。あるいは10番地にある何らかのシステムグローバルに、
*((int *)10) = 1;
なんて代入することもある。
なんにせよ、入門の段階ではこういうコードを書くことはあるまいて。
0557デフォルトの名無しさん
2007/01/17(水) 05:41:06#ifcdef _STDIO_H_
#define _STDIO_H_
#include <stdio.h>
#endif
とするとstdio.hがインクルードされないけど
#ifndef _STDIO_H_
#include <stdio.h>
#endif
とするとインクルードされるのはなぜ?
0558デフォルトの名無しさん
2007/01/17(水) 05:58:26ifcdefはifndefでいいんだよな?
両方ともインクルードはされてるよ。
上の場合はdefineがstdio.hのインクルードガードと被ってるから、
既にインクルードされたたものと判断されて読み飛ばされてるだけ。
つか、_で始まるとか__を含むのって実装系のために予約されてるから使っちゃいけないとおもた。
0559557
2007/01/17(水) 06:04:36順番が逆だわ
#ifndef _STDIO_H_
#include <stdio.h>
#define _STDIO_H_
#endif
stdio.hの中に
#ifndef _STDIO_H_
なんちゃらかんちゃら
#endif
になってるのね
今まで_STDIO_H_INCLUDED_を使ってたけど
文字数多いから変えてみたんだけど
ちと吊ってくるわorz
0560デフォルトの名無しさん
2007/01/17(水) 06:32:46何がしたいの?
自分のソースからstdio.hをインクルードするかしないか切り分けたいなら、ナンセンスなんだけど。
0561デフォルトの名無しさん
2007/01/17(水) 06:34:25おまいのコメントは不要だw
0562デフォルトの名無しさん
2007/01/17(水) 06:47:56おまいのコメントこそ不要だろ。
0563デフォルトの名無しさん
2007/01/17(水) 10:47:20こういうときに名前が被ることがあるからユーザは _ で始まる名前や
__ を含む名前を識別子に使ってはいけない(と規格で決められている)。
0564デフォルトの名無しさん
2007/01/17(水) 11:14:25using 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の文字をそのまま整数として吐き出せるんでしょうか?
0565デフォルトの名無しさん
2007/01/17(水) 11:26:180566デフォルトの名無しさん
2007/01/17(水) 15:14:18他のC言語スレにもマルチしてるし
0567デフォルトの名無しさん
2007/01/17(水) 16:16:26ヘッダファイル自身の中で使うイディオムだよな。
557は一体何をやりたいんだ
0568ぼるじょあ ◆yBEncckFOU
2007/01/17(水) 20:52:25まともで親切な回答が欲しければこちらへどうぞ
ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc10.2ch.net/test/read.cgi/tech/1165718021/
0569デフォルトの名無しさん
2007/01/17(水) 21:09:28スレ見ました。興味深いですね
0570ぼるじょあ ◆yBEncckFOU
2007/01/17(水) 21:36:46難しいのも勘弁してほしいYO
0571529
2007/01/17(水) 21:39:57小文字を大文字に変換する関数
**********************************************************/
charto_upper(char c)
/* c :変換する小文字*/
{
charcc;/*結果*/
if ((c >= 'a' )&&( c <= 'z'))
{
cc = c - 'a' + 'A';
}
else
{
cc = c;
}
return cc;
}
以前、cc = c - 'a' + 'A';について質問したのですが
それでも上のソースの解釈ができないのでので
解説しては戴けないでしょうか?
一日かけてもわかりませんでした・・・。
特に >>if ((c >= 'a' )&&( c <= 'z'))です。
0572デフォルトの名無しさん
2007/01/17(水) 21:40:52「cが英小文字(の範囲の文字コード)だったら」ということ
0573571
2007/01/17(水) 21:45:59レス、ありがとうごいます。
((c >= 'a' )&&( c <= 'z')) cはa以上とcはz以下なら真ですよね・・・?
何故、それが>>「cが英小文字(の範囲の文字コード)だったら」と
なりのでしょうか?
自分の解釈が違っているのでしょうか?
ご指摘戴けると、幸いです。
0574デフォルトの名無しさん
2007/01/17(水) 21:56:21つまりcはa以上z以下
なんか解り難い表現だけど、このcは変数cであって文字cじゃない
cをhogeだのpiyoだのと考えたらわかると思う
for(moji=0;moji<26;moji++)printf("%c:%d\n",moji,moji);
これ実行したらわかるんでないかな?
何がわからんのかわからんから手当たり次第に
0575デフォルトの名無しさん
2007/01/17(水) 21:56:320576デフォルトの名無しさん
2007/01/17(水) 21:59:58>>cはa以上とcはz以下なら真
>>cが英小文字(の範囲の文字コード)だったら
これのどこが違うと思うのかを示せるといいと思う。
直訳と意訳の違いみたいなものなんだがなぁ・・・
0577デフォルトの名無しさん
2007/01/17(水) 22:00:19aからzまでの文字コードは順番に並んでいる。
仮にaが97番とすればbは98番、ずっと進んでzは122番というわけだよ。
(c >= 'a')は『cが97番以上』を示し、
(c <= 'z')は『cが122番以下』を示す。
つまりif((c >= 'a' )&&( c <= 'z'))は『97≦c≦122であるならば』となる。
0578デフォルトの名無しさん
2007/01/17(水) 22:01:150579574
2007/01/17(水) 22:01:51for(moji=0;moji<26;moji++)printf("%c:%d\n",moji+'a',moji+'a');
こうしないと何が言いたいのかよくわからんな
0580571
2007/01/17(水) 22:10:37>>577
皆さんありがとうごいます。
意訳とか数字に(JISコード)で置き換えると
解りやすいですね。
>>579
実行するとエラーがでてしまいます。
0581デフォルトの名無しさん
2007/01/17(水) 22:56:480582デフォルトの名無しさん
2007/01/17(水) 22:58:14日本語でおk
0583デフォルトの名無しさん
2007/01/17(水) 23:33:450584デフォルトの名無しさん
2007/01/17(水) 23:59:53これならどうでしょうか?
char to_upper(char c)
{
static const char cl[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z'};
static const char cu[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int i;
for (i = 0; i < sizeof(cl) / sizeof(char); i++) if (c == cl[i]) return cu[i];
return c;
}
0585デフォルトの名無しさん
2007/01/18(木) 00:22:170x
0x
0x
0x
0x
0586585
2007/01/18(木) 00:23:38文字コード表見てみればいいよ
0587585
2007/01/18(木) 00:25:30減算のほうだね
0588デフォルトの名無しさん
2007/01/18(木) 00:27:050590585
2007/01/18(木) 00:38:29{
cc = c - 'a' + 'A';
}
else
{
cc = c;
}
ASCIIの'a'は0x61だろ
charto_upper('a')という感じに実引数に'a'を入れて呼び出すと
仮引数のchar cには'a'が入るわけだ。
つまりcには0x61が入ってるという事になる。
if(c >= 'a' && c <= 'z')を文字コードに置き換えると
if(c >= 0x61 && c <= 0x7A)という感じになる。
0x61〜0x7Aは小文字の英字が入ってるからつまり
if(c >= 'a' && c <= 'z')を日本語に約すと
「もしcが0x61以上かつcが0x7A以下の場合」という約になるはず。
因みにcc = c - 'a' + 'A';は
cc = 0x61 - 0x61 + 0x41となってるようなそうでないようなそうであるような気がする
0591585
2007/01/18(木) 00:39:28http://e-words.jp/p/r-ascii.html
0592585
2007/01/18(木) 00:44:58{
cc = c - 'a' + 'A';
}
else
{
cc = c;
}
もしcが0x61以上かつcが0x7A以下の場合cc = c - 'a' + 'A';
そうじゃない場合(つまりelse)cc = c;
という気がするかもしれないでもないかもしれない。
因みにその関数俺が書くなら
char charto_upper(char c)
{
if (c >= 'a' && c <= 'z')
{
c = c - 0x20';
}
return c;
}
こう書くよ。
0593デフォルトの名無しさん
2007/01/18(木) 00:47:36>>589-591
>>588が言いたいのはASCIIかそれを基にしたJISやS−JISとかなら良いが
それ以外のキャラセットだと保証されねぇーぞってことよ
まぁそこまでシビアになる必要も無いと思うけどさ
0594585
2007/01/18(木) 00:50:31そんな事百も承知だが質問者はソースの解釈を求めてるんだぜ?
入門でそんな細かいキャラセットの事なんて普通やら無いと思うんだがなw
0595デフォルトの名無しさん
2007/01/18(木) 01:15:36原画像を固定して、100枚用意した画像と順番に連続して照合するには
どうすればいいのか教えていただけないでしょうか!
今は原画像も入力画像も指定して開いています。
以下が作りかけのプログラムです。
0596デフォルトの名無しさん
2007/01/18(木) 01:18:11fp=fopen("m.bmp","rb"); // mono画像ファイルを開く
for(j=0; j<54; j++)h[j]=fgetc(fp);// ヘッダの読み込み
wide=h[18]+h[19]*256; // 画像の幅の計算
hite=h[22]+h[23]*256;// 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++)palette[j]=fgetc(fp);
//mono画像データ読み込み
for(y=0; y<hite; y++)for(x=0; x<wide; x++){
v=fgetc(fp); //v=濃度値
sum+=v;
}
ave=sum/(hite*wide);
0597デフォルトの名無しさん
2007/01/18(木) 01:18:52fp=fopen("p.bmp","rb"); // mono画像ファイルを開く
for(j=0; j<54; j++)h[j]=fgetc(fp);// ヘッダの読み込み
wd=h[18]+h[19]*256; // 画像の幅の計算
ht=h[22]+h[23]*256;// 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++)palette[j]=fgetc(fp);
//mono画像データ読み込み
for(e=0; e<ht; e++)for(g=0; g<wd; g++){
v2=fgetc(fp);
sum2+=v2;
}
ave2=sum2/(ht*wd);
0599助けて・・・
2007/01/18(木) 01:59:30私バカすぎて理解できない・・・if,とかforあたりまでしか授業でやってない!!
心の優しい天才様お助けください。。。
0600デフォルトの名無しさん
2007/01/18(木) 02:39:26int year;
char *eto[]={"ne","ushi","tora"・・・};
scanf("%d",year);
printf("%s",eto[year % 12]);
}
0601デフォルトの名無しさん
2007/01/18(木) 02:55:20こらこら…
0602デフォルトの名無しさん
2007/01/18(木) 03:03:05西暦を入力するなら[year % 12]ではなく[(year - 4) % 12]とする必要があるな。
0603デフォルトの名無しさん
2007/01/18(木) 03:34:19void printIntData(int *p, int n);
void sort(int *p,int n);
#defineN 6/*データ個数*/
#defineON 1/*sw:交換しました*/
#defineOFF 0/*sw:交換していません*/
main()
{
/*データの宣言*/
intdata[N] = {5,3,9,1,8,4};
/*最初の状態を表示*/
printIntData(data,N);
/*並べ替え*/
sort(data,N);
/*結果を表示*/
printf("\nソートしました\n\n");
printIntData(data,N);
}
0604デフォルトの名無しさん
2007/01/18(木) 03:35:05/* p : 配列へのポインタ*/
/* n : 配列の要素数 */
{
inti;/*添え字*/
for(i=0;i<n;i++)
{
printf("%d ",*(p+i));
}
printf("\n");
}
0605デフォルトの名無しさん
2007/01/18(木) 03:39:59/* p : ポインタ配列へのポインタ*/
/* n : ポインタ配列の要素数 */
{
inttemp;/*交換用一時保存*/
intsw;/*交換したか*/
inti,j;/*添え字*/
sw = ON;
for(i = n-1; i>= 1&& sw == ON; i--)
{
sw = OFF;
for(j = 0; j< i; j++)
{
/*data[j] <= data[j+1]となるようにする*/
if(*(p+j)> *(p+j+1) )
{
temp = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1) = temp;
sw = ON;
}
}
}
このソースで質問があります
一つ目は、添え字に出てくる j これは何の為の j で何処から出てきて
どう使うのでしょうか?
二個目は、if(*(p+j)> *(p+j+1) ) のポインタの意味解釈ができません
*(p+j)> *(p+j+1)で、(p+j)とは何なんでしょうか?
助言、宜しくお願い致します。
0606デフォルトの名無しさん
2007/01/18(木) 03:59:26#*(p+j+1)も同様に。
0607デフォルトの名無しさん
2007/01/18(木) 04:17:05同じものと思えば宜しいのですね。
0608330
2007/01/18(木) 05:25:12通常ポインタが指すデータは*pや*(p+i)のように「*」で指定します。
しかしポインタが指すものが構造体のメンバの場合は
p->name や (p+i)->name のように「*」を使わずにアロー演算子を使います。
これはどうしてでしょうか?
C言語の仕様?
0609330
2007/01/18(木) 05:26:57*p->name や *(p+i)->name みたいにならないのが分からないのです。
どうかレスよろしくお願いします。
0610デフォルトの名無しさん
2007/01/18(木) 05:34:41(*a).nameと同じだから
->演算子が気に食わないなら(*a).nameとやればいい
0611デフォルトの名無しさん
2007/01/18(木) 05:43:480612デフォルトの名無しさん
2007/01/18(木) 07:05:06>606にも書いた「*(ポインタ+整数) は ポインタ[整数] と等価」と同様、
「*(構造体へのポインタ).メンバ は 構造体へのポインタ->メンバ と等価」という理屈から、
(p+i)->nameはp[i].nameと書いた方が読みやすい場合もある。
0613デフォルトの名無しさん
2007/01/18(木) 08:27:26別な書き方をシンタックスシュガーと言う
0614デフォルトの名無しさん
2007/01/18(木) 12:58:08char str[]="abcdefg", filename[]="test.dat";
FILE *fp; fp=fopen(filename,"a");
fseek(fp,-3,SEEK_END); //これが効かない!!
fputs(str,fp);
0615デフォルトの名無しさん
2007/01/18(木) 13:10:46fopen() の引数に "r+" 指定すればいいんじゃなくね?
以下 MSDN より
> ファイルを "a" または "a+" のアクセス種別で開くと、すべての書き込み操作が
> ファイルの終端から行われます。ファイル ポインタは fseek 関数または rewind
> 関数で移動できますが、書き込み操作を実行する前に必ずファイルの終端に戻
> されます。したがって、既存のデータに上書きされません。
0616デフォルトの名無しさん
2007/01/18(木) 14:12:29できません
>>615でどうぞ
0618デフォルトの名無しさん
2007/01/18(木) 17:21:45double aaa(double a){
return a/(b+1.0);
}
受け取ったaをbで割った数にして返す関数はこれだけでちゃんと機能していますか?
bは外部変数で定義されています。
このプログラムはただの例ですが同じようなものを動かすと計算結果が出ないで空白で出力されます。
0619デフォルトの名無しさん
2007/01/18(木) 17:24:35実行するときの%のあとに数字だけかいててfがありませんでした。
0621デフォルトの名無しさん
2007/01/18(木) 21:55:54素直にp[j]]と書いて正解。
[]はシンタックスシュガーといって*(p + j)を簡易表現したもの
*(p + j)と*(j + p)は同じなわけだから極端な話j[p]でも動作するよ
0622デフォルトの名無しさん
2007/01/18(木) 21:57:570623デフォルトの名無しさん
2007/01/18(木) 22:54:270624デフォルトの名無しさん
2007/01/18(木) 23:14:25いや、シンタックスシュガーだろ?
0625デフォルトの名無しさん
2007/01/18(木) 23:32:57手元にないが「p[i]は直ちに *(p+i)に読み替えられる」
というくだりがあったと記憶している。
0626デフォルトの名無しさん
2007/01/18(木) 23:55:10でもなんで自信満々に「シンタックスシュガーではありません」なんて
言えたんだろう。信憑性のある根拠を説明してほしいな。
0627デフォルトの名無しさん
2007/01/19(金) 00:04:33相変わらずだなあw
所詮ここの回答者は素人から抜け出せないお馬鹿さんばかりと言うことか
0628デフォルトの名無しさん
2007/01/19(金) 00:05:23自分でレベルの高い話題を振ったら?
0629デフォルトの名無しさん
2007/01/19(金) 00:06:07|:::::::::::::;;;ノ
|::::::::::( 」 < 自分でレベルの高い話題を振ったら?
ノノノ ヽ_l
,,-┴―┴- 、 ∩_
/,|┌-[]─┐| \ ( ノ
/ ヽ| | バ | '、/\ / /
/ `./| | カ | |\ /
\ ヽ| lゝ | | \__/
\ |  ̄ ̄ ̄ |
⊂|______|
|l_l i l_l |
| ┬ |
0630デフォルトの名無しさん
2007/01/19(金) 00:06:42|:::::::::::::;;;ノ
|::::::::::( 」 < 自分でレベルの高い話題を振ったら?
ノノノ ヽ_l
,,-┴―┴- 、 ∩_
/,|┌-[]─┐| \ ( ノ
/ ヽ| | バ | '、/\ / /
/ `./| | カ | |\ /
\ ヽ| lゝ | | \__/
\ |  ̄ ̄ ̄ |
⊂|______|
|l_l i l_l |
| ┬ |
0631デフォルトの名無しさん
2007/01/19(金) 00:07:14|:::::::::::::;;;ノ
|::::::::::( 」 < 自分でレベルの高い話題を振ったら?
ノノノ ヽ_l
,,-┴―┴- 、 ∩_
/,|┌-[]─┐| \ ( ノ
/ ヽ| | バ | '、/\ / /
/ `./| | カ | |\ /
\ ヽ| lゝ | | \__/
\ |  ̄ ̄ ̄ |
⊂|______|
|l_l i l_l |
| ┬ |
0632デフォルトの名無しさん
2007/01/19(金) 00:08:080633デフォルトの名無しさん
2007/01/19(金) 02:45:39a[n]と書く事によって、配列として扱いたいという意味を明示していると言える
0634628
2007/01/19(金) 04:31:590635デフォルトの名無しさん
2007/01/19(金) 08:29:50まったく「シンタックスシュガー」である根拠になっていません。
0636デフォルトの名無しさん
2007/01/19(金) 11:39:480637デフォルトの名無しさん
2007/01/19(金) 11:42:48a*=b;
は
a = a * b;
と同じ。
aに入ってた値とbを掛けて、その答えをaに代入する。
0638デフォルトの名無しさん
2007/01/19(金) 11:45:06それが例えば 変数 *= 数値; のことなら 変数 = 変数 * 数値; のことです。
0639デフォルトの名無しさん
2007/01/19(金) 11:46:370640デフォルトの名無しさん
2007/01/19(金) 12:12:52問題文 端末から端末へと、音声を発信したさいに秒読みを開始
相手側の端末から音が送信されてきたら秒読み停止のプログラム作成
音声遅延を計る
OS:windows
コンパイラ名とバージョン:gcc
言語:C言語
期限:1月22日までです
0641デフォルトの名無しさん
2007/01/19(金) 12:38:05> 音声を発信
> 秒読み開始/停止
> 音が送信
詳しく
0642デフォルトの名無しさん
2007/01/19(金) 13:49:08遅延を計りたいんだけど・・
Aのパソコンから音声を発信してBのパソコンへ届き信号が
帰ってくるまでの遅延を計りたいです
0643640
2007/01/19(金) 13:52:450644デフォルトの名無しさん
2007/01/19(金) 13:59:47DVcommXP2の画像エンコード/デコードにかかる時間含みで測るのなら… ハテ?
0645640
2007/01/19(金) 14:12:15NTPは時間を同調させるものみたいですが遅延ツールはどのようなものを使えば
いいでしょうか?
0646330改めタケ
2007/01/19(金) 19:19:06その中でこういうプログラムに出会いました。
/*** ファイルコピーのプログラム例 ***/
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
FILE*fin,*fout;
charinfile[40],outfile[40],s[256];
printf("入力ファイル名=");
gets(infile);
printf("出力ファイル名=");
gets(outfile);
if( (fin=fopen(infile,"r"))==NULL) {/* 入力ファイルオープン */
printf("入力ファイルがオープンできません\n");
exit(1);
}
if( (fout=fopen(outfile,"w"))==NULL) {/* 出力ファイルオープン */
printf("出力ファイルがオープンできません\n");
exit(1);
}
while(fgets(s,256,fin)!=NULL) {/* 入力ファイルから読み込んだデータを*/
fputs(s,fout);/* 出力ファイルに書き込み*/
}
fclose(fin);/* 入力ファイルクローズ */
fclose(fout);/* 出力ファイルクローズ */
return 0;
}
0647タケ
2007/01/19(金) 19:20:24FILE*fin,*fout;
のFILEはなんでしょうか?
教えてください。お願いします。
0648デフォルトの名無しさん
2007/01/19(金) 19:21:15ファイルのハンドル
0649タケ
2007/01/19(金) 19:22:470650デフォルトの名無しさん
2007/01/19(金) 19:37:44ポインタのようなものです
0651タケ
2007/01/19(金) 19:46:25構造体の一種ですか?
そしてfopenするときにはとりあえずFILEをつければ良い?
0652デフォルトの名無しさん
2007/01/19(金) 19:50:54>構造体の一種ですか?
まぁそう思っていただいて良いんじゃないですかね
ユーザが知る必要の無いものですから
>そしてfopenするときにはとりあえずFILEをつければ良い?
ファイル操作するならFILEでいいと思います
でも、リファレンスを読めば関数の戻り型がなにか書いてあるので
見聞を広めることもかねて使用する関数を調べることをオススメします
0654デフォルトの名無しさん
2007/01/19(金) 20:16:59どういたしまして…
あーこう考えてみてはどうでしょうか.
FILEというものが何か分からないわけですが複数のファイルを開く場合、開いたファイルを一意に特定できなければいけませんね.
一意に特定する…方法は?
考えられるのは、”文字列で特定する”、”数値で特定する”の2種類になるわけですが
お分かりかと思いますが文字列で特定するなんていうのは論外ですね.
”特定する処理”に時間をさくわけには行きませんから.
とすると、数値ですがどーしましょうか?インデックスを割り当てる?
いやいや、簡単なことです.オープンしたファイルの情報をシステムは維持しているはずです.
なら、その情報のポインタを”一意に特定”する手段として利用すればいいわけです.
同一のメモリ番地上に複数の情報があるはずがありませんから.
つまりポイントであることがわかっていても、それの実体が何かは知る必要は無いですからね.
0655デフォルトの名無しさん
2007/01/19(金) 20:29:17それを車に挿したり(fin=fopen(infile,"r"))挿したハンドルで操作したりfgets(s,256,fin)
使い終わった後は盗難防止にハンドルを外したり(fclose(fin))してるんだよ、でいいじゃない
0656タケ
2007/01/19(金) 20:29:33説明有難う御座います。
ただその説明を理解するのに苦労しています。馬鹿でごめんなさい。
そんな中また質問よろしいでしょうか?
あれから以下のプログラムに出会いました。
int main( void )
{
FILE *fw;
char maker[10], name[12];
int cc;
if( ( fw=fopen( "car.dat", "a" ) ) == NULL ) {
printf( "ファイルがオープンできません\n" );
exit( 1 );
このときに
if( ( fw=fopen( "car.dat", "a" ) ) == NULL ) {
の文章のcar.datに「""」が付いています。
しかし先ほどの>>646には
if( (fin=fopen(infile,"r"))==NULL) {/* 入力ファイルオープン */
のようにinfileには「""」がついていません。
この違いを教えていただけないでしょうか?
0657タケ
2007/01/19(金) 20:32:38めちゃくちゃ納得できました。有難う御座います。
それではちなみにそのハンドル名はFILEでなくとも違う名前でもいいのですか?
たとえばTAKEとか。
それともFILEでないとイケナイ仕様でしょうか?
0658デフォルトの名無しさん
2007/01/19(金) 20:37:39>>646の方はchar outfileという文字列へのポインタを指定しているからです
>>656は直接文字列を指定していますね
直接文字列を与える場合は ” でくくる必要があります
0659デフォルトの名無しさん
2007/01/19(金) 20:46:34ハンドル名はfinとかfout(に格納された値)の方
FILE *型(FILEじゃなくてFILE *)のハンドルを作ってる
0661デフォルトの名無しさん
2007/01/20(土) 00:38:020662デフォルトの名無しさん
2007/01/20(土) 01:11:18何でファイルの取り扱いなんてやってるんだ?
それ以前に学習すべき事柄が山とあると思うぞ。
0663デフォルトの名無しさん
2007/01/20(土) 03:29:49#include "h.h"
/* -- h.h -- */
int main(int argc, char *argv[]){
int a[100];
pt(a, rd(argv[1], a));
return 0;
}
/* -- 2.c -- */
#include <stdio.h>
int rd(char *f, int *a)
{
int *b = a;
FILE *fp = fopen(f, "r");
while (fscanf(fp, "%d", b++) != EOF)
;
return --b-a;
}
/* -- 3.c -- */
#include <stdio.h>
void pt(int *a, int i)
{
while (i-- > 0)
printf("%d\n", *a++);
}
ファイルの内容読み込んで表示するプログラムなんだが
関数rdで何が起きてるのか理解できません
0664デフォルトの名無しさん
2007/01/20(土) 03:34:34いると仮定)を開いて(fopen)、それをファイル終端まで読み込んでる。
読み込んだ値は配列(a[])に格納される。
0665デフォルトの名無しさん
2007/01/20(土) 03:40:26ファイルには100行までの整数地があると仮定していますしかし、
なんでint +b=aとしているのか、なんでreturn --b-aとなっているのかわかりません
0666デフォルトの名無しさん
2007/01/20(土) 03:49:51↓
return (b-1)-a;
ptの中で何しているのか分かってるなら、後は自分で何とかなるでしょ
0667デフォルトの名無しさん
2007/01/20(土) 03:56:450668デフォルトの名無しさん
2007/01/20(土) 04:05:10、もしくは奇数次の節点がちょうど2つある。)かどうかを調べるプログラムを
教えてください。Cのほうです。
0669デフォルトの名無しさん
2007/01/20(土) 04:24:510670デフォルトの名無しさん
2007/01/20(土) 05:09:07{
char s[] = "王貞治の本塁打数";
return 0;
}
0671デフォルトの名無しさん
2007/01/20(土) 06:32:04{
int ousadaharunohonruidasuu = 868;
return 0;
}
0672デフォルトの名無しさん
2007/01/20(土) 06:54:56#include <string.h>
int main()
{
char str1[] = "cross";
char str2[80],*p1,*p2;
p1 = str1 + strlen(str1) -1;
p2 = str2;
while(p1>=str1){
*p2 = *p1;
p1--;
p2++;}
*p2 = '\0'; ←ここでstr2の最後に塗る文字が入れられてるんですが
なぜこれで最後に入るんでしょうか?この指定なら先頭に入るのではないんですか
printf("%s %s",str1,str2);
return 0;}
0673デフォルトの名無しさん
2007/01/20(土) 07:00:57char *p="Hello World";
while(*p!='\0'){printf("%s\n",p);p++;}
これで何やってるのか理解できるかと
0674デフォルトの名無しさん
2007/01/20(土) 08:12:350675デフォルトの名無しさん
2007/01/20(土) 08:58:590676デフォルトの名無しさん
2007/01/20(土) 09:14:030677デフォルトの名無しさん
2007/01/20(土) 09:22:150678デフォルトの名無しさん
2007/01/20(土) 09:36:36chinpo shasei;
0679デフォルトの名無しさん
2007/01/20(土) 09:46:13ファイルに100行までの整数が書き込まれてるのを読み込み格納し表示するプログラムなんですが
これを1つにつき最大5文字の文字列が書き込まれている場合読み込み格納するにはどうすればいいでしょうか?
ファイルの中身こんなん↓
aaa
bbbb
cc
ddddd
eee
char*[]を渡せばいいのですか?それともchar[][]とかですか?
0680デフォルトの名無しさん
2007/01/20(土) 10:00:41どういう風に格納したいの?
0681デフォルトの名無しさん
2007/01/20(土) 10:08:36C/C++の宿題を片付けます 81代目
http://pc10.2ch.net/test/read.cgi/tech/1168663908/l50
0682675
2007/01/20(土) 11:59:38コーディング規約の雛形にもポインタ演算を禁止する旨の記述がありましたが何か。
変にCずれした香具師に限ってポインタを駆使することを正当化したがるが、
保守性を考えれば避けた方が無難なのは言うまでもないのだが。
#そういえば、あのvoidもポインタ演算肯定派だったな。
0683デフォルトの名無しさん
2007/01/20(土) 12:14:20ろくに基礎を固めず高級言語でばかり遊んでいるからだろ。
0684デフォルトの名無しさん
2007/01/20(土) 12:33:260685デフォルトの名無しさん
2007/01/20(土) 12:38:24団体がポインタ演算使うなって言ってたとか、レッテル張りだけの主張はおなかいっぱい。
0686デフォルトの名無しさん
2007/01/20(土) 13:43:53getc(fp)で、そのあとポインタを一つずらすのは
もう好みの問題でいいの? 違いがあまりよくわからん
0687デフォルトの名無しさん
2007/01/20(土) 13:56:49ただgetcはマクロとして実装されていても良く、
そのためfgetcより高速かもしれないが、引数に副作用のある式を渡すとまずいかもしれないと言うだけ。
ポインタを1つずらすとはどういうことか。
0688デフォルトの名無しさん
2007/01/20(土) 14:19:490689タケ
2007/01/20(土) 14:37:22以下のプログラムを修正してCtrl+Zを入力するまで作業を繰り返すにはどうしたらいいでしょうか?
#include <stdio.h>
int main( void )
{
char moji;
printf( "文字を入力しなさい " );
scanf( "%c", &moji );
if ( moji >= 'A' && moji <= 'Z' ) {
printf( "英大文字です\n" );
}
else if ( moji >= 'a' && moji <= 'z' ) {
printf( "英小文字です\n" );
}
else if ( moji >= '0' && moji <= '9' ) {
printf( "数字です\n" );
}
else {
printf( "英字でも数字でもありません\n" );
}
return 0;
}
0690デフォルトの名無しさん
2007/01/20(土) 15:04:10#include <stdio.h>
#include <ctype.h>
int main(void)
{
int b = 1;
while (1) {
int c;
if (b) printf("文字を入力しなさい ");
if ((c = getchar()) == EOF) break;
if (c == '\n') {b = 0; continue;} else b = 1;
if (isupper(c)) puts("英大文字です");
else if (islower(c)) puts("英小文字です");
else if (isdigit(c)) puts("数字です");
else puts("英字でも数字でもありません");
}
return 0;
}
0691デフォルトの名無しさん
2007/01/20(土) 15:53:04int main(voider)
{
char c = "まんこ";
return ace;
]
0692デフォルトの名無しさん
2007/01/20(土) 16:03:26kwsk
0693デフォルトの名無しさん
2007/01/20(土) 16:34:23確認する方法ってありますか?
検索するとisatty()とか出てくるのですが、よくわかりません。
よろしくお願いします。
0694タケ
2007/01/20(土) 16:55:44有難う御座いました!!
0695デフォルトの名無しさん
2007/01/21(日) 01:02:040696デフォルトの名無しさん
2007/01/21(日) 01:10:21標準的にはありませんね。
特殊なコンパイラなら用意していることもあります。
0697デフォルトの名無しさん
2007/01/21(日) 01:12:09つまり10進法を2進法に変換する場合プログラムを書かないといけないってことか・・・
0698デフォルトの名無しさん
2007/01/21(日) 01:23:360699デフォルトの名無しさん
2007/01/21(日) 01:30:00オーバーヘッドが大きいからね。
関数型言語とは違うんだし。
0700デフォルトの名無しさん
2007/01/21(日) 01:34:220701デフォルトの名無しさん
2007/01/21(日) 01:38:58動作は違うけど再帰版と繰り返し版
void print_binary(int value){
if(value>1) print_binary(value>>1);
putchar('0'+(value&1));
}
void print_binary(int value){
int i;
for(i=sizeof(int)*8-1;i>=0;i--)
putchar('0'+((value>>i)&1));
}
0702695
2007/01/21(日) 01:46:490703タケ
2007/01/21(日) 01:48:24以下の課題及びその答えのプログラムと説明に出会いました。
★ 「Ctrl+Z」入力されるまで、文字列入出力を行う
(書き方)
#include <stdio.h>…必要
int main(void)
{
char str[256];
EOFではないので注意が必要
↓
while (gets(str) != NULL) {…「Ctrl+Z が入力されるまで」
puts(str);という意味
}
return 0;
}
どうしてEOFではなくNULLなのかが分かりません。
どうか教えてください。よろしくお願いします。
0704デフォルトの名無しさん
2007/01/21(日) 01:51:37っ http://www.linux.or.jp/JM/html/LDP_man-pages/man3/gets.3.html
0705タケ
2007/01/21(日) 02:03:12有難う御座いました!!
なるほど、¥0に置き換えられるわけですね。
0706デフォルトの名無しさん
2007/01/21(日) 02:04:50返り値 の項も読んでね
0707タケ
2007/01/21(日) 02:08:03えっと¥0であればNULになるとおもうのですが、NULLなんですね。
・・・getsはポインタ扱いだからですか?
0708デフォルトの名無しさん
2007/01/21(日) 02:11:43getsはchar *を返す関数なので整数であるEOFを返すことができない。
これがEOFを返さない理由。NULLを返す理由は、エラー通知をしたかったのだろう。
「なぜ」と言われても「そうなってるから」程度の答え方しかできない。
0709タケ
2007/01/21(日) 02:14:560710デフォルトの名無しさん
2007/01/21(日) 02:23:58fgetsを使う癖をつけよう。
0711デフォルトの名無しさん
2007/01/21(日) 02:35:27getsを使おうがscanfを使おうが俺の勝手だろ
0712タケ
2007/01/21(日) 02:38:530713タケ
2007/01/21(日) 02:40:470714デフォルトの名無しさん
2007/01/21(日) 02:41:44っ http://www.linux.or.jp/JM/html/LDP_man-pages/man3/scanf.3.html
気になる関数はここで検索 http://www.linux.or.jp/JM/index.html
0715デフォルトの名無しさん
2007/01/21(日) 03:36:438 は CHAR_BIT の方が良いと思う
0716デフォルトの名無しさん
2007/01/21(日) 04:21:53getsを使おうがscanfを使おうがお前の勝手だ
だから氏ね
0717デフォルトの名無しさん
2007/01/21(日) 04:28:110718デフォルトの名無しさん
2007/01/21(日) 04:54:510719718
2007/01/21(日) 05:08:12Cygwinを使ってCのプロジェクトを実行しようとしたのですが、
以下のようなエラーメッセージが出てしまいます。
Debug Assertion Failed!
Program : C\・・・・・・・
file fgets.c
Line 60
Expression : str != NULL
For information・・・・・
最初はfgetsの使い方が間違っていると思ったのですが、
違うファイルを作って試したら問題ありませんでした。
このエラーメッセージからどこがおかしいのか理解できません。
ご存知の方がいらっしゃったら教えていただけないでしょうか?
0720デフォルトの名無しさん
2007/01/21(日) 05:10:410721デフォルトの名無しさん
2007/01/21(日) 05:18:15エラーの起こるソースうp
(基本的には assert 関数に 0 を渡した時にそういうメッセージが出る)
0722デフォルトの名無しさん
2007/01/21(日) 05:19:57http://pc10.2ch.net/test/read.cgi/tech/1168678303/718
0723718
2007/01/21(日) 05:28:06ソースはここに載せられるには大きすぎるんです(;_;)
assert関数ですか・・・たぶん使ってないと思いますので、
ちょっとクセのある間違いをしているのかもしれません。
あと、質問する場所やはり間違ってましたか?
722さんのアドレスの先はJAVAなのですが、そこで大丈夫なんでしょうか?
0724デフォルトの名無しさん
2007/01/21(日) 05:35:04おそらくはバッファオーバーフローが原因で、
書き換えてはいけない領域が書き換えられてる。
ソースがうpできないならデバッガでも使えば?
で、なんで JAVA のスレにマルチやねんw
0725718
2007/01/21(日) 12:01:19領域の使いすぎはあると思います!!
実行するファイルを分割して正常に動くか確認してみます。
ありがとうございました。
0726デフォルトの名無しさん
2007/01/21(日) 13:44:21マップしたファイルをmemcpyで取得していくと7回目ぐらいで
エラーが出ちゃうんだけどこれって構造がまずいのか容量的にまずいのか・・
0727デフォルトの名無しさん
2007/01/21(日) 13:48:24>マップしたファイルをmemcpyで取得していくと7回目ぐらいで
???
ソースうp
0728726
2007/01/21(日) 15:49:54もうそのソース消しちゃって別のやり方でやったからあれなんだけど
原因がわからなくて気持ち悪いからはっきりさせておきたいんだよね。
ソースはこんな感じだったと記憶してる↓(C言語じゃなくてAPIだが)
LPHEADER lpHeader;
/* 指定したマッピング名のオブジェクトを取得 */
hFileMap = OpenFileMapping(FILE_MAP_WRITE, FALSE, ObjectName);
/* マッピングアドレス取得 */
lpMapAddress = (BYTE *)MapViewOfFile(hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
lpHeader = (LPHEADER)malloc(確保する数);
for(i = 0; i < 確保する数; i++)
{
オフセット = i * sizeof(HEADER);
/* この辺りで7回目でmemcpyが落ちる因みにcallocでやると10回目ぐらいでこの現象がおきる */
memcpy(lpHeader, lpMapAddress + オフセット, sizeof(HEADER));
lpHeader++;
}
構造体はchar型の配列とかを組み合わせて合計1044バイトになってる。
容量がまずいのかな。
例
typedef struct tagHEADER
{
char OOOO;
char XXXX[5];
char AAAA[80];
char BBBB;
char SSSS;
・・・・
} HEADER, *LPHEADER;
0729デフォルトの名無しさん
2007/01/21(日) 15:56:26> lpHeader = (LPHEADER)malloc(確保する数);
これだと明らかにサイズが足りない。
> lpHeader = (LPHEADER)malloc(確保する数 * sizeof(HEADER));
多分これかな。
擬似コードを書くときに間違えただけで元のコードだと正しいのかも知れんけどな。
0730726
2007/01/21(日) 15:56:39mallocの時引数をsize * sizeof(HEADER)にしなくて
普通に配列の個数を取得してたからか!?
つーことは実際取得にやってたLocalAllocもsize * sizeof(HEADER)じゃないと
ダメって事か。だから領域破壊が起こってたのかよ。。。
0732726
2007/01/21(日) 15:58:260733デフォルトの名無しさん
2007/01/21(日) 19:31:32ソフトウェアを起動するときには画像や音楽のデータを不要にするなんてことはできますか
0734デフォルトの名無しさん
2007/01/21(日) 19:46:090735デフォルトの名無しさん
2007/01/21(日) 19:47:27たとえばWindowsではソースファイル(をコンパイルして出来たオブジェクトファイル)だけでなく、
リソースとして任意のバイナリを実行ファイルに含ませることが出来る。
0736デフォルトの名無しさん
2007/01/21(日) 19:50:520737デフォルトの名無しさん
2007/01/21(日) 19:51:310738デフォルトの名無しさん
2007/01/21(日) 20:34:54malloc(size);
for(i=0; i<size; i++){
*ptr = 0;
}
っていうコードがあったんですが、
*ptr = 0;
をforで回す意味ってなんかありますか?
0739デフォルトの名無しさん
2007/01/21(日) 20:36:340740デフォルトの名無しさん
2007/01/21(日) 20:38:38意味の無いループ
初期化していないポインタへの代入
・・・写し間違いはないか?>>738
0741デフォルトの名無しさん
2007/01/21(日) 20:44:26いろんな意味で意味の無い無駄なコードだな
0742デフォルトの名無しさん
2007/01/21(日) 20:56:30いろんな意味で意味の無い馬鹿なレスだな
0743デフォルトの名無しさん
2007/01/21(日) 21:01:08コードもレスも人を表す
0744デフォルトの名無しさん
2007/01/21(日) 21:03:020745デフォルトの名無しさん
2007/01/21(日) 21:20:00int i;
char* ptr=malloc(size);
//ループで'\0'に初期化
for(i=0; i < size; i++){
ptr[i] = '\0';
}
//ptrを'\0'で一括初期化
memset(ptr,'\0',size);
要は上記のように'\0'で初期化したいところを
ソースがおかしいから意味不明なソースになってると思う。
0746デフォルトの名無しさん
2007/01/21(日) 21:21:40でもどっかに、たとえばサイトとかにこのコードがのってた
意味があるようには思えないがサイトにのってるコードなんだから
きっと何か意味が・・・・・・・・・・いや、しかし・・・・
と悩んでいたんだろ
つまり的確なレスだぜ
0747デフォルトの名無しさん
2007/01/21(日) 21:24:440748738
2007/01/21(日) 21:31:10の写し間違い。スマソ。
*ptr = 0;
の部分は正しいです。
ptr[i] = 0;
としたかっただけかな、やはり。
ある会社が配布しているデバイスドライバーのコードなんですけど、
Linuxのデバイスドライバーのコードを読むのが初めてだったんで、
なんか特殊な意味があるのかなぁ、あるわけないよなぁ、
という質問でした。
0749sage
2007/01/21(日) 21:33:16returnの後に数字を書いたりするのは何故なんだぜ?
本にはそれが戻り値とか書いてあるんだが、理解が出来ない。
0750デフォルトの名無しさん
2007/01/21(日) 21:44:51なら、関数として戻り値が定義されてる以上returnステートメントがいる。
ちなみに、0を返せば正常終了、それ以外は異常終了とみなされるはずです。
void main(void)
なら、組み込み系(自分は書いたこと無いが)とかだと、一度立ち上げたら
ずっと動かすためにvoidを使ってソースを書くらしい。
0751デフォルトの名無しさん
2007/01/21(日) 21:49:29int main()
{
・・・・・・・・・・・・
・・・・・・・・・・・・
return 0;
}
システムに渡されるコード(戻り値)は何になる?
return がなかったら戻り値は何になる?
0752デフォルトの名無しさん
2007/01/21(日) 21:52:41失敗とか成功とか
main()の戻り値はそーゆー時に必要なんぢゃよ
0753デフォルトの名無しさん
2007/01/21(日) 22:01:54出力は1文字づつで
縦7横15の*の平行四辺形をかくにはどうすればいいんでしょうか
***************
***************
***************
***************
***************
***************
***************
***************
バージョンとこのはんたいバージョンなんですが
2重るーぷをつかわなければいけないんですけど
縦のループのあと横のループはわかるんですけど
縦にうつるときがわかりません
ちなみに使用できるのはfor,while,int,printfです
0754デフォルトの名無しさん
2007/01/21(日) 22:05:49int main()
{
int i,k;
for(i=0;i<7;i++){
for(k=0;k<15;k++){
printf("*");
}
printf("\n");
}
return 0;
}
とこのはんたいバージョンって?
int main()
{
int i,k;
for(i=0;i<15;i++){
for(k=0;k<7;k++){
printf("*");
}
printf("\n");
}
return 0;
}
こういうこと?
0755デフォルトの名無しさん
2007/01/21(日) 22:17:47#include<stdio.h>
int main(void){
int i,k;
for(i=0;i<7;i++){
for(k=0;k<i;k++) printf(" ");
for(k=0;k<15;k++) printf("*");
printf("\n");
}
printf("\n");
for(i=0;i<7;i++){
for(k=0;k<7-1-i;k++) printf(" ");
for(k=0;k<15;k++) printf("*");
printf("\n");
}
return 0;
}
0756デフォルトの名無しさん
2007/01/21(日) 22:18:05これ何やってるかコメント文で説明を付けて教えてもらえませんか?
っていう質問はありですか?
0757749
2007/01/21(日) 22:20:34戻り値という事の意味も分からないんだ。
今までint main(void)と書いて、最後にreturn 0;と意味も分からず書いてきたんだが
自分で関数を作るとこまで来て、例えば累乗計算の関数を書くとき
int ruijo(int a, int b)
{
int n, ans;
ans = 1;
for(n = 1; n <= b; n++){
ans = ans * a;
}
return ans;
}
と本に書いてあるんだが、今までreturn 0;と書いてきたが今度はreturn ans;
になってて、今までと同じreturn 0;じゃダメなのか、と思ってるんだ。
要するに戻り値というのを分かりやすく教えてほしい。
0758デフォルトの名無しさん
2007/01/21(日) 22:25:00これは長方形になりませんか?
>>755縦と横でループをわけるということでしょうか?
0759デフォルトの名無しさん
2007/01/21(日) 22:29:13int main(void)というのは引数を取らずに関数呼び出し元にint型の値を返すってこと
だからint ruijo(int a, int b)はint型の値を二つ取り」、int型の値を返すってこと
そこで、関数で戻る時(return)にint型であるansを返している。
return 0;ってのは正常終了をシステムに伝えてる、はず
0760デフォルトの名無しさん
2007/01/21(日) 22:31:40たとえばこんな関数があったとする
int nibai(int x)
{
int y;
y= 2 * x;
return y; �@
}
int a;
a=nibai(10);・・・�A
関数 nibaiに 10 という数字を与えると
関数 nibai は 2×10=20 という計算をしてそれを返すわけだが
戻り値ってのは �@で返した値が呼び出した�Aに戻ってくるというもの
a には 20 が入る
これで分かるかな?
0761デフォルトの名無しさん
2007/01/21(日) 22:36:58そのruijoという関数には値の受け渡しの箱が3つあると思いなされ。
コールする時はint aとint b、実行終了したら結果がint ruijo()として戻ると。
コールする側で kekka = ruijo(2, 3); とか書いてると思うが、これは関数コールであるとともに代入文でもある。
0763デフォルトの名無しさん
2007/01/21(日) 22:39:20>>755
ありがとうございます!
初心者ですみませんがreturn0って必要なんでしょうか
これなしになぜかコンパイルできるんですが・・・
0764デフォルトの名無しさん
2007/01/21(日) 22:51:55このあたりが参考になるんじゃないかな
http://pc10.2ch.net/test/read.cgi/tech/1167325490/750-
0767デフォルトの名無しさん
2007/01/21(日) 22:59:53直角三角形をかくときに最初に高さを入力するけいしきなんですが
scanfで入力はいいんですが
scanfの関数を縦のループにつかうんでしょうか?
これも
ーーーーーー
| /
| /
| /
| /
|/
|\
| \
| \
| \
| \
=====
の形を*でつくりたいんです
0768754
2007/01/21(日) 23:14:47どやー
#include<stdio.h>
int main(void){
int i,k,height;
printf("入力(n)=");
scanf("%d",&height);
for(i=1;i<=height;i++){
for(k=i;k<=height;k++) printf("*");
printf("\n");
}
for(i=1;i<=height;i++){
for(k=i;0<k;k--) printf("*");
printf("\n");
}
return 0;
0769754
2007/01/21(日) 23:15:53return 0;
のあとに } つけてね
0770デフォルトの名無しさん
2007/01/21(日) 23:18:31なるほど・・・やっぱりスキャンフの関数を
そのままつかうんですね
ありがとうございます!
0771デフォルトの名無しさん
2007/01/21(日) 23:21:45ライブラリの使い方からさっぱりです。どなたか教えていただけませんか?
0772756
2007/01/21(日) 23:35:270773771
2007/01/21(日) 23:36:450774デフォルトの名無しさん
2007/01/21(日) 23:41:46スレ違いとは思わないが、プログラムの質が低すぎて読む気にもなれないだけ。
0776756
2007/01/21(日) 23:57:20質が低い質問に答えてくれるとおもって入門篇にきたんです・・・
>>775
いえ、一応宿題ってわけではないんでそっちに行ってないです。
宿題スレで聞いたほうが良いですか?
0777デフォルトの名無しさん
2007/01/22(月) 00:00:25double型の数値をchar型の文字列に変換する関数を作ったのですが、どうしても誤差が出てしまいます。
printfで表示されるみたいな誤差の出ない(厳密な突っ込みは今しないで。)文字列に変換する方法を教えてください。
http://sakuratan.ddo.jp/uploader/source/date31366.txt
に問題の関数をupしておきますた。
0778デフォルトの名無しさん
2007/01/22(月) 00:01:52・他人の書いたソースなら、書いた本人に解説して貰え。
・そもそも勝手に晒していいのか?
・疑問点を聞きたいのなら、聞きたいポイントを指定しろ。
0779754
2007/01/22(月) 00:09:46>>778が言うとおりだと思う
すべてにコメントつけるなんて無理
で、キミがどこが分からないのか、こっちはそれも分からない
どーしてもソースを理解したいならまず分解してすこしずつ稼動する範囲を広げていくのがいい
と、言っても難しいかなぁ
0780デフォルトの名無しさん
2007/01/22(月) 00:10:54小数点以下7桁目まで表示したいなら、8桁目を四捨五入すれば?
printf()も指定桁の一つ下で四捨五入していることだし。
つーか、この関数を作った理由は勉強のため?
まさか"%.7f"を知らないってわけじゃないよね?
0781777
2007/01/22(月) 00:12:00>>776って書いてあるけど文章の内容から推測して私のことですか?
そうだとしたら。
・これは自分で書いたソースですが、自分で書いたソースを勝手に晒す事は違法ですか?
・疑問点は小数部分を文字列に変換する際に誤差が生じてしまう原因とその対処法です。
0785デフォルトの名無しさん
2007/01/22(月) 00:17:38便乗ですみませんが、"%.7f"について説明されてるサイトを教えてください。
0786756
2007/01/22(月) 00:19:49質問がアバウトすぎたんですね。失礼しました。
mainのdo-while文の中身のy--;やx--;、if文の条件と
reverseの中のif文がどういうときで場合分けしてるのか
についてお願いします。
0787デフォルトの名無しさん
2007/01/22(月) 00:24:45>>780=778だけど、>784の言う通り君宛じゃない。
勉強のためじゃないのなら、無駄な努力をする必要はない。
fprintf()で"%.7f"するか、sprintf()で"%.7f"したものをfputs()すればいい。
あーそうそう、誤差が生じる原因は、小数をdoubleで表現すると循環小数になって誤差が生じるため。
0788デフォルトの名無しさん
2007/01/22(月) 00:25:34http://www.linux.or.jp/JM/
0789785
2007/01/22(月) 00:30:55発見しました。
0790754
2007/01/22(月) 00:47:43>mainのdo-while文の中身のy--;やx--;、
scanf による入力は1〜8、しかし配列のインデックスは0〜7なので -1 してる
>reverseの中のif文がどういうときで場合分けしてるのか
文で説明するのは難しいんだが(苦手)
まずreverseの最後の引数(整数)は以下の意味があると覚えておく(仮に方向番号とする)
「1: 左下 2: 下 3: 右下 4: 左 6: 右 7: 左上 8: 上 9: 右上」
この引数はその方向のマスをチェックしていくと言う意味になる
で、オセロの動作を考えて欲しい
1.まずユーザがマスを選択する(scanf入力)
2.ユーザが指定したマスが空いているマスかチェック(if(brd[y][x] == -1))
3.reverseの方向番号が指定する最初のマス(ユーザが4.4を指定して方向番号が7(左上)なら3.3となる)が自分の持ってる石かチェック (仮に方向チェックとする)
4.3.が相手のマスであるならさらに次のreverseを呼び出す(方向番号がさす方向、上の例だと2.2をチェック)
5.3.4を繰り返す
6.自分の持ってるマスに行き着いたら自分の石の色の数値を返す(再帰的に呼び出しているので4.5.でチェックしたマスに自分の石の色が入ることになる)
mainからの
最初のreverse呼び出しがあるif文はユーザ指定のマスから方向番号により方向チェックをする
チェックの結果、相手の石ならその方向を再帰的に調べ、自分の石が見つかるか空いたあマスまで繰り返す
自分の石が見つかったならチェックしてきたマスを戻りながら自分の石にしていく
空いたマスなら相手の石の色を返すことによって石を取れない(エラー)としている
石を取れた場合、ユーザ指定のマスへの自分の石を置く
取れなかった(エラー)場合、なにもしないでユーザ入力に戻る
長文なので誤字脱字があるかも知れん
0791754
2007/01/22(月) 00:53:36プログラムの概要は↑
んで当初の質問は
>reverseの中のif文がどういうときで場合分けしてるのか
つまり石を置いた場所からそれぞれの方向に対して相手の石を取れるかチェックし、取れると判断できたなら相手の石を自分の石に変えていく
そして、方向は「1: 左下 2: 下 3: 右下 4: 左 6: 右 7: 左上 8: 上 9: 右上」 の8方向だから
if文も8つあるわけだ
0792754
2007/01/22(月) 00:58:46つか俺が眠い
0793756
2007/01/22(月) 01:05:45眠いのに詳しく書いていただいてすみません。
引き続き読んできます。ありがとうございました
0794754
2007/01/22(月) 01:14:19いや、起きてたから俺的には許しちゃる
まぁわかんなきゃまた質問しな
ただし、ちゃんとどこがどー分からないのかを書くこと
具体的にってのは無理だと思うけど、せめてここはどういう意味か?どーしてこうなるのか?とかさ
でなければ答えようがないからな
まーがんばれ
んじゃ、オヤスミ
0795デフォルトの名無しさん
2007/01/22(月) 01:24:200796デフォルトの名無しさん
2007/01/22(月) 02:21:23ありがとう
そして
さようなら
0797デフォルトの名無しさん
2007/01/22(月) 02:22:220798デフォルトの名無しさん
2007/01/22(月) 02:36:36んじゃ
0799デフォルトの名無しさん
2007/01/22(月) 03:04:470800デフォルトの名無しさん
2007/01/22(月) 03:05:390801タケ
2007/01/22(月) 04:37:23「char *fgets(char *s, int size, FILE *stream);」であるfgets()についてですが、
fgets()においてキーボード入力にするにはストリームになんと記述すればいいのでしょうか?
0802デフォルトの名無しさん
2007/01/22(月) 04:49:31標準入力にキーボードが向けられてるならFILE *にstdin。
あと名前入力しなくていい。しない方がいい。
0803デフォルトの名無しさん
2007/01/22(月) 12:55:43c:\sampleディレクトリーに保存するらしいんんですけど c:\sampleディレクトリーってなんですか? 超初歩な質問ですけど
独学でやってるせいで全然わかりません・・教えてください お願いします
0804デフォルトの名無しさん
2007/01/22(月) 14:18:30C言語の前にOSの勉強からしたほうがいいと思うよ。
0805デフォルトの名無しさん
2007/01/22(月) 15:51:01左下の「スタート」を押して「全てのプログラム」を押して「アクセサリー
」を押して「エクスプローラー」を選ぶ。
エクスプローラーが開いたら画面の左側にフォルダ一覧が表示されていると思う。
その中に「マイコンピューター」と言うのがあるはず。
それを押すと「ローカルディスク(C:)」と言うのがあるはず。
そのローカルディスク(C:)に「sample」というディレクトリーを作る。
ちなみにディレクトリーを理解するには、まず家を考えて欲しい。
家には部屋がある。ローカルディスクが「家」、ディレクトリーが「部屋」と思ったらいい。
パソコンを使っているといろんなファイルやプログラムが増えてくる。
それを整理整頓するために、分かりやすい名前の部屋を好きなだけ作って、そこにファイルなどを入れていくわけだ。
で、今はまだローカルディスク(C:)には「sample」ディレクトリーは無いはず。
作り方は、まず先ほどのエクスプローラーのローカルディスク(C:)をマウスでクリックして
一番左上にある「ファイル(F)」を選んで、そこに「新規作成」が一番上にあるはず。
そこに「フォルダ」があるのでそれを選ぶ。その名前を「sample」にする。
まぁsampleじゃなくても好きな名前でいいけれどね。
それとフォルダはディレクトリーの別名です。
これでわかるかな?
・・・・ひょっとしておいらは思いっきり釣られてしまったのかな。
0806デフォルトの名無しさん
2007/01/22(月) 16:09:33TV初出演!1/22(月)放送予定! 20:42
ウノウ(株) (http://unoh.net) の開発合宿がTV取材されました!
開発合宿の模様をテレビ東京さんに取材していただきました。
「ワールドビジネスサテライト」テレビ東京系列(http://www.tv-tokyo.co.jp/wbs/)
1/22(月)23:00〜にて放送される予定です。
たぶん、私は温泉のシーンでセミヌードが、映るのではないかと思います。
0807デフォルトの名無しさん
2007/01/22(月) 16:20:21釣られたって言うか、思いっきり鼬害。
仮に釣りじゃないとしても、>803に理解できると思えないが。
0808sage
2007/01/22(月) 16:22:57どういう意味かわかりますか?
%sの後ろに数字をいれるのは
0809デフォルトの名無しさん
2007/01/22(月) 16:33:10特に意味はないな。
単純に文字列の後ろの数字を書きたいだけじゃね?
Ex.
printf("%s0", "321"); // ⇒3210
0810デフォルトの名無しさん
2007/01/22(月) 16:33:321なら1を表示
0811デフォルトの名無しさん
2007/01/22(月) 17:03:21コマンドプロンプトに【cd sample】と打ったら【バスが見つかりません】と出てしまいました
何回も質問して本当に申し訳ないのですが 今度はどうすればいいのでしょう?
0812デフォルトの名無しさん
2007/01/22(月) 17:09:34スレ違い
初心者板にでも逝け
0813デフォルトの名無しさん
2007/01/22(月) 17:37:52ファイルの【名前.c】でsampleに保存してもコンパイルできません どうすればコンパイル
できますか?
0814デフォルトの名無しさん
2007/01/22(月) 17:39:28釣りっていう文章の書き方だな
0815デフォルトの名無しさん
2007/01/22(月) 17:40:58何をしたらどういう風になってコンパイルできなかったのかな?
0816デフォルトの名無しさん
2007/01/22(月) 18:05:44805さんのいうとおりsampleというディレクトリーを作ったあと コマンドプロンプト
でカレントディレクトリーを【cd sample】と打って変更してsammpleに【ファイルの名前.c】で保存しても
コンパイルされなくて ためしにソースコードそのまま貼ってみたら【〜は内部コマンド
または外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません】
とでてきます・・ いったいどうやったらコンパイルできるのでしょう?
0817754
2007/01/22(月) 18:05:48sampleをフォルダが作れないから何にもできないってだけだろうな
0818sage
2007/01/22(月) 18:06:42それはUNIXとかwindowsのコマンドプロンプトの話でしょ。
全く関係ないw
0819デフォルトの名無しさん
2007/01/22(月) 18:07:50こういう初歩的なことを理解しないとPCをまともに使えなかったんだよな。
0820デフォルトの名無しさん
2007/01/22(月) 18:08:490821754
2007/01/22(月) 18:10:360822デフォルトの名無しさん
2007/01/22(月) 18:11:52コンパイルのやり方は環境依存なので、それぞれのコンパイラのスレで聞いてくれ
0823sage
2007/01/22(月) 18:12:11ややこしくて頭がてんぱってきたからこのスレみたら
あの質問
0824デフォルトの名無しさん
2007/01/22(月) 18:13:05いい具合に解れただろ?
0825デフォルトの名無しさん
2007/01/22(月) 18:14:53この初心者君は何でもいいからC言語の初心者本を買ってきて読んだ方がいい。
Cの質問ってレベルじゃねーよ。
0826デフォルトの名無しさん
2007/01/22(月) 18:19:470827デフォルトの名無しさん
2007/01/22(月) 18:21:560828754
2007/01/22(月) 18:33:15アレCインタプリタだったな
あれからCが好きになったんだ
0829デフォルトの名無しさん
2007/01/22(月) 18:41:51元金と年利を入力し、複利計算をするときに
元金が2倍をこえるのに要する年数と、その時点元利合計をもとめて
利息計算は円未満切捨てなのですが
実数をintがたにキャストしてint型変数として代入すればいいともうのですが・・・
ちなみに複利は
元金1000円年利10%で
りそく 元金合計
1ねんご 100(1000*10%) 1100
2年後 110(1100*10%) 1210
といった計算です
0830sage
2007/01/22(月) 18:55:500831デフォルトの名無しさん
2007/01/22(月) 18:59:39この計算プログラムをつくりたいんです
0832デフォルトの名無しさん
2007/01/22(月) 19:02:40結局何を聞きたいのかわからん。
円未満切捨てで扱う数が整数のみでいいなら
int同士で計算すれば加減乗除の計算結果は
キャストするまでもなく全部intになる。
0833デフォルトの名無しさん
2007/01/22(月) 19:07:59年利のときに小数点をつかうからdoubleじゃないとだめじゃないんですか?
0834805
2007/01/22(月) 19:15:57よしっ!!もう一度釣られるぞ!!イヤッホッー!!
cd sampleでsampleディレクトリに入ったら、画面に
C:\sample>
ってなっていると思う。そこに
[コンパイルしなさいという命令文][スペース][ファイル名].c
と打てばいい。
例えば命令文が bcc32 でファイル名が reidai と言うものならば
画面には
C:\sample>bcc32 reidai.c
となるように打ち込み、リターンキーを押す。
でコンパイルできるはず。
ただ命令文が何なのかはそのコンパイラに拠るからそれは自分で調べてほしいのだが・・・できるか?
0835デフォルトの名無しさん
2007/01/22(月) 19:20:02そのように計算式を立てれば、そうなる。
全て整数型でやろうと思えばできなくもない。
0836754
2007/01/22(月) 19:20:550837デフォルトの名無しさん
2007/01/22(月) 19:20:57間違い。
0838デフォルトの名無しさん
2007/01/22(月) 19:21:380839デフォルトの名無しさん
2007/01/22(月) 19:25:14int main(void)
{
double r=0.1;
int base = 1000;
int risoku;
for(risoku = 0 ; base < 2000 ;)
{
risoku += base*r;
base += risoku;
printf("risoku = %d\n",risoku);
printf("base = %d\n",base);
}
return 0;
}
複利計算ってこれでいいんだっけ?
0840805
2007/01/22(月) 19:29:07命令文というのは間違いか。
0842デフォルトの名無しさん
2007/01/22(月) 19:33:03環境変数にパスセットするだけのバッチファイルも奈にやってるか分から無かったですよ、ええ
0843デフォルトの名無しさん
2007/01/22(月) 19:44:39昔はそういうことはPCを触った段階で覚えなきゃ話にならんかったのよ。
そういう時代に書かれた本の対象読者はCUIに慣れてたのさ。
過去を現在の常識で評価するなんてまるで朝鮮人みたいだな。
0844デフォルトの名無しさん
2007/01/22(月) 20:07:23どうやら書き方が悪かったようで、すんません
0845デフォルトの名無しさん
2007/01/22(月) 20:24:17こちらこそ早とちりしてすまんかった。
90年代前半を想像してたんだが。
0846デフォルトの名無しさん
2007/01/22(月) 20:25:190847デフォルトの名無しさん
2007/01/22(月) 20:32:380848sage
2007/01/22(月) 20:43:370.8
0.3
0.1
0.06
0.03
とかから計算はできるんだが0と1での表し方がわからないんですけど。
0849デフォルトの名無しさん
2007/01/22(月) 20:49:240850sage
2007/01/22(月) 20:57:08これに表があるけどこのprobabilityを入力していって
code wordを出すプログラムです。
これの計算ができたんだけども1と0の割り当てがうまくいなくてね。
0852デフォルトの名無しさん
2007/01/22(月) 21:06:58ハフマン木が出来てるならrootから辿って
符号を割り当てていくのが普通だと思うんだが。
というか俺は学校の課題ではそうした。
0853デフォルトの名無しさん
2007/01/22(月) 21:09:04URL削ったらそこのサイト面白いな。
何か得した気分だ。
0854sage
2007/01/22(月) 21:11:09木の根の部分にポインタがさしてる状態です。
ここから一番下までポインタを動かして
一番下から下の2つずつに0と1をつけていってから
・・・
考えれば考えるほどこんがらがってくる
0855デフォルトの名無しさん
2007/01/22(月) 21:20:00木のデータ構造をどんな表現にしてるからわからないから出来ないかも知れないけど
rootから全てのleafまで走査していく過程で左に行ったら1付加、右にいったら0付加でいいんじゃないの。
そんな難しく考える事じゃない。そのサイトで言うなら
"A"に行く走査→rootから左で到着→1
"B"に行く走査→rootから右→左で到着→01
・
・
・
"H"に行く走査→rootから右→右→右→右→右→右で到着→000000
0856754
2007/01/22(月) 21:23:37どして?
>>855と大差ない説明だけど(説明下手だからわかんなかったらこっちは見なくても・・・)
木はどういう構成なの?つまり(サイトの場合)rootに対して左側が確率が高く右側が低いよね.
再帰処理使うといいよ.
そして現在通過した枝の数字を記憶させておく
だからrootからまず左を辿る.rootからAの赤点までだから Aは 1
次にひとつ戻って今度は右の枝に向かう 通過した枝は今は 0 だよね
節についてもまだ枝があるから、こんどもまた左の枝に向かう 0 1
ここで葉についたからBは01
次にひとつ戻って今度は右の枝に向かう 0 0
するとまた節にたどりつくのでその左を・・・・・
って感じでやればいいと思うけど
0857sage
2007/01/22(月) 22:33:23短いやつならいいけど
長いやつを入力したら値が違うんだよね。
つくったやつで試しても>>850
のページの結果にならない・・・
0858デフォルトの名無しさん
2007/01/22(月) 22:50:21俺の頭が悪いからかもしらんけど
君が何を言っているのかわからない
0860754
2007/01/22(月) 23:17:46可能ならソースをアップして
そのほうがコメント付けやすい
>>859はちょっと勘違いしてレスしたけど
確率の大きい順にソートするでしょ
あとは確率の値は必要ないの
木の構成で必要なのは「順番」だけ
code wordの生成に必要なのは木だけ
確率の値は必要ない
0861sage
2007/01/22(月) 23:28:19迷惑かけてすいませんでした。
書いてたプログラムをニ分木で全部書いたら
みなさんがいってたことがわかりました
0863デフォルトの名無しさん
2007/01/22(月) 23:50:49VBで作ったフォームAのボタンクリックで、
Cで作ったexeファイルを実行させてその結果を
フォームAのテキストボックスに表示させるには
どうしたらよいのですか?
0864デフォルトの名無しさん
2007/01/22(月) 23:51:11まさか高校で・・・。(((゜Д゜)))
0865sage
2007/01/22(月) 23:56:50左のポインタがNULLになるまで左をすすめ
右のポインタがNULLになるまで右をすすめる。
これを再帰的にやったらいいんですかね?
問題はどう0と1を付加していくかだな。
0866デフォルトの名無しさん
2007/01/23(火) 00:11:40単に指定された文字列のファイルが開けなかったから不正、ではなく、
Windows のパスとして不正な文字列 <>: 等、
エクスプローラで指定するとエラーになるケースを判別したいです。
すみませんが、皆さんのお知恵を貸してください。
0867デフォルトの名無しさん
2007/01/23(火) 00:14:32リダイレクトとパイプ。知ってる単語連ねただけだ。
0868754
2007/01/23(火) 01:37:45ん〜〜なんか違うような.
http://ja.wikipedia.org/wiki/2%E5%88%86%E6%8E%A2%E7%B4%A2%E6%9C%A8
この図で説明すると
今8にいるのね
で左がNULLになるまで進む(1までいっちゃう)
次にひとつ上に戻る.3にもどるの
3から今度は1つだけ右にいく.6に行くわけね
6からはまた左にNULLまで進む(4にいくのね)
そしたらまた次にひとつ上に戻る.つまり6にもどる
6からは1つだけ右に行く.7ね.ここで7は左も右もNULLだから上に戻るの
6に戻る.3に戻る.8に戻る
したら今度は8からひとつだけ右に行く(10ね)
10からは左にNULLまで・・・・って言うのを繰り返す
ってゴメン.いまさらながら勘違いしてた
木の生成方法だけどひとつ連結(アルファベットを結ぶ)するたびにソートが必要だった
ゴメンナサイ
どーしよ.説明したほうがいい?
0869デフォルトの名無しさん
2007/01/23(火) 01:44:14それはこのスレで扱うべき話題ではないと思う。
どこかWindowsのプログラミング関連のスレできくべき。
0870754
2007/01/23(火) 02:00:05あーーーごめんなさいぃー
リンクもダメだった
直接リンク踏んでも正常に飛ばないから
一回リンクをコピーしてからブラウザのアドレスに貼り付けて移動して・・・
それから、木の生成方法だけど説明が必要なら言ってください
うまく説明する自信は無いけど・・・
でも、今日は寝ます.寝ちゃいます
0871デフォルトの名無しさん
2007/01/23(火) 02:08:360872デフォルトの名無しさん
2007/01/23(火) 03:46:28{
*str=str[1]+('A'-'a');
}
int main(void) {
char str[10];
strcpy(str,"abcdefg");
a(str);
printf("%s\n",str);
return (0);
}
これの*str=str[1]+('A'-'a')の意味ががよくわからないんですけど、
教えてくださいませんか
0873デフォルトの名無しさん
2007/01/23(火) 03:49:48str[0]=str[1]+('A'-'a');
先頭の文字を2文字目を大文字にしたものに置き換えてる。
0874デフォルトの名無しさん
2007/01/23(火) 03:53:43即レスありがとうございました!
これですっきりねれますw
0875デフォルトの名無しさん
2007/01/23(火) 03:57:590876デフォルトの名無しさん
2007/01/23(火) 06:15:53EXEの出力をファイルに落とし、VBではそのファイルから読み込んでやるのが一番楽かな。
具体的な方法は該当スレでどうぞ。
0877デフォルトの名無しさん
2007/01/23(火) 06:30:08char text[10]
for(i=0;i<10;i++)
{
text[i]=' '
}
みたいな原人のような方法しか思いつきません・・・しかも初期化とは言い切れないorz
0878sage
2007/01/23(火) 06:45:33基本的に左にすすめると。
そして1付加する。
if(左のポインタ==NULL)
if(右のポインタ==NULL)
言葉じゃ説明できんな。。。
左も右のポインタもひとつずつNULLじゃないかをみて
基本的には左にいくんだけどもNULLになったらひとつ戻って右にいく
こうかな?
0879デフォルトの名無しさん
2007/01/23(火) 07:29:41目的は?
文字列として使うのが目的なら、text[0] = '\0';だが。
#つーか、コンパイルできないコードを提示して原人もへったくれもないと思うが。
0880デフォルトの名無しさん
2007/01/23(火) 07:48:57あるファイルの文字を一文字ずつ読む→アルファベットが続く限りtextに一字ずつ入れる
→そうやって出来た単語を読んで単語ごとにカウントする
という風なプログラムに使用したかったんですが、textの中の全文字列を初期化しないと
次の単語を読むときに前の単語の後半の文字が残っちゃって・・・
元のcファイルは大きすぎて提示できませんでした
0881デフォルトの名無しさん
2007/01/23(火) 08:24:10文字列の取り扱いを勉強しなおせ。
0882デフォルトの名無しさん
2007/01/23(火) 16:46:37うまくインクルードする方法はないでしょうか?
0883デフォルトの名無しさん
2007/01/23(火) 17:34:53memset()とかstrcpy()は?
>>882
ヘッダファイルを分割して、分割した各々を#includeするヘッダファイルを作り、それを#include
0884デフォルトの名無しさん
2007/01/23(火) 17:35:33インクルード以外の方法を考えた方がいい。
0885デフォルトの名無しさん
2007/01/23(火) 17:38:300886754
2007/01/23(火) 17:48:28えっ?ほんとに?
リンク踏むとアドレスバーが↓になって「項目はありません」って表示されちゃうんだよね
http://ja.wikipedia.org/wiki/2a??a?¢c´¢a?¨
>>878
>基本的には左にいくんだけどもNULLになったらひとつ戻って右にいく
そう その通り
木の生成のほうは・・・大丈夫だよね・・・
0887デフォルトの名無しさん
2007/01/23(火) 18:36:05LSI-C86試食版かな。最近の最適化なんかの成果が全く入っていない、
今となっては単純なコンパイラなので爆速だろうと思う。
まったくお勧めはしないけど。規格準拠度が低いし、
16bitコードしか吐けないし、ライブラリはスモールモデルしかないし。
0888デフォルトの名無しさん
2007/01/23(火) 18:39:55使えねーな
0889デフォルトの名無しさん
2007/01/23(火) 18:40:18うん。だからそう書いた。
0890デフォルトの名無しさん
2007/01/23(火) 20:38:020891デフォルトの名無しさん
2007/01/23(火) 21:08:050892デフォルトの名無しさん
2007/01/23(火) 21:25:33ってUNIXな連中が言ってた記憶があるけどな。
0893デフォルトの名無しさん
2007/01/23(火) 21:29:11雑談するなら理由もなく「〜はいい感じ」とか教科書や
ウェブで調べればすぐに見つかりそうな痛いレスはやめて
もう少し知識になるような雑談をしてくれないか?
0894デフォルトの名無しさん
2007/01/23(火) 21:39:50その書き込みがどんな知識になるのか納得いくように説明してくれたらそうしてやるよ。
0895sage
2007/01/23(火) 21:51:200896デフォルトの名無しさん
2007/01/23(火) 21:56:500897デフォルトの名無しさん ◆yBEncckFOU
2007/01/23(火) 22:00:470899デフォルトの名無しさん
2007/01/23(火) 22:25:070900754
2007/01/23(火) 22:27:110901デフォルトの名無しさん
2007/01/23(火) 22:35:340902デフォルトの名無しさん
2007/01/23(火) 23:14:140904デフォルトの名無しさん
2007/01/24(水) 00:01:47というか恥をさらしてるだけ?
w
0906デフォルトの名無しさん
2007/01/24(水) 00:21:520907デフォルトの名無しさん
2007/01/24(水) 00:23:56const int b = a + 1;
って書くと、gccで
tmp.c:2: error: initializer element is not constant
って怒られるんですが、
なんか書き方ないですか?
#defineにしろ、以外でお願いします。
0908754
2007/01/24(水) 00:32:41const にb = a + 1 いかんでしょ
#define だめなの?
私なら
#define INIT_A 0
const int a = INIT_A;
const int b = INIT_A + 1;
とかにする
INIT_A って名前がクソとかはなしでね
0909デフォルトの名無しさん
2007/01/24(水) 00:36:03コンパイラはaがconstだって認識してくれないもの?
右辺の成分は全部constな値じゃんかよ、
initializer element is not constant
とか嘘じゃん、
って思ってしまうんですが。
#defineが駄目なんじゃなくて、
それは思いつくから他にないものかと思いまして。
あざっす。
0910754
2007/01/24(水) 00:51:58const int a = 0;
const int b = a + 1;
この場合 a は変数でしょ
C++ならいいんだけど.
Cの場合 const 変数で初期化できない(みたい、規格的なことはしらないんです、無知でゴメンナサイ)
#define INIT_A 0
const int a = INIT_A;
const int b = INIT_A + 1;
この場合なら右辺も定数になるから cnost を初期化できる
0911754
2007/01/24(水) 00:52:38○Cの場合 const を変数で初期化
0913デフォルトの名無しさん
2007/01/24(水) 10:44:21次のように並べて表示するプログラムを作成せよ。16進,8進についてはビ
ット処理を行うこと。繰返し文を用いることにより,幾つかのデータで実行を
確認してみよ。
12 0000000C 000000000014
-1 FFFFFFFF 37777777777
これ教えてください(>_<)
0914デフォルトの名無しさん
2007/01/24(水) 11:17:06宿題なら宿題スレで聞いたら?
http://pc10.2ch.net/test/read.cgi/tech/1169575464/
1をよく読んでから書いてね。
0915デフォルトの名無しさん
2007/01/25(木) 00:20:480916デフォルトの名無しさん
2007/01/25(木) 00:24:580917デフォルトの名無しさん
2007/01/25(木) 00:26:51無償でダウンロードできるところはありませんか?
0918デフォルトの名無しさん
2007/01/25(木) 00:31:16unix用のコードをwindowsで動かそうとしてないか?
0919デフォルトの名無しさん
2007/01/25(木) 00:32:38>>473
(・3・) エェー おもしろそうだけどそろそろ風呂入って寝るから回答できないお
土曜日までやってくれる人がいなさそうならもいらが回答してやるお
忘れっぽいから土曜日にゆうこりん似のアナ○画像か大沢あかねたんのコラ
(アナ○見せてると尚可)をうpして気づかしてくれお
478 名前:ぼるじょあ ◆yBEncckFOU [sage] 投稿日:2007/01/25(木) 00:20:08
補足: コラじゃなくても大沢あかねたんの激似のエロ画像(ア○ルが見えてると最高なんだけど・・・)
でもいいお
0920デフォルトの名無しさん
2007/01/25(木) 00:39:00あ、すいませんでした、とんだ勘違いしてました。
ご教授ありがとうございます。
0921デフォルトの名無しさん
2007/01/25(木) 00:40:28あ、すいませんでした、とんだ勘違いしてました。
ご教授ありがとうございます。
0922デフォルトの名無しさん
2007/01/25(木) 11:29:58ローカルでその引数をいろいろ変えていった場合
それは関数をまたいで保存されるのでしょうか?
0923デフォルトの名無しさん
2007/01/25(木) 11:48:26日本語で(ry
エスパーしてみる
>グローバルで仮引数を設定
関数の引数にグローバル変数を渡した。
>ローカルでその引数をいろいろ変えた
関数の内部において、引数を書き換えた。
>それは関数をまたいで保存されるのでしょうか?
グローバル変数の値はどうなるよ?
グローバル変数の値は、関数内部の引数書き換えでは変わらない
int global = 10;
void func(int arg) { arg++; }
void hoge(void)
{
func(global);
func(global);
.... /* 何回 func() を呼ぼうが global は 10 のまま */
}
0924デフォルトの名無しさん
2007/01/25(木) 11:57:35お察しいただいた内容ですw
なるほど外側で設定した値は変わらないんですね。
ありがとうございました
0925デフォルトの名無しさん
2007/01/25(木) 12:06:31ポインタまわりで混乱するかもなw
char buffer[10] = "123";
char *ptr = global_buffer;
void func(char *p) { p[0]++; }
void hoge(void)
{
func(ptr); /* ptr は buffer の先頭を指している が buffer の中身が変わって "223" になる */
func(ptr); /* ptr は buffer の先頭を指している が buffer の中身が変わって "323" になる */
}
func は 「ポインタを書き換えている」 のではなく 「ポインタが示している場所の内容」 を書き換えている
0926925
2007/01/25(木) 12:07:37○ char *ptr = buffer;
092725
2007/01/25(木) 13:48:42/* [メモリの内容とメモリの番地(アドレス)の表示実験] */
/* 変数dataの値をポインタ変数ptrを用いて表示せよ */
#include<stdio.h>/* getchar()関数を使う時に、必要 */
main()
{
int data=123;
int *ptr;/* ポインタ変数の宣言 */
ptr=?????;/* 変数dataのアドレスをポインタ変数に代入 */
printf("\n変数dataの値 = %d\n\n",data);
/* 変数dataのアドレスを10進数及び16進数で表示せよ */
printf("変数dataのアドレス = %? @10進表示, %?@16進表示\n\n",?data,?data);
/* 変数dataのアドレスをポインタ変数ptrを使って表示せよ */
printf("ポインタ変数ptrの値= %u\n\n",ptr);
/* 変数dataの値をポインタ変数ptrを使って表示せよ */
printf("ポインタ *ptrの値= %d\n\n",????);
/* ポインタ変数ptrのアドレスを10進数及び16進数で表示せよ */
printf("ポインタ変数ptrのアドレス = %? @10進表示 ,%? @16進表示\n\n",&ptr,&ptr);
printf("\n\n何かキーを押してくれ");
getchar();/* キーを押すまで前文で停止している */
}
わかりますか?
0928754
2007/01/25(木) 13:54:49#include<stdio.h>/* getchar()関数を使う時に、必要 */
main()
{
int data=123;
int *ptr;/* ポインタ変数の宣言 */
ptr=&data;/* 変数dataのアドレスをポインタ変数に代入 */
printf("\n変数dataの値 = %d\n\n",data);
/* 変数dataのアドレスを10進数及び16進数で表示せよ */
printf("変数dataのアドレス = %d @10進表示, %x@16進表示\n\n",&data,&data);
/* 変数dataのアドレスをポインタ変数ptrを使って表示せよ */
printf("ポインタ変数ptrの値= %u\n\n",ptr);
/* 変数dataの値をポインタ変数ptrを使って表示せよ */
printf("ポインタ *ptrの値= %d\n\n",*ptr);
/* ポインタ変数ptrのアドレスを10進数及び16進数で表示せよ */
printf("ポインタ変数ptrのアドレス = %d @10進表示 ,%x @16進表示\n\n",&ptr,&ptr);
printf("\n\n何かキーを押してくれ");
getchar();/* キーを押すまで前文で停止している */
}
0929デフォルトの名無しさん
2007/01/25(木) 13:56:57ポインタを使えばいいんですね。
ありがとうございました。よく分かりました。
093025
2007/01/25(木) 14:02:59/* ポインタ変数を使って文字列の長さを求めよ。但しスペースや","、"."は
一文字とカウントする。 */
#include<stdio.h>/* getchar()関数を使用する為に必要 */
main()
{
char moji[]="To be or not to be,that is the problem.";/* →39文字 */
char *ptr;/* ポインタ変数の宣言 */
int ls=0;/* 文字列の長さの格納場所 */
???=????; /* ポインタ変数に文字列を代入 */
while (*ptr??'\0'){ /* 文字列の長さのカウント */
ptr++;
ls++;
}
printf("\"%s\" の文字数 = %d文字\n",moji,??);
printf("\n\n何かキーを押せ");
getchar();/* 任意のキー入力待ち */
}
じゃあこれもわかりますか?
0931754
2007/01/25(木) 14:11:32#include<stdio.h>/* getchar()関数を使用する為に必要 */
main()
{
char moji[]="To be or not to be,that is the problem.";/* →39文字 */
char *ptr;/* ポインタ変数の宣言 */
int ls=0;/* 文字列の長さの格納場所 */
ptr=moji; /* ポインタ変数に文字列を代入 */
while (*ptr!='\0'){ /* 文字列の長さのカウント */
ptr++;
ls++;
}
printf("\"%s\" の文字数 = %d文字\n",moji,ls);
printf("\n\n何かキーを押せ");
getchar();/* 任意のキー入力待ち */
}
093225
2007/01/25(木) 14:15:50#include<stdio.h>/* getchar()関数を使用する為に必要 */
main()
{
char moji[]="To be or not to be,that is the problem.";/* →39文字 */
char *ptr;/* ポインタ変数の宣言 */
int ls=0;/* 文字列の長さの格納場所 */
ptr=moji; /* ポインタ変数に文字列を代入 */
while (*ptr!='\0'){ /* 文字列の長さのカウント */
ptr++;
ls++;
}
printf("\"%s\" の文字数 = %d文字\n",moji,ls);
printf("\n\n何かキーを押せ");
getchar();/* 任意のキー入力待ち */
}
これはどうでしょう?
0935デフォルトの名無しさん
2007/01/25(木) 15:21:460936デフォルトの名無しさん
2007/01/25(木) 17:46:48struct are{
struct are *p0;
struct are *p1;
}
void saiki(struct are *tp)
{
struct are *p;
if(p==NULL)
return;
saiki(p->p0);
saiki(p->p1);
}
前順走査を再帰でやりたいんだけど
ノードの左のノードへつなぐポインタはp0
右のノードへつなぐポインタをp1とする。
まあハフマンなんだけどね。
あるノードの中の値を前順走査で探したいんだけど
その経路をつけながらやるのってどうやればいいですか?
0937754
2007/01/25(木) 18:02:13これでどーかな?
p0 p1 じゃなくて left right の方が分かりやすいと思うけどまぁいいや
void saiki(struct are *tp)
{
struct are *p;
if(p==NULL) return; // rootのsaiki呼び出しでNULLチェック入れてるならいらない
if(p->p0 != NULL) saiki(p->p0);
if(p->p1 != NULL) saiki(p->p1);
}
0939754
2007/01/25(木) 18:24:59こういう手法が許されるかは分からないけど
struct are{
struct are *p0;
struct are *p1;
struct are *next;
}
struct are *p_prev=NULL;// グローバルで宣言
// p_prev がNULL は 現在の p がrootということになる
void saiki(struct are *p)
{
if(p==NULL) return; // rootのsaiki呼び出しでNULLチェック入れてるならいらない
if(Prev!=NULL) prev->next=p;
prev=p;
if(p->p0 != NULL) saiki(p->p0);
if(p->p1 != NULL) saiki(p->p1);
}
あとはrootの struct are から nextを辿ればそれが経路になる
next==NULLで経路探索終了
実際に動かしてないからバグあるかも
0940デフォルトの名無しさん
2007/01/25(木) 18:35:15だったら
struct node_tag
{
struct node_tag *parent, *child_left, *child_right;
}
てなかんじだろ?
双方向の二分木ってところか
0941936
2007/01/25(木) 18:41:23何かのノードを探索するプログラムはできるんだけど
それの経路となるとね
0942デフォルトの名無しさん
2007/01/25(木) 18:52:070943デフォルトの名無しさん
2007/01/25(木) 18:56:42宿題?
ここは作ってもらうところじゃないぞ
0944936
2007/01/25(木) 19:10:34再帰を使ってニ分木の前順走査をしたときの
経路の出し方がわからなくてね。
0945デフォルトの名無しさん
2007/01/25(木) 19:19:35>>937-939に対して何か言うことないの?
経路を出すって何をしたいんだ?
struct areに何らかの値を持たせて出力でもしたいのか、
ノードのアドレスでも出力するのか
0946デフォルトの名無しさん
2007/01/25(木) 19:20:090947デフォルトの名無しさん
2007/01/25(木) 19:23:50あなたの言い方だと質問=宿題だな
質問も無理ならなんなんだこのスレ
0949デフォルトの名無しさん
2007/01/25(木) 19:31:57日本語でok
0950754
2007/01/25(木) 19:36:03>>939ののコードの prev を parrennt にしろってこと?
>>944
>経路の出し方がわからなくてね
どう出したいの?
root から だどる道を知りたいんでしょ
戻るときの一度通過した節も必要ってこと?
経路が root->left->root->right てこと?
0951デフォルトの名無しさん
2007/01/25(木) 19:38:02せっかく自分で努力しようという学生の向上心を無碍に扱うのもどうかと
0952754
2007/01/25(木) 19:39:48>>937じゃなくて>>939だよ
>>937はするーで、p->p0 ,p->p1 がNULLの時エラーになるなぁと思ってたら経路のこと忘れてレスしちゃったから
>>951
禿同
向上心があることはいいことです
0953936
2007/01/25(木) 19:41:185個くらいのノードにはいってる割合をみつけて、
rootからそのノードまでの道を表示したいんです。
木で表示してあって一番上がroot,left,rightは用います。
左にいくときは1を表示、右に行く時は0を表示したいんです。
0954936
2007/01/25(木) 19:44:51図はこれの木をたてたものです。
probabilityとcode wordを表示したいのです
0955デフォルトの名無しさん
2007/01/25(木) 19:49:59> 左にいくときは1を表示、右に行く時は0を表示したいんです。
>>954
> probabilityとcode wordを表示したいのです
最初からそう書けよ
saiki関数の引数に0or1を格納するための配列と、格納した数(=深さ)でも渡せばいいと思う
0956754
2007/01/25(木) 19:50:08いや、君があのときに人ってのは分かってるの
それを知ってる上でレスしたんだけど
この前も書いたけど
木を作る段階でね
1.確率が低い2つを見つける
2.あわせてひとつの節にする
1と2を繰り返して木を作るんだけど、それは出来たの?
0957936
2007/01/25(木) 19:53:24rootが一番上をさすようになってます
0958754
2007/01/25(木) 20:08:47>>957
木の形は表のTree of Code と同じになってる?
root から左がAで右がH
0959754
2007/01/25(木) 20:15:01rootから A, B, C,・・・H までのすべての経路が欲しいわけだよね
それって一度にA〜Hまでの経路を出すの?
それともAの経路が欲しいと思った時に初めて経路探索するようにするの?
(Bが欲しいと思ったらroot → Bの経路を出力のように)
0960936
2007/01/25(木) 20:16:59それがわかればそれをループすればいいですから。
入力の配列も作りなおさないといけないけど
0961754
2007/01/25(木) 20:31:05こんな感じかなぁ
引数のstruct are *targetは探索したい葉のアドレス
文字で、たとえば 'A ' や'B' とかで検索したいならchar alpha とかにして
struct are{
struct are *p0;
struct are *p1;
}
char codeword[10];
int saiki(struct are *target,struct are *p,int level,codeword[])
{
if(p==NULL) return 0; // rootのsaiki呼び出しでNULLチェック入れてるならいらない
if( p==target)
{
codeword[level] = '\0';
return 1;
}
if(p->p0 != NULL)
{
codeword[level] = '1';
if(saiki(target,p->p0,level+1,codeword)==1) return 1;
}
if(p->p1 != NULL)
{
codeword[level] = '0';
if(saiki(target,p->p1,level+1,codeword)==1) return 1;
}
return 0;
}
0962デフォルトの名無しさん
2007/01/25(木) 20:32:52一問一答が延々と続いてるのは質問の仕方等が悪いせいだって事に気づいてないのかね。
void saiki(struct are *tp, int *a, int idx)
{
struct are *p;
if(p==NULL) {
int i;
for(i=0;i<idx;i++) {
printf("%d ", a[i]);
}
printf("\n");
return;
}
a[idx] = 1;
saiki(p->p0, a, idx+1);
a[idx] = 0;
saiki(p->p1, a, idx+1);
}
コンパイルさえもしてないのでいい加減だが、こんなのじゃだめなのかな
0965936
2007/01/26(金) 00:16:290 0.34
1 0.23
2 0.20
3 0.10のnumとprobを構造体のメンバとして
このノードを作り木を作ったんだけど、それのnumをターゲットとしてできるように
main関数で0から3をループしてをの変数を、
その中に>>961さんのプログラムを
参考にして作ったプログラムに、引数として送るように
プログラム作ってようやくコンパイル通ったけど出力できない。。。
わかりにくい文章ですまそ。
このin levelっていう引数って何を送ってるのですか?
numと同じと考えていいのでしょうか?
0966754
2007/01/26(金) 00:36:25prob の型は何?
int lebelは節(実際は枝)の深さでありcodewordのインデックスになる
rootの時0で、rootから次の節へ行くたびに1増える.
>>954のサイトでいうとrootからHへ行くとする
rootから1番目の節までがlebel0、1番目から2番目の節がlebel1ってなって最後の枝は5になる
現在の節から左の節にいく場合はlebelで指定されるcodeword[lebel]に1が、
右にいく場合はcodeword[lebel]に0が入る
葉に到達した場合はcodewordの最後に'\0'が入り
これを文字列出力すれば サイトのcodewordと同じになるはずです
>numと同じと考えていいのでしょうか?
違います
木を作ったソースが気になるのですが、
前にも言いましたがソースを提示してもらったほうが解説しやすいです
まぁ私も人に自分のソース見せるのは恥ずかしくてイヤなんですけどね
0967936
2007/01/26(金) 01:01:04struct are *root; struct are *pointer0; struct are *pointer1;
double prob; //割合(0.50,0.31,0.22,0.10・・・)
int node_num; //ノードの数(1とか2とか
int node; //ノード列(0,1,2,3,4) };
main(){
struct are *root;
int i,j;
char prob1[N],codeword[10]={'\0'};
〜
for(j=0;j<N;j++){
prob1[j]=saiki(root,j,j,codeword);
printf("%s",prob1[j]); }
int saiki(struct are *p,int j,int level,char *codeword) {
if(p=NULL)return 0;
if((p->node)==j){
codeword[level] ='\0';
return 1; }
else if(p->pointer0 != NULL){
codeword[level] ='1';
if(saiki((p->pointer0),j,level+1,codeword)==1)return 1; }
else if(p->pointer1 != NULL){
codeword[level] ='0';
if(saiki((p->pointer1),j,level+1,codeword)==1) return 1; }
return 0;
}
0968936
2007/01/26(金) 01:07:54PのポインタがN−1とN−2番目のノードをさすようにして
その2つのprobを足してpのprobにいれる。そしてpがひとつ上を指すようにする
一回ループすることにソートかけてるので
あってると思います
0969754
2007/01/26(金) 01:12:54>このノードを作り木を作ったんだけど
分かりづらいかもしれませんが木はこのように出来ましたか?
ちなみに木構成はrootを上にしたとき 0が左側、3が右側です
root ------- 0 (0.34)
|
----------1 (0.23)
|
------2 (0.20)
|
--- 3 (0.10)
木の作成以外を書いてみました
このコードは木の構造が重要です
しかし木の構成が分からないので動作チェックはしていません
http://sa-wiki.com/upload/src/up0094.txt
>>967のコードは今チェックしてみます
0970754
2007/01/26(金) 01:24:02for(j=0;j<N;j++){
prob1[j]=saiki(root,j,j,codeword);
printf("%s",prob1[j]);
}
このコードが違います
saiki(...) が返す 0 および 1 は再起処理を継続するかしないかのフラグです
目的のノードが見つかったとき関数saiki(...)は1を返すようにしています
そして関数saiki(...)は自分が呼んだsaiki(...)から1が返ると以降の処理をやめ、return 1を返します
これにより呼び出し元の関数saiki(...)自身もすぐに終了するというものです
ただしくは
for(j=0;j<N;j++){
prob1[j]=saiki(root,j,j,prob1[j],codeword);
printf("%s",prob1[j],codeword);
}
です.
ただし処理ごとに表示しているので配列の必要はないんですけど.
0971754
2007/01/26(金) 01:26:33×
prob1[j]=saiki(root,j,j,prob1[j],codeword);
これだと prob1[j],codeword を破壊してしまいます
○
saiki(root,j,j,prob1[j],codeword);
main においては戻り値はいりません
0972936
2007/01/26(金) 01:29:03すいません。
あれは略してるのでプログラム通らないに決まってます
これが
今つくってるソースです。http://sa-wiki.com/upload/src/up0095.txt.html
0973754
2007/01/26(金) 01:50:01もう2点
関数saiki(...)のはじめの方の
if(p=NULL)return 0;
ですが、不正な代入です.等価式ではないです
if(p==NULL)return 0;
にしてください
あとmainの表示処理>>970のprintf("%s",prob1[j],codeword);の部分ですが
改行を入れたほうが...printf("%s\n",prob1[j],codeword);
今のところ以上です.
明日早出なの忘れてました.
私、今日はもう寝ますので...と、思ったらレス付いてる.
えぇ〜と、明日で良いですか?ソースチェック...
たぶん私以外の人が見てくれると思いますが.
>>972のソースは略したソースと同じものですよね.省略して無い部分については...
>>972のソースは明日チェックします.
時間は夜7時以降だと思いますけど.
先に寝かせていただきますね.ゴメンナサイ
では、お疲れ様でしたぁ.
明日には次スレ立ってるのかなぁ((ひとりごと・・・・
0975デフォルトの名無しさん
2007/01/26(金) 11:51:24while(1){
if (kbhit() == 1){
break;
}else{
Sleep(500);
}
}
fflush(stdin);
このように作ったのですが、押したキーがこの次にあるfgetsによって読まれてしまいます。
どうすれば解決できるでしょうか?
0976デフォルトの名無しさん
2007/01/26(金) 12:23:20fflush(stdin)は未定義です。getc()等で読んで捨ててください。
0977デフォルトの名無しさん
2007/01/26(金) 17:43:43これでいける!多分…
while(1){
if (kbhit() == 1){
while(kbhit())
getch();
break;
}else{
Sleep(500);
}
}
0979デフォルトの名無しさん
2007/01/26(金) 21:41:36★★★★★ スレタイ ★★★★★
C言語なら俺に聞け(入門篇) Part 7
★★★★★ テンプレ ★★★★★
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 6
Part 6 http://pc10.2ch.net/test/read.cgi/tech/1167325490/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/
関連スレ
C/C++の宿題を片付けます 82代目
http://pc10.2ch.net/test/read.cgi/tech/1169575464/l50
くだすれC言語(初心者用)
http://pc10.2ch.net/test/read.cgi/tech/1153542424/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc10.2ch.net/test/read.cgi/tech/1159613789/l50
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1169039760/l50
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
0980デフォルトの名無しさん
2007/01/27(土) 11:09:47ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc10.2ch.net/test/read.cgi/tech/1165718021/
0981ぼるじょあ ◆yBEncckFOU
2007/01/27(土) 18:27:59淋しい>>980は宿題を持ってくれば相手をしてあげるお
0982デフォルトの名無しさん
2007/01/27(土) 20:58:38ありがとうございます。
しかし、fflush(stdin)を全部入れ替えたら新たな問題が。
#include<stdio.h>
#include <string.h>
#include <conio.h>
main(){
int check=0;
char word[8]="string\n",input[8];
while(check == 0){
// fflush(stdin);
while(kbhit()){
getch();
}
fgets(input, 8, stdin);
if (strcmp(word,input) == 0){
printf("OK\n");
check = 1;
}else{
printf("NG\n");
}
}
return 0;
}
0983デフォルトの名無しさん
2007/01/27(土) 21:10:46その問題ってなによ?
0984982
2007/01/27(土) 21:22:06単純化すると>>982のようなプログラムなのですが、
コメントアウトされたfflush(stdin);の代わりにその下の3行を入れたところ
標準入力の中身が捨てられず、8文字以上入力すると8文字ごとに読み込み
strcmpして、NGと表示してしまいます。
kbhit()って、先頭が読み込まれていたらその残りに関しては
1を返さないんでしょうか。
0985デフォルトの名無しさん
2007/01/28(日) 05:49:03kbhit() はキーボードバッファの状態を調べて返す関数だが、
fgets() 関数が呼ばれたときに、キーボードバッファの中身が
ストリームバッファ stdin に移ってしまって、
キーボードバッファの中身が空になってしまい、
意図した動作になっていないんだと思われる。
fgets() を使わずに getch() で読むように変更するか、
fgets() で得られた文字列の終端が '\n' でなければ、
\n または EOF がくるまで読み飛ばすようにすればOK
0986985
2007/01/28(日) 05:55:32fgets(input, 8, stdin);
↓
fgets(input, 8, stdin);
if(input[strlen(input)-1]!='\n')
{
char lfbuf[2];
fscanf(stdin, "%*[^\n]%1[\n]", lfbuf);
}
0987デフォルトの名無しさん
2007/01/28(日) 06:15:03fflush(stdin); はやめれ
どうしてもというなら環境依存スレ行け
0988デフォルトの名無しさん
2007/01/28(日) 09:09:54fflush(stdin)を違う方法で置換したいがための質問だと思われ。
0989デフォルトの名無しさん
2007/01/28(日) 12:40:43昔の人ですか
w
0990デフォルトの名無しさん
2007/01/28(日) 13:16:260991デフォルトの名無しさん
2007/01/28(日) 14:55:550992デフォルトの名無しさん
2007/01/28(日) 15:19:110993デフォルトの名無しさん
2007/01/28(日) 15:54:070994デフォルトの名無しさん
2007/01/29(月) 04:51:100995デフォルトの名無しさん
2007/01/29(月) 09:58:330996デフォルトの名無しさん
2007/01/29(月) 10:57:45んな過去の遺物に依存したプログラミングは推奨できません。
0997デフォルトの名無しさん
2007/01/29(月) 11:09:230998デフォルトの名無しさん
2007/01/29(月) 15:46:510999999
2007/01/29(月) 17:41:231000999
2007/01/29(月) 17:42:1710011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。