1 :
デフォルトの名無しさん :
2011/10/26(水) 07:17:36.14
mallocとかnewとかで確保したメモリってさ、ゴミ入ってるじゃん。 あれって他のプログラムが使ったカスだったりすんのかな? もし他のプログラムが"host=xxxxx,user=name,password=****" ってなログインクエリを 作って終了してたとして、自分のプログラムで1GBぐらいヒープを確保してuserとかpasswordとか 転がってるか探したら見つかったりすんのかな?今まで見たことは無いけどWindowsとかなら理屈上ありうる? もしそんな事が有りうるんなら、確保したメモリにパスワードとか書き込んでたなら、 メモリ解放前にシコシコ上書き削除が必要だよね。
>>4 今入ってるあのゴミは何?
Windowsが毎回ゴミを詰め込んで初期化してるの?
7 :
デフォルトの名無しさん :2011/10/26(水) 19:46:18.13
exit(1)って何で役に立つんですか? プログラムが強制終了する関数なのは知ってますが ifで条件分岐したらこのexit(1)使わなくてもいいんでは?
>>7 main以外の関数でプログラムを終了できる。
>>7 メインはatexitなんかで終了処理させるために使うな。
あとはIOバッファのフラッシュをやらせたい時とか。
10 :
デフォルトの名無しさん :2011/10/26(水) 19:59:53.63
なら何を聞いてるのかわからん 必ずmainまで戻るならexit使わなくていいよ
main関数の中でなら、returnにするか、exitにするかは、どっちでもいい気がする。
13 :
デフォルトの名無しさん :2011/10/26(水) 20:31:10.49
Cの宿題のほうでも聞いたのですが、そちらは丸投げ専門のようなので、こちらで質問させてください。 int main(void){ char str[256],*p=str; int i, l; printf("in = "); scanf("%s", str); i=l = strlen(str); while(i--) { *(p+l)=*p; *(p+l+1)='\0'; printf("%s\n",++p); } return 0; } というプログラムを組んでいただいたのですが、どうなっているのかさっぱりわかりません。 具体的にはstrlenがどんな働きをするのかと、 a=b = strlen(str); while(a--) { *(p+b)=*p; *(p+b+1)='\0'; printf("%s\n",++p); この部分が一体全体どうなっているかわかりません。教えてください。 pには文字が入っているはずなのに、どうして*(p+b+1)='\0'のように数字を足すことができるのでしょうか。 また、a=b=strlen(str)とaも文字が入っているはずなのに、a--と数字のように扱えるのはなぜですか? 初歩的な質問で申し訳ありませんが、お願いします。
14 :
デフォルトの名無しさん :2011/10/26(水) 20:31:26.74
mainから呼び出した関数の中で即時終了させたい時ぐらいかな。
16 :
デフォルトの名無しさん :2011/10/26(水) 20:36:24.12
>>13 pには文字(char)が入ってるんじゃなくて、文字が入ってるメモリ領域のアドレスが入ってる。
これはポインタと言われてるんだが、Cの入門書でも読めばかなりのページを割いて説明してると思うよ。
ここで質問するよりまず入門書を読むことをお勧めする。
あなたはまだ質問以前の段階だと思う。
>>13 strlenの戻り値は文字列の長さなんで、strの内容が"abc¥n"だったら、
a=b=strlen(str);
でaとbに整数値の3が入る。
char *p=str のpには、str領域の先頭アドレスが入る。(文字ではない)
勘違いし易いのは、
・宣言時のchar *p は「文字列のポインターのp」
・実行時の*p、例えば....=*p;
の場合は「アドレスpにあるデータ内容(文字など)」を意味してる、という事。
char *p より、char* pの方が直感的だとは思うが、
char* p;
char s[10];
を1行にまとめる際に、
char* p,s[10];
としてしまっては、
*がs[10]にも掛るのかの区別がつかないから、
char *p,s[10];
という表記になっている。
>>13 strlenは、文字列の長さを取得する関数。"abcde"なら、5。
while(a--) {
*(p+b)=*p; strの最後にstrの先頭文字'a'をセット(strはabcdea)
*(p+b+1)='\0'; str最後+1に'\0'をセット(strはabcdea\0)
printf("%s\n",++p); strの2文字目から表示("bcdea")
}
whileでstrの文字数(つまり5回)繰り返しながら、表示開始位置をずらしていく。
こんな感じ?
>>14 極めてメモリ容量が限られていて、無駄なランタイムライブラリを減らしたい時。
Cの規格通りコンパイルするとmainからプログラムが始まる。
でも、実際のプログラム開始点は、mainじゃなくスタートアップコード。
ランタイムライブラリを切り離してプログラムをコンパイルすると、
このスタートアップコードから書くことになる。
このスタートアップコードがどんな作りかは、規格外なのでコンパイラやOSによるけど、
Windowsなんかは、void __cdecl WinMainCRTStartup( void )って関数を用意する事になる。
この関数は戻り値はvoidなんで当然値を返せない。
こういう時、exitが入ってる最小限のライブラリだけリンクし、exitを使って戻り値を返す事ができる。
>16 ・mainに戻る前に実行したくない後処理がある場合 ・while(1){...} とか無限ループになってる場合。
>>13 strが0x00008000〜0x000080FFに配置されているとすると、
p = str (= &str[0]) = 0x00008000
strに"xxxxx\0"が先頭から入っていれば、b = strlen(str) = 5
p+b+1 = 0x00008006で、*(p+b+1)は0x00008006の中身 (= str[6])
>>16 処理時間の長い演算処理のプログラムか何かで、デバッグの為に途中で終了させたい時にも使うな。時としてデバッガよりも手っ取り早いからね。
>16 ・ファイルが無いとか開けないとか致命的なエラーがあってこれ以上処理を継続しても意味が無いとき ・そもそもmain()から他のライブラリのmainloop()なりを呼んでmain()に返ることがなくイベントドリブンで動かすようなとき
MS-DOS上で例えば |―|―|―| |A|B|C| |―|―|―| という感じに表示(A,B,Cは空白)させたとして、A,B,Cのどこかにキーボードから入力させることってできますか?後、その入力したものを判別(数値や値の特定)させることはできますか?
>>26 適切なライブラリを利用すれば充分可能です。
>>27 いや、ライブラリを使わずにしたいんだが…
画面の状態を縦横の配列で保存しといて、入力がある度に表示をクリアして書き換えてやりゃ良いんじゃないの?
ansi,sys使う
なんでVRAMに情報が格納されているのに またわざわざRAMに情報を格納しなくちゃいけないんですかぁぁぁぁぁぁ
ソースコードを配布する際に、ビルドに必要なライブラリーの存在などを調べて、各自の環境毎にMakefileを自動生成するスクリプトを付けるのがunixでは半ば常識ですが、 autoconfに関して、ライブラリー、ライブラリーパス、ヘッダーファイルの存在、ヘッダーファイルのパスを確認するスクリプトは、 みなさんどのように書いてますか? codepadでconfigure.inの簡単な実例をお願いします。
ここはプログラミング何でも相談室になったのか?
つーかMSDOSの表示を弄るのを外部ライブラリを使わずにやれるわけないじゃん。
>>25 UNIXの話だけど、forkの時にメモリの内容を子プロセスにコピーする、っていうじゃ
ないですか。とするとmallocして確保する領域は、親のプロセスのメモリ内容のコピーに
なってたりしないのかな?
メモリ内容のクリアが発生するとしたら、誰がいつどこでどのように... おっとスレチ気味?
scanfで入力した10桁ぐらいの数字を一桁づつ配列に入れるやり方教えて下さい
>>38 そういうのは文字列として読み込んでから処理したほうが楽だぞ
>>38 最初からscanf()で配列に入れないのはなんで?
>>38 こんな感じかな。
みんなが言うようにそのまま文字列で処理した方が良いと思うけど・・・
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
char buf[256];
char *s = &buf[sizeof buf];
int neg=0, radix=10;
scanf("%d", &i);
*--s = '\0';
if (i<0){
neg = 1;
i = -i;
}else
neg = 0;
do{
*--s = (i % radix) + '0';
i /= radix;
}while (i>0);
if (neg) *--s = '-';
printf("%s\n", s);
return 0;
}
なるほど! ありがとうございます!
45 :
デフォルトの名無しさん :2011/10/27(木) 02:54:22.19
42 は sprintf を唱えようとした! しかし 42 は呪われている! MP が足りない!
charの配列であれば char sz[]="abcd"; sz[2]='_'; の様に書きえることが出来るのですが、 charのポインタの場合、どの様すれば書き換えることが出来るのでしょうか? char* psz="abcd"; psz[2]='_';/*エラー*/
47 :
デフォルトの名無しさん :2011/10/27(木) 03:49:50.86
書き換えちゃらめ。 前者はcharの配列が用意されて、その中にabcdっていう4つの文字(文字列)が入ってる。 後者はabcdという文字列リテラルへのポインタ。 文字列リテラルは文字列と違って定数なので変更できない。
>>44 ,45
sprintf使ったらscanfで読むのと同じになるじゃん。
最初からscanfを使わない事から、多分何か理由があって使わないのかなと考えただけ。
え゛っ char sz[]="abcd";と char *sz="abcd";って どっちも'a'の格納されているアドレスが szという変数に入るから、あとは読み書き 自由なんじゃないの?
>>49 昔は、環境によっては
char *p = "abcd";
に対して
p[2] = 'x';
などとするのは可能な場合もありました。
しかし
>>47 のとおり、文字リテラルを書き換えることができない場合もあります。
できないことがあるのだったら、
char a[] = "abcd";
a[2] = 'x';
と書くのが無難です。
だれか規格引用よろ。
> 可能な場合もありました。 > できない場合もあります。 情報量0だな。
motto興味深いネタ振ってくれよ
あ、ここ俺に聞けスレだったゴメン
JISのサイトはAdobe Readerを最新版にすると閲覧できんからなぁ かといって最新版にしないとセキュリティホールがあるし… まったく改善しようという気配が見られない所がさすがJIS。
(const char []){"abcd"} == "abcd" ってんだから格納してあるリテラルを書換えたら整合性なくなっちまうのは当然
>>46 文字列リテラルの型はconst char[]なので書き換えてはダメ。
>>49 >>51 DOSの頃はメモリ保護をしていないので書き換えることができた。
しかし文字列リテラルはread onlyで有ることを期待されて、最適化しても良いので、
同コード内の別の"abc"が同じ領域を割り当てられることが有り、その場合誤動作
してしまう。
>>37 fork()したら同じページがCoWとかでマップされてんだろうけど、
exec()したあとはついてこないでしょ。
タイミングはOSとかランタイムの実装によるんじゃないの?
>>55 それは流石に、Adobe Readerの問題だろ。
60 :
デフォルトの名無しさん :2011/10/27(木) 14:34:14.89
5が出るまで数字を入力して5が出たら5以外の数字の最大と最小値を出すプログラムを教えてください
ファイルの読み込みで、 fgetsや、getcなどを使うと、読み込めるまで待ちますが、 読み込み待ちを行わない方法はないのでしょうか? 何がしたいかと言うと、デバイスファイルの接続先の機器が固まることがあり、 一定間隔でファイルを読めない場合は、固まってるので、機器の初期化実行後、再度読み込みを開始したいのです。
スレッド
>>60 最初に5を入力したら、どうなるのが良い?
65 :
デフォルトの名無しさん :2011/10/27(木) 14:49:43.75
>>55 買えって言ってる行間が読めないか?
/* あのぼったくり価格を肯定したくはないが */
66 :
デフォルトの名無しさん :2011/10/27(木) 15:56:30.82
>>63 最大最小は無いと出れば問題無いです
>60 5以外の数字の範囲は? マイナス値が入力される可能性は?
最大値記憶用変数にINT_MIN、 最小値記憶用変数にINT_MAXで初期化(型により臨機応変に)。 数値入力→入力が5ならループ抜ける→最大値、最小値と比較して保存orスルー→入力に戻る ループ抜けたあと、最大値、最小値に変化が無い or 最小値>最大値 なら "最大最小は無い"と出力
69 :
デフォルトの名無しさん :2011/10/27(木) 16:16:20.44
1] 授業単元: 画像処理
[2] 問題文(含コード&リンク): bmp、jpg形式の画像の輝度値を表示させるプログラムを作成せよ
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc opencv
[3.3] 言語: C
[4] 期限: 2011年10月29日まで
[5] 以下のURLの画像のような、元々の白黒画像を白と黒の輝度値を表示した画像に変換したいのですが、どうしていいか
全く分からなくて、困っています
http://mcm-www.jwu.ac.jp/~physm/buturi07/robo/genri02.html 画像だけ載せることができればいい課題なので、最悪このような事を行えるソフトウェアがあればいいのですが
ネットでたくさん検索を行ったのですが、私の浅知恵のせいか、よく分かりませんでした
ヒントだけでもいいので、よろしくお願い致します
>>69 その画像を、pgmのテキスト形式で保存してテキストエディタで開く。
pgmのテキスト形式で保存できるツールは例えばIrfanViewやImageMagickがある。
ついでに言えば、スレ違い。
5人の学生の成績(100点満点)の値をキーボードから読み込み,それらの平均点と分散(標準偏差の二乗)を求めるプログラムを作れ。 授業の課題です。。。 全然分からないんで解説付きでお願いします。
74 :
46 :2011/10/27(木) 17:48:03.44
皆様回答ありがとうございます。 char* sz="0000000000"とあるのを"0000111111"に変更したいと思い、 質問させていただいたのですが、解決方法はchar sz[]="0000000000"しかない、 と言うことで合っていますでしょうか?
>>74 sz="0000111111";
もできるさ
2パターンだけなら75のようにポインタの値変える方が楽じゃね?
unsigned long int b =0; b ^= 63; これで。
78 :
デフォルトの名無しさん :2011/10/27(木) 18:41:57.69
byte b;
79 :
デフォルトの名無しさん :2011/10/27(木) 19:08:09.53
forを使って 増加比率5.2 の 人数52人のクラスのN年後を予想することってどうすればいいでしょうか?
p <- 52 for i in N p <- p * 5.2
82 :
デフォルトの名無しさん :2011/10/27(木) 19:27:13.82
一年の増加率が1、6%の62人のクラスのN年後の人数を出すプログラムの作り方を教えてください
84 :
デフォルトの名無しさん :2011/10/27(木) 19:32:37.11
visualC 使ってるんですけど、デバックなしで実行すると指定されたパスが見つからないって 出るときがありできないんですけど、解決法はありますか?
>>84 指定したパスをここに書くと、解決しそうな予感
86 :
デフォルトの名無しさん :2011/10/27(木) 20:34:05.92
>>83 ですけど
今度は人口のプログラムで何年後に人口比率が1,6%の時に
人口が80億になるかを図るプログラムを作っているのですが
何となくこういう感じで作ってみたのですが
うまくいきません
どうしたらいいでしょうか?
#include<stdio.h>
#include<math.h>
int main(void)
{
int n,a;
for(a=0;a<n;a++)
a=560000000*pow(1.016,n);
if(a>=10000000000)
printf("%d",i);
return 0;
}
>>86 intであらわすことができるのは大抵42億まで。
long long int使え。
>>86 int a = 10000000000;
printf("%d\n",a);
違った、±21億だ。 doubleでもいいぞ。
92 :
69 :2011/10/27(木) 20:47:35.78
>>70 >>71 スレ違い失礼しました、どこで聞くべきでしたかね?
ありがとうございます、アスキーコード形式で保存したところ
無事に輝度値の数値化に成功しました
ただ、どこがどの輝度値を表しているか分からないので
そこは自力でなんとかしてみたいと思います
授業で何かプログラム組めって言われたんだけどアイデアが浮かばない…
94 :
デフォルトの名無しさん :2011/10/27(木) 21:06:08.71
#include<stdio.h> #include<math.h> int main(void) { long long int a; for(a=0;a<n;a++) a=560000000*pow(1.016,n); if(a>=10000000000) printf("%d",n); return 0; } こうしてみたのですが どうしたらいいでしょう?
そんなコンパイルも通らんもんどうしろと。
96 :
デフォルトの名無しさん :2011/10/27(木) 21:16:26.16
#include<stdio.h> #include<math.h> int main(void) { long long int a; int a; for(a=0;a<n;a++) a=560000000*pow(1.016,n); if(a>=10000000000) printf("%d",n); return 0; } 人口のプログラムで何年後に人口比率が1,6%の時に 人口が80億になるかを図るプログラムを作っているのですが 何となくこういう感じで作ってみたのですが うまくいきません どうしたらいいでしょうか? 全然上手くいかないです
#include<stdio.h> #include<math.h> int main(void) { long long int a; int n; for(n=0;;n++) { a=560000000*pow(1.016,n); if(a>=10000000000ll) { printf("%d, %lld\n", n ,a); break; } } return 0; }
ループまわすならpow()使う必要はない。 int main(void) { double a = 560000000; int n; for (n = 1; ; n++) { a *= 1.016; if (a >= 10000000000.0) { printf("%d, %f\n", n ,a); break; } } return 0; }
>>96 1.6%ずつで、56億→80億に何年かかるか、なら
#include<stdio.h>
int main(void)
{
int c=0;
double a=56;
while (a<=80) {
a*=1.016;
c++;
}
printf("%d",c);
return 0;
}
実行結果:23
100 :
デフォルトの名無しさん :2011/10/27(木) 21:37:23.29
人口を整数で数える人と、浮動小数点で数える野郎は、別人種
>>100 本質的でない所に拘ってると、伸びないよ。
自作プログラムのGUIを作りたいのですが、手始めにメッセージ表示から始めたいと思ってます。 ・関数として書いてあるforループ内の動作上のメッセージをウィンドウ中に表示させる というのをやろうと思ってます。 ボーランドのC++スターターで試してみると簡単に作れるのですが、PCはVC++経験のみの私には 操作が分かりずらいのと、GUIライブラリ(?)充実版は高価でにっちもさっちもでした。 VC++で再挑戦したいので、この程度をカバーしているお勧めの本(英語でも可)やサイトを ご存知でしたら教えてください!
いまさらネイティブAPI呼ぶとかマゾだな Gtk+やQtがおすすめ
>>96 int n=ceil(log(1.0e+10/5.6e+8)/log(1.016));
分かりずらいの時点でガキ確定だな
日本語って大事だよね
正式なドキュメントなら、うるさく言ってもいいけど、ネットの匿名掲示板でそんな事言ってもな・・
>>102 >GUIライブラリ(?)充実版は高価で
VCの方が高価だと思うんだが…
文字列リテラルの書き換えに関しての規格を引用します。 一応、また俺流の訳を載せておきます。 最初の文は、おそらく、 char *p = "abc"; char *q = "abc"; のような場合、必ずしも p != q であるとは言えないということだと思います。 6.4.5 String literals 6 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined. (文字列リテラルにより初期化される)これらの配列が、適切な値の要素を持っているならば、 これらの配列が各々異なるものであるかは特定されない。 プログラムがこのような配列の変更を試みると、動作は未定義である。
同じ内容の配列が個別に提供されるかどうかは決まっていません。 そのような配列を修正しようとした場合のふるまいは未定義です。
111 :
デフォルトの名無しさん :2011/10/28(金) 12:59:50.48
てーことは、p[2]++; によって p[2] == 'd' になることは保証されるわけか p != q であっても関係ないわけで
>>111 そもそも書き換えられないからダメ。環境によっては領域外アクセスで終了する。
仮に書き換えられる環境だとしたら、
p[2] == 'd'であると同時にq[2] == 'd'となるかもしれないということ。
でもリテラルはリードオンリーのページに配置される事が多いんじゃないの?
>>113 昔ゃそんなメモリ管理なんてなかったんだよ。つーか、今でも組み込みだとないこともある。
それはそうと、>109は同じ文字列のみに限定しないと思う。
例えばchar * p = "abc"; char * q = "bc";とするとq == p + 1になった。
>>115 組み込みならなおさら、ROMに置いたりするだろ。
117 :
デフォルトの名無しさん :2011/10/28(金) 13:34:03.10
110==113なわけだが。 110は超訳してみただけだよ。 英語に関しては超絶アホだから間違ってるだろうけどね。
昔VC6だったかgccだったかわすれたが char *a = "abc"; a[1] = 'd'; printf("abc"); でadcと出たことがあったなぁ。
ttp://codepad.org/h9te8C0w char *p="abc";
printf("%s\n",p);
p[1]='-';
printf("%s\n",p);
-----出力-------
abc
abc
----------------
ROM上に配置?
振る舞いは不定なんだから不定。それ以上でもなければそれ以下でもない。実に単純。 やっていいかどうかじゃなく不定。「プログラマは何でも知っている」がCの原則。 不定な結果が欲しいからプログラマはそうするのであってコンパイラはそれに従うのみ。
122 :
デフォルトの名無しさん :2011/10/28(金) 16:13:54.54
int i;
>>120 "abc"は .rodata に配置される。
で、上で言ってるのは "abc" という文字列が2箇所にあったとき それが同じ文字列か違う文字列かは内緒、という話。
>>120 *p を p[] に変えてみれば、挙動の違いと意味をよく理解できるはずだ。
>120 C machineで実行したら abc a-c と出力されて、TestM()を2回実行すると abc a-c a-c a-c と出力された。 環境依存だな。
未定義だから実装の都合で好きにして良くて、 ポータブルなコードを書くためには特定の実装の動きを仮定したらダメよって事。
Unix勉強してるんだけど、Unixで離れた端末をリモートで操作できるって いってるけどこれ異常に凄くないですか? 端末が起動してなくても操作できるんですか?
常にスタッフがスタンバってるからな
130 :
デフォルトの名無しさん :2011/10/28(金) 20:47:15.11
>>129 ネットワークってUNIXの場合無線は無理ですか?
おk
132 :
デフォルトの名無しさん :2011/10/28(金) 21:06:31.67
電波はどうやって飛ばしているの?
最大値の求め方について教えてください。 配列の最大値を求めたくて 下のプログラムを作ったのですが,うまく動作しません。 for( maa=1 , qxr = qxxr[0] ; maa < 10; maa++) { if( qxr < qxxr[maa] ) { qxr = qxxr[maa]; qxxxr = maa; } } printf("最大のq*rは%dのとき%f\n",qxxxr,qxr); 最大のq*rは0のとき0 と表示されるのですが間違っているところがわかれば教えてください。 配列は下のような感じです. qxxr[0]=40.800000 qxxr[1]=41.600000 qxxr[2]=0.000000 qxxr[3]=0.000000 qxxr[4]=40.000000 qxxr[5]=0.000000 qxxr[6]=0.000000 qxxr[7]=40.000000 qxxr[8]=0.000000 qxxr[9]=0.000000
>>128 その辺のパソコンもリモートで操作できるよ。
起動してなくてもという点についてはネタなのかどうかわからんが、マジックパケット投げてから操作すればいい
135 :
デフォルトの名無しさん :2011/10/28(金) 21:18:21.88
>>134 思うんですが、個人同士のパソコンで、遠くにいる相手のパソコンを動かす
時にそのパソコンが起動しているのって不自然じゃないですか?
思うに、Unixとかの場合は何百台のパソコンが一つの特定の場所(オフィス)
とかに存在していて、その場所に存在する管理者の制御の元で起動しており、
遠く離れた人がそのパソコンにアクセスできるような状況が自然だと思うの
ですがどうでしょうか?
>>135 unixはもともと高性能サーバーを中心に据えて、複数の低価格端末で共有利用する仕組みだよ。
>>135 前段 操作したいパソコンは起動していないのが自然ってこと?なら前述のとおり。
後段 起動してるなら操作できるよ。
どこが疑問なのかがわからん。
>>136 逆。
そういうのがイヤだからUNIXが誕生した。
139 :
デフォルトの名無しさん :2011/10/28(金) 21:26:30.85
>>137 操作したいパソコンが起動していなくても、管理者が遠地のクライアントの
アクセスに対し端末を開放するのは自然だと思います。
でも、個人同士で、例えば机の引き出しに眠っているUnix搭載PCが起動せずに
リモートで操作される何てあり得ないじゃありませんか?
起動していても操作される何てあり得ませんが。
>>139 よくわからないが、君が勉強している本には起動していない端末を操作することができる、と書いてあるのかい?
それに、管理者が開放するってのは、管理者が電源をわざわざ入れているってことかい?
142 :
デフォルトの名無しさん :2011/10/28(金) 21:34:46.01
>>140 良く分からない・・
でも、遠隔操作されているパソコンってどんな状態なんですか?
画面付いてゴースト人間が操作してるみたいな感じになってますか?
とりあえず、スレ違いだからどっか逝け。
WindowsってNT 95〜7までありますけど、C言語に対応していないシリーズって ありますか?
145 :
デフォルトの名無しさん :2011/10/28(金) 21:39:51.97
日本語って難しいなぁ。
>>142 そっからかよ。
広義の話をすれば2chに書き込んでる時点で2chのサーバを遠隔操作してるわけだが。
>>146 でも2chの場合は、巨大サーバだから情報を発信できるし、プロバイダも
あるから個人からもアクセスできると思うんです。
Unixってしかも20年くらい前ですよね?Unixは通信が便利というけど
技術的にそんな高いんかと。
後Unixのネットワーク系はインターネットなんですか?
VPNとか聞いた事ありますが。
>>147 C言語スレに来るような人なら普通は知っているものだけど、
インターネットはUNIXから生まれた。
今もネットワーク機器はUNIXで動いている。
WindowsやLinuxでも同様のことが出来るけど、UNIXの足元にも及ばない。
特にWindowsはダメだな。
って言うか俺がインターネットの設計者だったりする。
当時3歳だったが、その国の日常語なら5分で理解する天才なのでね。
日常語 めし、風呂、寝る
ネットワーク機器は独自OSかLinuxが多そうだけど。
>>147 君のパソコンも世界に情報を発信できるし、世界の個人ユーザからアクセスされることもできるよ。
多分だけど、適当に仕入れてきた情報をまだ理解できてないんだと思う。
で、なんでこのスレでそれ聞いたん?
>>148 マジか!?
インターネットの父ってこの前死んだんじゃなかったっけ?
天国から?
>>150 ルーターやプリンタはnetBSDが多いって聞いたな
テレビやBDデッキはlinuxが多いみたいだけど
>>151 アクセスするにはそういう契約が必要では?
Unixの場合は、Unix同士、契約している端末同士のネットワークでしょ?
もし自由にアクセスできるなら、パソコン侵入し放題じゃないw
ファイル共有ソフトのキンタマウイルスとかそういう以前の問題じゃないw
>>152 彼は13歳になる前に死んだんだよ。。。
>>152 DMRのことかな。インターネットの父ともいえるけれど。
ちなみに村井さんはご健在だった。もしかしてと思ってちょっとあせった。
>>155 そういう契約ってなんぞ。
現に俺は今自宅じゃないところから、自宅のPCで起動しているJaneを使って書き込んでいるよ。
>>157 じゃぁ何で君は俺のPCに侵入できない?
>>158 リモートデスクトップでぐぐってきてくれ。
/dev/heaven
>>154 安いルータとかはLinuxが多いらしいじゃん。
Ciscoなんかは独自OSだよね。
>>157 そりゃ自分のPCには遠くから自分で操作できるのも何か可能っぽい感じはするよw
>>150 ,153
ネットワーク機器、特にルータならCisco(IOS)が主流だよ。
やっぱりここは答える方も初心者なのか?
よく分からないなら書き込まなけりゃ良いのに…
>>162 ああ、UNIXシステムはどこの馬の骨とも知れない人が適当なマシンを操作できると思ってたの?
クラックすればできるだろ。 つーか、UNIX/インターネットの世界ではそれは常識(だった)
>>164 家庭用の範囲である程度かじった程度なんじゃないのかな。
IOSってiPhoneの!?ってなりかねんよw
>>166 いや無理だと思うけど、君らが可能っぽい体で反応したからさ・・
サブネットすらなかった時代の話か?
なりかねないから独自OSって書いたんだよ・・・
>>167 クラック、クラックっていうけど具体的手法いえる奴ほとんどいないな。
不正アクセスっていう言葉は良く聞くけど、それはログインできるサーバ
にIDとパスを不正に取得して入るとかそういう意味のアクセスがほとんどだよね。
>>169 質問をまとめようぜ。んで、くだ質に行っちゃいなよ。
アルゴリズムとデータ構造っていう台の本めっちゃ多いんだけど どれも同じような内容しか書いてなくないですか? ソートならクイックだのマージだの・・シェルだのシェーカーだの 知ってるし・・って感じです。 もっと多く知りたいんですが・・
もくじというものがあってだな
>>174 同じような内容だからタイトルも似通ってるんじゃね?w
ttp://ja.wikipedia.org/wiki/QNX > QNXのシステムは非常に小さく、フロッピーディスク1枚に納まってしまう。そして非常に高速であり機能的にも完備されている。
> 1990年代中盤、Quantum社は市場がPOSIXモデルに素早く移行しつつあるのを見て、カーネルの互換性を高めるための書き換えを決定した。
> そしてリリースされたのが QNX 4 である。
> 同時に QNX 用のX Window Systemも用意された。QNX 4 ではUNIX用ソフトウェアの移植が容易となり、
> Cisco の IOS-XR (IOSの新バージョン)は QNXベースである。
UNIXの定義
現実には、UNIXは以下に示す4種類の条件をひとつでも満たすOSを指す言葉として使われている。
1.UNIXの商標を管理する団体The Open Groupより、同団体が定義したSingle UNIX Specificationを満たすことの認証を受けたOS。
2.ベル研究所で開発されたオリジナルのUNIX及び、オリジナルのUNIXの派生OSとしてベルの認可を得た過去のOS。
3.オリジナルのUNIXを起源にもつOS。
4.POSIXなどのUNIXに関連する規格をみたす、UNIX互換なOS。
4で判断するとLinuxもIOSもUNIX
かなとおもったけど違うか。
>>174 そんなお前にはこれが最適。
The Art of Computer Programming
>>178 さんきゅー
日本語版もあったw
ゲーム作りたいんですよねー
ゲーム作るのもアルゴリズム考える力必要ですか?
>>179 トイプログラムのうちはアルゴリズムを余り知らなくても組める。
やって面白いゲーム作ろうとすると、色々盛り込みたくなる。
問題は、処理時間がかかるようになつたり、コード量が増えて修正の手間が増え、バグ発見が難しくなること。
適切なアルゴリズム→処理高速化、再利用出来るコード→見通しのいいコードが理想だが、「適切なアルゴリズム」を選ぶためには、まずは当然アルゴリズムを知っておく必要がある。
この辺は鶏と卵の関係だから、高度なゲーム作りにトライしつつ、アルゴリズムの本とかを漁る事にぬると思う。
>>179 まず着手するのが手っ取り早いです。必要な知識は作っていくうちにおいおいわかってくると思います。
>ゲーム作りたいんですよねー
うらやましいですね。「まず創めること」がなにより一番難しいんですよね。
本当にゲームを作りたいと思ってる奴は作りたいとか言う前に既に手を動かしてるよ
誰でもできることがなんでうらやましいんだ?
アルゴリズムとかデータ構造って分野によって独特なのがあるから、 一般的なのを沢山読むよりはやりたい方向に突っ走る方が良い気がする。
もちろん違う方面の手法がヒントになったりする事も多々ある。
ブログラマーは人口なの1%も居ないんだから、誰でも出来る事じゃないな。
は? >ゲーム作りたいんですよねー に対してだろ。 余命幾許もないってことなんかな。
乱数に頼らない成果物を作るならアルゴリズム大事だよね 早打ちスーパー囲碁みたいな思わぬところに乱数使うのは別として
なんのこっちゃ。
>>189 確率的アルゴリズムはそれだけで一大分野だよ
>138 分散処理と混同してないか?
>>138 VAX11とかの頃はまだVT100とかのダム端末いっぱいぶら下げてみんなで使ってたんだよ。
質問者はタンパク質計算やSETIのような一つのコンピューターが多数のコンピューターを操作することを想定したのかな? とりあえず「UNIXカーネルの魔法」読んどけ。
当時Multicsに関わっていた人々の一部がUNIXシステムの開発に移行した。 表面上、UNIXはコマンドの命名法まで含めた多くの領域で Multics の影響を示している。 しかし設計思想は全く異なっており、可能な限りシステムを小さく保とうとしていた。 つまり、Multics で最も問題と思われた部分で違いを見せたのである。 "Unix"という名称(元々は「Unics」)は「Multics」からの連想である。 Multics の M が「multiplexed」(多重化)であるのと逆に、UNIX の U は「uniplexed」(単一化)だと噂された。 より現実的で直接的な手法を選び、Multicsを否定した設計者の思想がにじみ出ていると言えよう。
ワークステーションが流行った後も、サーバ+沢山のディスクレスorデータレスWSっていう組み合わせはけっこう一般的だった。
ttp://www.wizforest.com/OldGood/OS/#multics MULTICS
...
高価なコンピューターを、1台で何台分にも使うことの出来るこのシステムは非常に注目されます。
...
UNIX
...
AT&T はMULTICS の開発が失敗に終わりそうだと見るとすぐに撤退を決めました。しかし、AT&Tから参加していた Ken は、
MULTICS に未練を感じていました。
なぜなら、彼は MULTICS で作成した「宇宙旅行ゲーム(Space Travel)」を非常に気に入っていたのです。
MULTICSプロジェクトから撤退してしまった今では、あの面白いゲームが遊ぶことが出来ません。
...
彼は、ゲームのために MULTICS のようなシステムを PDP-7 で作ることにしました。
しかし、MULTICS ほどのものは必要ありません。どうせ趣味なのですから。
そこで、彼は MULTICS のなかから気に入った機能だけを選び出して、小さな一人用システムを作り上げ、UNIX と名付けます。
UNI とは、「ひとつの」という意味で、MULTI の対義語でした。つまり、このシステムは MULTICS のパロディ版なのです。
...
その反面、複数人数で使うためのセキュリティ機構などは無視された作りとなっていました。
もともとゲームが遊べれば十分でしたから、セキュリティなんて不要なのです。
しかし、この UNIX システムは、彼一人で使うにはもったいないシステムでした。
彼は快く仲間の研究者にシステムを開放します。
彼らのグループはこのシステムに手を加え続け、十分実用になるシステムに育て上げます。
そして、セキュリティは甘いながらも、結局複数人数が同時に使えるシステムへと発展を遂げるのです。
何スレかと思った
linux板にしようか、こちらの板にしようか迷ったんですが、 こちらで聞きます。 jpegファイルをCで読み込んで、mjpegのAVIファイルの作成をしたいいです。 色々みてると、AVIフォーマットはそれほど難しくなさそうですが、 わかりやすいHPを見つけられません。 jpegtoaviというオープンソースPGを落としてコンパイルしてみたのですが、 なんかうまく動かないです。引数の問題? うまく動かせた人いらっしゃいますか? また、1から実装するとして、わかりやすいHPないでしょうか?
JPEGは複雑だからライブラリに頼るしかないだろうね
>>200 こういう話題になると調子に乗ってクソ長い書き込みをするおっさんどもは困るねw
それも大概はググったら簡単に出てくる内容でつまんねーし。
どうも的を射ないレスをしてるからなぁ。 おっさんじゃなくて実際に触ったことないお子様なんじゃないの?
実際にコード付きの質問されても、本当に初歩的なことしか答えられないからな。 宿題程度の質問と、こういうCと直接関係ない話題なら馬鹿みたいにレス付くのにね。
実務経験がないけれど、勉強したことが懐かしくて居つくのかな。 まあ俺もたいしたレスはしてないが。
プログラマーって実際どんなことしてるんですか?
>>208 そんなスレが。。。
ありがとうございます。移動します。
では。
210 :
デフォルトの名無しさん :2011/10/29(土) 02:23:45.89
openCVに画像を連結して動画にする能力があるぞ
>>Gtk+やQtがおすすめ 作成にあたって、Qtを試したことがあるけど、自分には分かりづらくて資料が相対的に少なく挫折しました。 主観で Qt:無料、資料が少ない、分かりづらい、高環境、高デザイン BC++:外販ライブラリ高め、資料一応ある、分かり安い、低環境、低デザイン VC++:MSDN(?)問題外に高いし必要ない、資料豊富、普通の分かりやすさ、高環境、普通デザイン だった。 Gtk+ってQtと関連してたと思うけど、まだ触ってないので、これから試してみます。
>>211 レス番アンカー位しとけよ
こんなとこでスレ違いの質問してる糞みたいな初心者の意味不明のIDE評価なんて要らん。
>>211 Qtは知らないけど、
>MSDN(?)問題外に高いし必要ない
MSDNオンラインで何か不満でも?
個人的にはVCLがわかりやすくて好きだった。
MFCは触りたくないが、今ならC#で.NETを操作する方が良いのでは?
全般的にどういうものを作りたくて評価しているか不明。
VC++でどういう点が不満になる?
それで使いたい外販ライブラリって何?
どっちにしてもWindowsプログラミング板に行くべきかな。
初心者の人って大抵説明が足りないよね。 "何が分からないのか分からない"レベルは論外としても 自分が使っているツールや参考にしてるページなんかの説明もせずにいきなり質問する人が多い。 こちらに読心力を要求するような難度の高い質問もあるしw
ちゃんと説明できる能力があれば、自分でなんとか出来ちゃうからな
ちゃんとしてるレベルの質問って逆にこのスレ住人が答えられる範囲を超えてて、全くレスが付かなかったりするからなぁ
レベルっていうよりはメンドクサイんだろw
>>218 えーっ、個人でMSDNサービス購入するって話?
VC++という製品の話と全く繋がらないのだけれど。
今から製品レベルの開発をするのなら、BCBの選択はありえないし、
外販ライブラリ(input manとかスプレッドシートなどかな?)
といい、どういうレベルで話をしているのかさっぱり見えないが。
221 :
デフォルトの名無しさん :2011/10/29(土) 13:48:54.74
>>214 それがいやなら回答者の立場で質問(聞け)スレへ来るなよ、迷惑な偽善だ
M$ のインシデント対応でさえ客にイミフはつきものと理解しているのに
回答義務のない者がそこまでガタガタ言って何になる
>>221 プログラムをお勉強中の人間の質問と、お客様質問室へ寄せられる質問と同列に語るなよ。
質問のしかたが気に入らない、出された情報が不完全、そう思うなら、答えなければいい。
だから答えてないんだろ
>>219 質問者がまともにアンカーつけてないので迷走してるけど多分
>>102 >>103 >>211 の流れだと思うんで、やりたいことは自作アプリ用のGUI作成みたい。
所謂コントロール部品のことをGUIライブラリとか言ってるからややこしくナットル。
ただ、ポトリペタのRAD開発をやりたそうでもあるので、そこら辺を明確にしろと言いたい。
ついでにスレ違いとも…
>>225 >>102 をよく読んでみると、API使ってウィンドウ表示させたいんじゃなくて、
単にテキストボックスみたいなのに文字列を表示させようとしてるだけみたいだな。
227 :
デフォルトの名無しさん :2011/10/29(土) 14:38:57.05
>>227 いまだにM$だなんて書いてる奴だもんな
無視しとくのが一番と思う
キャリッジリターンで行頭に戻れるとのことで、 printf("Apple\r"); usleep(2000000); printf("Orange\r"); usleep(2000000); printf("Grape\n"); としてみたのですが、最後の結果が「grapee」となってしまいます。 「Grape」のみ、正しく表示させるにはどのようにすればよいのでしょうか。
>>229 printf("Grape \n");
printf("Grape\x1b[K");
>>232 エスケープシーケンスってNT系のコマンドプロンプトじゃ使えないんじゃないの?
あれってなんで使えなくなったのかなぁ・・未だに理解不能。
235 :
229 :2011/10/29(土) 16:04:00.14
つまり、前回表示分以上の文字で上書きすればよいということですね。 ありがとうございました。
system("clear")して書き直せばいいだろうが
>>232-234 ,236
(質問者が環境を提示していないのに)特定の環境に依存した回答するなよ。
238 :
デフォルトの名無しさん :2011/10/29(土) 17:47:16.81
>>233 使えるぞ
何せ「エスケープシーケンス」だからな
俺の環境だとバッファがフラッシュされなくて最後の Grapee しか見えんけど
アヒィン変換とはなんに使いますか?
いろいろ
それがききたいです
主に、図形を移動させたり回転させたり拡大縮小したり歪めたり。そんな事。
>>240 ゲームの3DCG処理や人工衛星の姿勢制御とかに使える
245 :
デフォルトの名無しさん :2011/10/29(土) 20:36:46.35
次のような線形変換、ただそれだけ。 y=ax+b ここにaは行列、x,y,bはベクトル
#include <stdio.h>と<time.h>と<stdlib.h> #define ALLCARDS 52 int card[ALLCARDS]; void shuffle(){ srand((unsigned)time(NULL)); for(i=0; i<52; i++){ do{ rand()を使って0~51の乱数を生成してカードを指定 }while( フラグが立ったカードだったらやり直し ) 使ったらカードにフラグを立ててマークしておく } } int main(){ int i; for(i=0; i<100; i++){ //関数shuffleを呼び出してシャッフルされたカードデッキを作成 //手札のカードを5枚抽出して出力 } return 0; } 文字数の関係で大幅に省略しましたが、こんな感じでトランプカードをシャッフルして山札を生成し、 その中から手札5枚を抽出して表示するという行程を100回繰り返すプログラムを作りました。 ですが1回あたりのループにかかる秒数が1秒を大きく下回るので、srand((unsigned)time(NULL));で生成されるシードが 毎回同じになってしまい、結果、生成される手札のカードも毎回同じになってしまいます。。。 どうすればいいのでしょうか?どなたか分かりましたら助けて下さい・・・
>>246 srand は一回だけ呼ぶようにすればおk
>>247 おおおおおお、なるほど・・・!!
0で初期化したグローバル変数を適当に作ってshuffle関数の呼び出しの度にカウントが1増えるようにし、
値が0の時だけsrand(ry)を実行するようにしたらうまくいきました!!
素早いヘルプほんとうに助かりました・・ありがとうございます!!
>>248 いやmain関数で一回だけ呼べばいいじゃん
250 :
デフォルトの名無しさん :2011/10/29(土) 22:04:55.52
集合で、条件を満たす部分集合の数を数える計算をC言語でやりたいと思ってます。 例えば3個の要素からなる集合{a,b,c}でa,b,cは0〜24の任意の数をとるとします。 また一方で{0+i,3+i}(i<=24,i++)のものをredと定義します。 そして、{a,b,c}の中で部分集合{a,b}{b,c}{c,a}がすべてredであるような{a,b,c}の数はいくつであるか計算する方法を教えてください。
すれ違いなので他のスレで聞いてください
252 :
デフォルトの名無しさん :2011/10/29(土) 22:28:31.52
すいません。了解しました。
宿題スレに投げるべきなのかわかんないんですけどコッチで質問してみます #include <stdio.h> #include <stdlib.h> #include <string.h> char *getstr() { char buf[100] = "test"; return buf; } int main() { int j=0; char *s; while(j++<5){ s = getstr(); printf("%s\n", s); } return 0; } 5回、"test\n"が出力されるのを期待してるんですけど第一回目の 出力が私の環境(Linux+gcc)だと0x04になります。原因は何なのでしょうか?
>>254 ローカル変数のアドレスを返してるからじゃろ
残りの4回がtestって表示されちゃうほうが問題
>>255 ローカル変数だと何故マズいんでしょうか?
また改善策としては何があるのでしょうか?
グローバル変数にしちゃうとchar *getstr()と意義が無くなりそうだし…
static付ければいいが、ローカルだからスコープ抜けると破棄される
スコープの問題でしたか。全く思いつきもしませんでした
>>255 ,256,258
ありがとうございます!
スコープというよりエクステントの問題
テンソルにすれば問題ない
264 :
デフォルトの名無しさん :2011/10/30(日) 00:27:50.93
テンソルって、一言でいうとどんなもの?
テンキーみたいなもの
行列の一般化
影響
>>254 >5回、"test¥n"が出力されるのを期待してるんですけど第一回目の
>出力が私の環境(Linux+gcc)だと0x04になります。原因は何なのでしょうか?
この疑問に「直接」答えると、
printf() が一番最初に呼ばれるときに初期化の処理でスタック領域を使って、
getstr() 内の buf が割り当てられた領域を壊すから。
二度目以降はそれが発生しないから buf の内容が壊されない。
ちなみに自分の環境では -O3 を付けると「うまく」動きましたw それはなぜかというと...
最適化optionですよね。自分の環境では今度は改行が5つしか表示されなかったのですが 「うまく」ってこういう意味…?
271 :
デフォルトの名無しさん :2011/10/30(日) 11:22:46.02
ポインタなんですが int *pでなくとも int* pでいけると聞きました。 下のほうがしっくり来るので 常に下で書こうと思うのですが何か問題はあるでしょうか?
>>271 int* a, b;
と書いたときに勘違いしなきゃいいけどな
>>270 環境超依存な話をしているので違う環境で違う動作になっても不思議ではない。
C言語としての正しさも超越してるしねw
ちなみに自分の環境では-O3にするとwhileループのアンローリングとgetstr()の
インライン展開が行われて、 文字列の領域がつぶされずに済んでいる模様。
なので、もしここら辺を制御するコンパイラーオプション(インライン展開の方が本質的)
があったら使ってみるといいかもw
>>269 Macだと
$ gcc -Wall -ansi main.c
main.c: In function 'getstr':
main.c:7: warning: function returns address of local variable
$ ./a.out
$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
こんな感じに*sに何もない。こんなのは処理系依存で、これに何かを期待しても無意味では?
あるサブルーチンを実行中に 返り値の格納先が指定されているかどうか判断する方法ってありますか?
ポインタの参照/逆参照はpascal風になってた方が分り易かったよね。
int i
windowsでdllを作る場合、cとc++どちらが楽ですか?
インタフェース部分だけCで書く 他は何で書いても良い
>>278 言語自体はもう習得済みならその言語で作れ。
CとC++どちらが楽かと聞かれればC
>>274 >これに何かを期待しても無意味では?
馬の耳に念仏を唱えても無意味ということですね、わかります。
■32bitCPU ■アドレス空間も32bit ■Byte単位でのメモリアクセスが可能 以上の条件で、アドレス0x800000番地と0x800001番地の各ビットを全て1にするプログラムを記述せよ。 課題でもらった問題なのですが、解けずに困っています。 そもそもC言語って、こちら側でアドレスを指定していじることが出来るんでしょうか? ご助力願います。
unsigned char *p = (unsigned char *)0x800000; p[0] = p[1] = 0xff;
#define X (*(volatile unsigned char *)0x800000) #define Y (*(volatile unsigned char *)0x800001) int main(void) { X = 0xFF ; Y = 0xFF ; return 0 ; }
285 :
デフォルトの名無しさん :2011/10/30(日) 13:46:40.27
bus error
VC++を利用してDLLを作る解説サイトってありませんか? 当方Hello Worldを返すところからのレベルです
>>283 、284
レスありがとうございます。実行してみたところ、
2行目、値を代入する部分でエラーが起こりました。
でも、ポインタ型でキャストすればアドレスの代入はできるんですね。
>>288 普通の環境ではエラーになるのが正しい。
組み込み用途とか、OSのカーネルなんかでデバイスがメモリにマッピングされてるような状況では
アドレスを直接指定したアクセスが必要。
カーネルつうかデバイスドライバか
>>289 そうだとしたら、実行してエラーが出てもコンパイルさえ通ればOKなのかもしれませんね。
書き換えていいかどうか分からない番地を書き換えるのは、恐いです。
>>275 全般的に何言っているか不明。
「返り値の格納先が指定されている」ってどういう状態の事を言ってる?
戻り値の方がvoidでは無い関数なら、関数コールしたときに戻り値用の領域を
実行系が確保してくれる。だから戻り値の型がvoidかそうでないかを見れば良い。
そういうことを言っているのか?
294 :
デフォルトの名無しさん :2011/10/30(日) 15:16:42.16
>>292 それ問題文の欠陥だな
1 を書き込むと 0 になるポートとか実際あるし (負論理とかでなく)
WCHAR text[1000];WCHAR *tp; while (fgetws(data, 1000, fp) != NULL) { /* スペース.を区切りに文字列を抽出 */ tp = wcstok( data, L"()" ); wcscat(text,tp); while ( tp != NULL ) { tp = wcstok( NULL,L"()" ); wcscat(quetext,tp); } とすると 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 と出ます。どうすればいいでしょうか?
できました!ありがとうございました!
charを何回か使った後に何も入ってないような状態にするにはstrcpy( charhairetu , "\0")で良いのでしょうか? zeromemoryとかメモリ系の関数がいくつもあるようなのですがどれが良いでしょうか?
memsetでいいよ
299 :
デフォルトの名無しさん :2011/10/30(日) 18:56:57.33
ありした
>>299 strcpy()でいいよ。
単にstr[0] = 0; でもいいけど。
>>289 >普通の環境ではエラーになるのが正しい。
単純に 0x800000 あたりが書き込めるような環境だったらとりあえずエラーにならないと
思うけど、そういう環境は「普通」じゃないということですか?
302 :
デフォルトの名無しさん :2011/10/30(日) 22:46:54.24
文字列から文字を抜き取りたいんですけど sscanf( moji , "a-z 0-9A-Z,;" )みたいに wscanfで(moji,L"あ-ん ;、。亜-和")みたいにするにはどうすれば良いですか?
ライブラリ使う
すいませんちょっとボケてました ”あいう かきく 赤医”みたいな文字列を一つとして抜き出したいのですが どうすれば良いでしょうか?間にスペースと文字が何個あるかわからないけど最初と最後は日本語で終わります
何言ってんだお前。 そのままで文字列1つじゃないか。
なに言ってるのかわかんね L"あいう かきく 赤医" ってのがあって結果が const wchar_t* hoge[3]; hoge[0] = L"あいう"; hoge[1] = L"かきく"; hoge[2] = L"赤医"; みたいになりゃいいの?
>>301 勢い余って書いちゃったけどメンドクサイから訂正しなかった。
実際は、
・そのアドレスが書けないような場所ならその場でエラーになる。
・書けるけど何かに使われてるところを爆撃したのなら、後から予期しないエラーの原因になる。
・書けて、特に使ってないような場所を爆撃したのなら、特に何も起こらない。
そんな感じでよろしいでしょうか?
構造体で struct all{ int a; char *b[128]; } みたいな感じに書くことってできる?
できますが何か?
>309 できないと思った根拠が知りたい
>>310 じゃあこれを例えばscanfとかで引用するときはどう書けばいい?
>>311 いや、こんな感じのプログラム組んでてちょっと詰んだからどうすればいいのかと思って
普通に書けばいいだけ。
314 :
デフォルトの名無しさん :2011/10/31(月) 00:11:44.23
>>308 未定義・・・ですらない
アプリで好きにやってちょ、の一言
#include<stdio.h> struct data{ int num; char name[128]; char *sub[128]; }; int main(int argc, char *argv[]) { struct data all[50]; scanf("%s", ○○); //sub[128]で文字列受け取り printf("%s", △△); //scanfで受け取ったものを標準出力 return 0; } みたいなプログラムだったら○○の中には何を入れたらいい?
>>312 >scanfとかで引用するときは
引用ってなんじゃ?
エスパーすると、とにかくscanfの引数に型を合わせる必要があるので
struct all{
int a;
char *b[128];
} hoge;
scanf("%s", hoge.b);
だな。
317 :
316 :2011/10/31(月) 00:23:27.72
書き込んでいるうちにレスが、、。 あれ、よく見ると文字列格納したいメンバの型がちょっと変。 struct data{ int num; char name[128]; char *sub[128]; // → char sub[128]; }; が正解じゃない?ってか、char sub[128];のつもりで scanf("%s", hoge.b);って答えていた。 char *sub[128]; だったら all[0].sub[0] = "hoge"; みたいな感じ。
>>315 ポインタの配列に文字列を入れたいの?
型を間違ってるんじゃない?
char hairetu [20] void tukuttakannsuu(* m_hairetu){m_hairetuなんとかなんとか } どっかで tukuttakannsuu(*hairetu); これってちゃんとポインタを渡す効率の良い書き方になってますか?
No
>>319 へんな省略すんなよ。何がなんだかだぞ。
void func(char *p) { p[0] とかなんとか}
char a[20];
func(a);
こんな感じならよい。*hairetuを渡そうとしている時点で、相当な勘違いをしていると思う。
うぅ・・・
>>317 #include<stdio.h>
struct data{
int num;
char *name[128];
char *sub[128];
};
int main(int argc, char *argv[])
{
struct data all[50];
printf("出席番号を入力してください:");
scanf("%d", &all[0].num);
printf("名前を入力してください:");
scanf("%s", &all[0].name[0]);
return 0;
}
こういう感じってこと?
ポインタ配列に文字列は入れられないぞ ちゃんとポインタを理解しろ char sub[128];にして scanf("%s", all[0].name);だ
まちがえた char name[128];にして scanf("%s", all[0].name);だ
>>325 できたわthx
もう一つ質問なんだが
#include<stdio.h>
struct data{
int num;
char name[128];
};
int main(int argc, char *argv[])
{
struct data all[50];
printf("出席番号を入力してください:");
scanf_s("%d", &all[0].num);
printf("名前を入力してください:");
scanf_s("%s", &all[0].name);
printf("%d番 %s", all[0].num, all[0].name);
fflush(stdin);
getchar();
return 0;
}
ってしたら%sの部分が表示されないんだがこれは何で?
>>326 &all[0].name→all[0].name
配列名はすでにポインタだから
>>327 scanf_s("%s", all[0].name);
にしても表示されないんだが
#include<stdio.h> struct data{ int num; char name[128]; }; int main(void) { struct data all[50]; printf("出席番号を入力してください:"); scanf_s("%d", &all[0].num); printf("名前を入力してください:"); scanf("%s", all[0].name); printf("%d番 %s", all[0].num, all[0].name); return 0; } これでちゃんと動いたが?
>>329 ほんとだ…
scanf_s("%s", all[0].name); じゃ動かなかったのに
ググると scanf_s で char[] を処理する場合は配列のサイズを付けろって書いてあるね。 VC++使ってないからよくわからんけどw
>>327 ちなみに&を付けても同じアドレスを指すから、「一応」動くんじゃないだろうか。
確かに論理的に間違ってはいるけど。
打ち切り誤差ってなんですかー?^^
>>333 めんどくさいとかじゃなくて。なぜ_sを使うのかを見ないと。
バッファオーバーランしてもいいならいいけど。
>>332 一応じゃなく、動く。
#define TRUE 1 /*
>>305 */
#include <stdio.h>
int main(void) {
char c[100][80];
int zenkaku, field, item, k, lead, i;
unsigned char u[] = "あいう アイウ a-z0-9A-Z,; かきく 赤医";
for(field = 0, item = 0, k = 0, i = 0; u[i] != '\0'; i++) {
lead = u[i];
if(lead == ' ') {
if(field && zenkaku) {
c[item++][k] = '\0';
k = 0;
}
field = 0;
continue;
}
field = TRUE;
zenkaku = 0;
if(0x81 <= lead && lead <= 0xFC) {
if(0xA1 <= lead && lead <= 0xDF) continue; /* 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ */
zenkaku = TRUE; /* シフトJISコードのいわゆる全角 */
c[item][k++] = (char)lead;
if(u[++i] == '\0') return 1; /* 2バイトめが無いエラー */
c[item][k++] = (char)u[i];
}
}
if(field && zenkaku) c[item++][k] = '\0';
for(i = 0; i < item; i++) puts(&c[i][0]);
return 0;
}
>>336 そんな表現を弱めに書いたところをツッコまなくてもw
まあ、プログラム(の意味というかデータ型とというか)としては間違ってるんだし
「たまたま動く」とか言った方が適切ではないかと。
文字列を差してるポインタをポインタ演算で一文字ずつ前から削って行ったときに、 文字列が空になったのってどう判定すればいいんでしょうか? 例えば char *strptr = "ABCDE"; として,strptr,strptr+1,strptr+2・・・とポインタ演算の加算値を増やしながら出力していって ”ABCDE”→”BCDE”→"CDE"→"DE"→"F"→? 最後strptr+5になったところでとめたいのですが・・・
340 :
338 :2011/10/31(月) 05:01:20.46
言い忘れました strlenとかライブラリ関数を使って文字列の長さを測るのはナシの方向で・・・
338じゃなくて339でした 失礼しました
for(i = 0; *(strptr + i) != '\0'; i++) printf("%s\n", strptr + i);
344 :
デフォルトの名無しさん :2011/10/31(月) 05:39:59.58
ポインタについてわからないことがあります。 コンパイラはgcc4.4.5を使用しています。 char str[3][4] = {"abc","def","ghi"}; char (*ptr)[4]; ptr = str; printf("%s\n",ptr + 1); printf("%s\n",ptr[1]); printfで文字列を表示させたいときはprintf("%s\n",文字列の先頭アドレス) とすればいいんですよね? printf("%s\n",ptr + 1);がdefと表示されるのはわかるのですが なぜprintf("%s\n",ptr[1]);でもdefと表示されるのかわかりません。 ptr[1]は*(ptr + 1)と同じだから printf("%s\n",ptr[1]);のptr[1]は先頭アドレス の中に入っている内容(def\0)をアドレスとして見てしまうと思うのですが・・ よろしくお願いします。
疑問に思うべきことが逆
>>343 ありがとうございます。
すみませんもう一点、文字列の一文字目を比較したいのですが
strncmpはナシで
str1[0] == str2[0]みたいに配列として添字指定するのもナシで
何か方法ありますでしょうか?
348 :
デフォルトの名無しさん :2011/10/31(月) 06:50:26.58
>>345 >>346 *pをp[]のように変形出来るのって引数でのみでしたっけ?
プログラミングをやるの久しぶりで今手元にポインタ関連の本がないので
もし指摘していることとまったく違うこと言っていたらすみません。
>>348 ptr[1]はchar[4]型だから問題無し
ptr[1][0]だと'd'をアドレスとしてみるからマズイかな
>>342 お前みたいな奴は
>>342 のようなレスを考えてるかもしれないとか思って
あらかじめ
>>338 に「データ型」とか書いてやったのに、本当にそうきたかw トホホ。
351 :
デフォルトの名無しさん :2011/10/31(月) 08:35:24.93
>>349 ptrはcharへのポインタ変数なのにptr[1]はchar[4]型・・?
だめだ、知識が足りないぽいです。
本屋行ってきます。
>ptrはcharへのポインタ変数なのに 違います
>>351 例えばchar str[4];とした場合、strの型はchar*型でなく、char[4]型。
もし、これがchar*型なら、char *str;と同じになってしまう。
配列とポインタは違うものだという認識はお持ちだとは思いますが。
実行文の中では、char[4] → char* の変換をCが自動的に頻繁に行うので、
char*型だと錯覚しやすいです。
倍精度実数を == で比較したいんだけどどうしたらいいかな。 みんなどうやって銀行丸めを実装してるんだろうか
355 :
デフォルトの名無しさん :2011/10/31(月) 10:39:39.42
>>354 +0.5してfloorと-0.5してceilが食い違ったら偶数の方を採用
でいいんじゃないの?
==でもいいんじゃないかな?
銀行丸めの特別な処理ってその時だから
char[4]型って言い方、普通なの?
要素が4つのchar配列型っていうよりは。
すみません。C言語をかじり始めたばかりなのですが borlandC++compilerが計算してくれません。どこか間違ってるでしょうか。 #include <stdio.h> int main(void) { int souhin1,kazu1,souhin2,kazu2,daikin,money,oturi; double tax; syouhin1=198; kazu1=1; syouhin2=138; kazu2=2; money=1000; tax=1.05; daikin=(int)((syouhin1*kazu1+syouhin2*kazu2)*tax); oturi=money-daikin; printf("お釣り%d円\n",oturi); return 0; } 1本198円の清涼飲料水1本と、1本138円の牛乳2本を購入し、 千円札で払った場合のお釣りを求めよ。 ただし、5%の消費税を追加し、お釣りの額は整数とする。
souhin
yがない
>>362 ありがとうございます!
まったくyが抜けてるなんて気付きませんでした。。。
366 :
デフォルトの名無しさん :2011/10/31(月) 15:31:04.15
int n=0;
>>350 成り下がることが理解できているのにデータ型が云々言ってるからだめなんじゃないか?
>>361 てかローマ字ならoturiじゃなくてotsuriだし、
kazuもkosuとかkosuuとかのわかりやすい表現使った方が誰が見てもわかりやすいしいいよ
369 :
デフォルトの名無しさん :2011/10/31(月) 16:01:45.92
動画編集のapiとかありますか?
charポインタとchar配列とstringの関係を猿にもわかりやすく教えてください
charポインタとchar配列とstringの関係を猿にもわかりやすく教えてください
化学を専門としていて、最近C言語を勉強し始めた者です。
分子の状態密度という物を計算するために以下のようなプログラムを作りました。
しかし、for文が多くて見ずらく、他の分子への応用が効かないため
もっとシンプルなプログラムに書き換えたいのですが、初心者なもので良いアイデアが浮かびません。
具体的に言うと、下記のプログラムの様に〜量子と分けずに
何量子であっても計算できるようなプログラムを書きたいです。
皆さんの知恵を貸して下さい。
化学のスレッドで質問しようかと思いましたが、こちらの方が
よい解答が得られると考えこちらに質問させて頂きました。
スレ違いでしたらすいません。
ぜひ解答お願いします。
http://ideone.com/VvSFK
面倒だから細かく見てないけど、再帰関数にすれば?
375 :
デフォルトの名無しさん :2011/10/31(月) 18:24:06.41
>>373 化学が専門なら、haskell覚え直した方が良いんじゃ無いか?
速度が気になるならhaskellコンパイラにcのソース吐かせてcコンパイラでコンパイルすれば良い
378 :
デフォルトの名無しさん :2011/10/31(月) 18:49:26.38
strcmpが二つの文字列を比較するものであることは理解しているんですが !strcmpだとどういう考え方になるんですか? 二つの文字列が同じではない場合に0を返すってことであってますか?
>>373 再帰呼出に書き換えたら所要時間6倍になったw
C言語の環境だとCygwinとかborlandとかあると思うけど、ゲーム作るなら JavaのJDKとどっちがいいですか? JDKの場合グラフィック関係が最初から豊富な感じのイメージなんですが。 ゲーム製作関係のスレって過疎ってるんですよねー・・ 2chってクリエイティブな人少ないの?すいませんね・・
cygwinとかborlandでゲーム開発してるやつ見たこと無い
383 :
デフォルトの名無しさん :2011/10/31(月) 19:07:39.27
384 :
デフォルトの名無しさん :2011/10/31(月) 19:08:53.48
>>378 違う
!strcmp は常に 0
printf("%d", !strcmp);
>>381 gcc+OpenGLで作られたゲームならlinux環境に腐る程
vc+DirectXで作られたゲームならwin環境に腐る程
>>384 if (strcmp(a, b) == 0) { 〜 } と
if (!strcmp(a, b)) { 〜 } は同じ。
追加。
>>384 わかってるくせにアスペみたいな事書いてもしょうがないだろ。
388 :
デフォルトの名無しさん :2011/10/31(月) 19:18:31.99
>>386 お察しの通りifの条件式での!strcmpの扱いについてつまづいていたのでようやく分かりました
ありがとうございます
ほんとに助かりました‥‥
390 :
デフォルトの名無しさん :2011/10/31(月) 19:30:29.23
豚切りすんません 入力された整数が偶数なら2で割って、奇数なら3倍してから1足す これが1になるまで繰り返すっていう内容なんですが、 #include<stdio.h> int main(){ int n,count,s; count = 1; s = n/(count*2); printf("自然数を入力して下さい。:"); scanf("%d",n); if(n == 1){ printf("1\n"); }else{ for(;s == 1;count++){ if(s % 2 == 0){ printf("%d÷2=%d\n",s,s/2); continue; }else{ printf("%d×3+1=%d\n",s,s*3+1); continue; } } } return 0; } 動きません・・どこをどう直したら動きますか? お礼は弾みます
>>390 どこから突っ込んで良いのか。。。
取り敢えずnが初期化されてない
forじゃなく、whileを使え
それ以前にもう一回cの入門書やり直せ
>>391 forで書けという制約付きでして(´;ω;`)
初学ですみません。。
393 :
373 :2011/10/31(月) 19:42:51.10
>>374 >>376 >>377 >>379 >>389 皆さん返信ありがとうございました。
特に377さん、389さん、わざわざプログラムを書いて頂きとても勉強になりました。
もっと勉強して自分でも書けるようになりたいと思います!!
また何かあれば質問するかもしれませんがその時はよろしくお願いします。
>>392 一行一行、自分が何を意図しているのかコメント入れてみてよ
>>380 まともなwindowsゲームを作成したいならVC++がオススメ
expressならタダだしね
最近のゲーム機は大体対応してるからプロも使ってる人が多い
(流石にexpressじゃないけど)
396 :
デフォルトの名無しさん :2011/10/31(月) 19:55:15.90
>>393 fundumental が常に 0 以上であるという保証があるときに限り
>>389 のソースコードを
if(bxx_index>depth)
↓
if(freq>=max) return;
if(bxx_index>depth)
のように書き換えれば(48行目に挿入)すれば元よりも早くなるよ
>>394 #include<stdio.h>
int main(){
int n,count,s;
count = 1;
s = n/(count*2);
printf("自然数を入力して下さい。:");
scanf("%d",n);//*nを入力
if(n == 1){
printf("1\n");//*1が入力されたら1表示してオワリ
}else{
for(;s == 1;count++){
あれ?自分でも訳わからんくなってきた・・・
>>396 そっちあたりやす
すれ汚しすんませんした。。
言語はjavaのほうがCよりいいんじゃないの? ゲームって部品集めて作るんじゃん。オブジェクト志向のjavaが適しているよね。 最初から一本筋で作らないでしょ。Cの場合ある程度一本道じゃん。
>>401 C言語って複雑な処理も全部一気に作らないとだめじゃないですか。
Javaの場合、少しずつ、少しずつ作れるでしょ?クラスごとに作るから。
403 :
373 :2011/10/31(月) 20:10:08.33
>>397 確かにすごく早くなりました。
ありがとうございます!
Cはオブジェクト指向ではないが、オブジェクト指向プログラミングはできるぞ
>>402 Javaでクラスごとに書いても、きちんと分割して設計できてないと結局同じ
逆に、ちゃんとした設計ができてれば、Cで書こうがJavaで書こうが「少しずつ作れる」
まあオブジェクト指向にしやすくなってるのはJavaだけどね
*.hと*.cのペアをクラスであるものとしてプログラミングすればそれでオブジェクト指向プログラミングになる
>>407 それだけでオブジェクト指向プログラミングになれば、苦労はしないよ。
Javaだとクラス定義が必須になるが、だからといってOOPらしい
プログラムになるかは、また別の話。
例えばJavaやC#で全てをクラスフィールドとかにしていると、それはもうOOPとは言えない。
とりあえずマルチプルインスタンスが扱えるようになってれば、OOPらしいとは
言えるかも。
>>408 >>402 だが見方してくれてありがとう、やっぱゲーム作るのはJavaかC#しかないんだよな・・
ファミコン、スーファミはアセンブラだし ゲームボーイはCやぞ PSはC++なんかな JavaやC#では碌なゲームは作れないと相場が決まっている
言語がオブジェクト指向の枠組みを提供してるほうがOOPしやすいのは当然だが そうでない言語でも「複雑な処理も全部一気に作らないとだめ」なんてことはない
>>409 お前さん何か勘違いしているぞ。
私は
>>402 は的外れだと言っている。
Cでもモジュール単位でプログラムが可能。OOPも不可能ではない。
少なくともOOP的な設計は十分できる。
JavaやC#だからといってOOPに沿ったプログラムが出来るわけじゃない。
常にヘボは恐ろしいプログラムを書く。言語は関係ない。
それがわかっていないお前さんは危ないぞ。
>>412 >JavaやC#では碌なゲームは作れないと相場が決まっている
それは作るゲーム次第。描画の速さやレスポンスが問題にならないなら
JavaやC#でもいいんじゃないの。ノベルゲームとか、ポーカーとかなら。
アクションゲームやシューティングなら低レベルAPIが使えないと、
まともなゲームになりそうにないな。XNAってC#やVBで実用的に使えるんだっけ?
まぁ普通はVC++使うんだろうな。
Javaで作ったゲームっていうと 携帯アプリぐらいしか思いつかんな C#は・・・まったく知らん 何かC#で作られた多少なりとも有名なゲームってあるのか?
417 :
415 :2011/10/31(月) 22:14:02.16
XNAってdirectXの薄いラッパーだと思っていたら、.NETのAPIだったのね。 それなら、C#が一番のおすすめになるわ。 .NETで実用的な速度が出るくらいハード、ソフト環境が整ってきたってことか。 それなら富豪的アプローチでOK. いい時代になったもんだ。 ※完全にCの話ではなくなっているね。
jpegライブラリのソースなんかPoor man's object-orientedとかいって、 Cだけで書いてるのにめっちゃオブジェクト指向だぞw
419 :
デフォルトの名無しさん :2011/10/31(月) 23:08:37.46
> 常にヘボは恐ろしいプログラムを書く。言語は関係ない。 まさに アセンブラで構造化じゃないコード書いてたときに絡んできた元 COBOLer と 恐ろしく希薄な議論(口論)にくたびれ果てたことがある ダミーセクションなんて序の口で無条件分岐だけで作る再帰や SVC 風のシーケンスとか 読みもしないで自説を一方的に喚くだけで、邪魔以外の何者でもなかった 「何を考えることができるかを決められ凝り固まった人」の相手は特別手当ほしい
難読なソースコード書くと、自分って何て複雑な思考ができるんだと 思いますが・・プログラマーの性でしょうか?
421 :
デフォルトの名無しさん :2011/10/31(月) 23:16:36.24
ポインタのポインタってなんだよ ポインタのポインタじゃなくて普通にポインタ使えよって思っちゃうんだけどなんでポインタのポインタなんかあるの?
ポインタのポインタも普通にポインタですよ
>>417 directXのラッパーであってると思うが。
.NETのコード部は遅いが、unsafeで書かれた部分はそうでもないってことでしょ。
>>421 int main(int argc, char **argv)
425 :
デフォルトの名無しさん :2011/10/31(月) 23:24:13.09
>>422 *p
*(*p)
これって結局指し示してる場所は同じなんだから*pでよくね?って思っちゃうんだよ!なぜか!
426 :
デフォルトの名無しさん :2011/10/31(月) 23:28:18.94
じゃ *p も p でいいことになるね
427 :
デフォルトの名無しさん :2011/10/31(月) 23:30:03.59
えっ
どうしても必要になるケースに出会ったたとしたらその時には必要性が理解できているってことだからそれまではいらないと思っておけばいい
429 :
デフォルトの名無しさん :2011/10/31(月) 23:34:15.30
>>428 そう、働かないとならないケースに出会うまでは働かなくてよい
#include <stdio.h> #include <stdlib.h> /* long int strtol(const char *s, char **endptr, int radix); */ int main(void) { char *p; long la; la = strtol("1234567890円", &p, 10); printf("la = %ld\n%s at p\n", la, p); return 0; }
435 :
デフォルトの名無しさん :2011/11/01(火) 00:18:55.14
EVC++3.0っていう古いコンパイラで (C++でなくC言語でコンパイルしてるからな念のため) setjmp(ErrorEntry) とすると変数ErrorEntryに値がセットされなかったが setjmp(Env) とすると変数Envに値がセットされた これってコンパイラのバグかな?お前らのコンパイラではどうなってますか?
minecraftがjavaでOpenGLでWin/Mac/linux キャラ等オブジェクトは真四角の小ポリゴン、デフォのテクスチャは粗い、 その分動きは細かく普通のマシンで充分速い、描画farは64bit環境推奨、mod大流行 とかがjavaの功罪か
おk?
>>392 んじゃあ
無限ループとして動くforの使い方
for(;;)
これを使って、後は自分で考えろ
>配列の配列のポインタとかで 1.(配列の配列)のポインタ 2.配列の(配列のポインタ) そもそも配列の配列とは?多次元配列?
>>425 *p
*(*p)
の評価結果は違うぞ。
pと*pが指している場所は違うからな。
>>440 1)char a[3][5];
2)char a[5][3];
3)char *a[5];
4)char (*p)[5];
5)char **p;
1)charの配列[要素数5]の配列[要素数3]
2char)配列[要素数3]の配列[要素数5]
3)charを指すポインタの配列[要素数3]
4)charの配列[要素数5]をさすポインタ
5)charを指すポインタを指すポインタ
>>440 配列とポインタは密接に関わってるから、どっちも正しい
まあ配列とポインタを同等にしたのがC言語の一番いい部分だからなあ 一番バグりやすい部分でもあるけど 他の言語でこれをしようとしたら例えばC#ではポインタが使えるが Marshallクラスがないと不便だし
>421 関数の戻り値が成否判定に使われてポインタを返して欲しいのに出来ないとき。 #define bool int BOOL xxx(void **Pointer){ ... *Pointer=malloc(...); ... return TRUE; } ... void *Po; BOOL b=xxx(&Po); ...
448 :
デフォルトの名無しさん :2011/11/01(火) 09:52:09.70
a[x][y] ↓ *(*(a + x) + y) じゃあこれもポインタのポインタってこと?! これならわかる!
int a; /*int型変数*/ int *pa=&a; /*int型ポインタ変数*/ int **ppa=&pa; /*int型ポインタのポインタ変数*/
*(*(a + x) + y) の記述だけからでは a が type a[][] なのか type (*a)[] なのか type *a[] なのか type **a なのか区別が付かない
a[][]っていうのは型としてありえるの?
452 :
デフォルトの名無しさん :2011/11/01(火) 11:43:41.14
ううううう 聞けば聞くほどわからなくなるからとりあえず頭の隅に押しやって発酵させてみるよ
ポインタ=ポインタ変数 ポインタ値=アドレス値 でいいのかな?
いいえ、変数でないポインタもあります。 また、実際のアドレス値がポインタの値とは限りません。
説明のハードルがまた一つ上がったな…。
まぁあれだ、ポインタとは文字通り「指し示すもの」だ。 で、ポインタの値とは当然「指し示す先」のことだな。 値としてポインタの値を持つ変数がポインタ変数であり、 特に必要がなければNULL以外のポインタの値は意識する必要がない。 まして今の大抵の環境ではアドレスがどこであるか知ったところで大して役に立たないしね。
環境変数のアドレスとか クラックするのに役立つよ
自分をクラック?
459 :
デフォルトの名無しさん :2011/11/01(火) 14:34:08.28
5が出るまで数値を入力した時に 入力された数列を最大値と最小値を入れ替えて左から順に並べた状態にするのはどうしたらいいでしょう?
460 :
デフォルトの名無しさん :2011/11/01(火) 14:43:14.91
秘密だよ
461 :
デフォルトの名無しさん :2011/11/01(火) 15:05:31.58
並び替えろ
何をするか書いといて「どうしたら」ってくると、さすがにめまいするんだな。勉強になったわ。
>>459 scanf("%d",&n);
a[n]++;
ポインタ*pを、指すポインタは**pなの?
ポインタが指す int型変数を指す時 int *pって宣言するのはどうして? どうせ関節参照してるとバイト数も必要になるのかな
void *p で宣言していちいちintにキャスト書いて使うのかい?
>>464 型(int *)のポインタを指すポインタなら、型は(int **)だね。
>>465 日本語でOK。
ポインタがint型の変数を指すときint * pと宣言する理由を聞いているのなら、そういう言語規約だから。
ポインタに型情報が必要な理由を聞いているのなら、デリファレンスするときにそれが必要だから。
「関節参照」とは何かは判らんが、ポインタが持っている情報はバイト数ではなくて型であることに注意。
勿論、型情報にはバイト数も含まれるがそれが全てではない。
>>462 な。
夕食にカレーライスを作ってほしいといわれたのですがどうしたらいいでしょう?
せめてカレーライスの作り方を教えてほしいとかいってほしいよな
日本語の不自由な人がいるみたいだな
>>459 レスの内容をそのままコードに置き換えるだけ
471 :
デフォルトの名無しさん :2011/11/01(火) 18:10:47.80
>>467 日本語って、おまえが言葉遣い変だよ
(int *)p はキャスト式で、「念のため」書いた括弧で意味が変わってしまう典型だ
int *p;
↑
これでは「まだ」 int 型のオブジェクトを指していないわけで
そんな理解じゃ
>>464-465 みたいな質問をする人の相手はできない
間接は正式な JIS X3010 用語でカタカナ表記してるおまえのほうが質問者よりおかしい
ポインタがアドレス以外の情報をいささかでも持つかのような説明も不適切
472 :
デフォルトの名無しさん :2011/11/01(火) 18:13:16.92
なんかかっこいいぞう
ポインタはアドレスのほかにそれが指す型の情報も持つんじゃ?
>>473 それはコンパイラが知ってるだけで、ポインタの値自体とは無関係では。
475 :
デフォルトの名無しさん :2011/11/01(火) 18:57:31.11
俺もそうだったがポインタでつまづく人は仕組みとか概念云々より「どこで使うか」ってのが解らない人が多いと思うんだよ 実際ポインタ使わないといけなくなる時が来たら理解できるようになるから安心しろ 逆にいえばその時が来ないならそれはポインタを使わなくてもできる事ってことだ 効率や速度は別として
>>475 まあその通りなんだけど、課題で指定されてるのも、よく見かける。
ジジ臭い話だけど、昔は初期の勉強のネタとして計算機のアーキテクチャみたいな話があって、 そのからみでアセンブラの初歩的なところはみんな通って来てたんだよね。 だから、スタックやらヒープやら、オブジェクトのメモリ上での表現みたいな話もわかるし、 ポインタなんかも自然に理解できた。 単純なコードなら、それがどんな雰囲気にコンパイルされるかも想像できたり。 昨今は抽象的なところから入っちゃうから難しいんだよな。 Cはあんまり抽象的な言語ではないのに。
(外部ライブラリがそう要求しているので) ● 挿入・削除の時間コストの都合で配列よりリスト構造を選択 ● 戻り値以外にいっぱい値を戻したいので、関数の引数経由で呼び出し元に伝える
セグるとは新しい
>>474 それは何か変だよ。
int *p;で宣言される変数pは、型「int型へのポインタ」を持つ。
なので、自分が指す先がint型であるという情報を持っている、
と言って良いと思う。
それにはコンパイラも実際の値も関係ないんじゃないかな。
で、ある瞬間にpが持っているアドレスにあるオブジェクトが
本当にintか、という情報は持ってない。
まぁ言葉遊びか。
>>480 ループの中の
test = (int* *)realloc(test,j*sizeof(int*));
いらないんじゃないの?
>>482 コンパイル時に決まる静的な情報だっていう意味で使った。
sscanfでthis is penをcharに入れるにはsscanf( moto, "%[a-zA-Z0-9 ]", ireru) とすればできますが 同じようにこれ は ペン ですを取得するにはどうすれば良いですか?
fgets
487 :
デフォルトの名無しさん :2011/11/01(火) 19:58:18.52
初心者の頃は「ポインタがわかってる奴はなんで分かりやすく教えてくれないんだよ!」 理解すると「こういうことだからだよ!としか言えないよ!簡単なことじゃんか理解してくれ」 どっちも正しいから責められない 単純なことなのに理解させるのが難しいから理解するのも難しい
リンクドリストを初めて知ったときにポインタの凄さを頭ではなく心で理解したな。ちょっとしたレボリューションだったわ
>>480 19行目の時点で、test[0], test[1], ... test[20] まで malloc() の返り値が入っている。
1回目の 23 行目(j = 1) で、realloc(test, 1 * sizeof(int *)); によりtest[0] のみ realloc() 後でも意味をもつが、test[1], test[2] test[3] ...... の値は胡散霧消したといってよい。
私の環境では偶然 test[1], test[2] の値は保存されていたが、test[3] 以降の値は 23行目の後でぐちゃぐちゃになっていた。
491 :
480 :2011/11/01(火) 20:22:55.73
>>491 とりあえず、自分がPCになったつもりで1行ずつ実行してみれば、
小規模なプログラムなら大抵のバグはつぶせるよ。
493 :
デフォルトの名無しさん :2011/11/01(火) 20:56:56.83
>>487 循環論法な説明しか聞けなくなったら質問か相手を変える機転がいるんだよ
初心者と先輩の差は常に一定ではなく逆転することがあるし
まったく逆転できないようであれば適性の問題かも知れない
次スレのスレタイは「C言語のことは僕に聞け」にしようず!
3Dアクションは全く興味がなく2Dアクションが作りたいです。 例えばマリオがジャンプするような動作をプログラミングで作れたら最高ですが、 結局プログラミングというより画力でしょうか?
2Dゲームも内部的には3Dで作るのが主流です
498 :
デフォルトの名無しさん :2011/11/01(火) 21:14:42.05
>>493 先輩は初心者に戻れないってことさ
分かっちゃうと「あれ、なんでこんなことで悩んでたんだろ」ってなっちゃう
そこで初心者とすれ違っちゃう
先輩であって先生なわけではないからそれは当たり前なんだけどね
自分がただ理解することと他人に教えるための理解はまた違うんじゃないかな
499 :
デフォルトの名無しさん :2011/11/01(火) 21:21:03.46
メモリマップトファイルについて質問させてください。 メモリマップトファイルを共有メモリ上のみではなく、ディスク上の実際のファイルにも適用したい場合、 文字列でしか使えないのでしょうか? たとえば、 PBYTE pbyte; hFile = CreateFile(省略,"C:\test.txt"); CreateFileMapping(hFile,省略); pbyte = (PBYTE)MapViewOfFile(省略) は、実際のディスク上のファイル(test.txt)にも、文字列を書き出せるため、成り立つことがわかるのですが、 構造体のようなデータ形を共有メモリで扱いたい場合、 typedef sturct{int i, char c, char }SHARED_DATA; SHARED_DATA *sData; hFile = CreateFile(省略,"C:\test.txt"); CreateFileMapping(hFile,省略); sData = (SHARED_DATA *)MapViewOfFile(省略) とした場合、実際のディスク上のファイル(text.txt)を利用したメモリマップトファイルは利用可能なのでしょうか? 文字列でないため、ファイルにどのようにデータが書き込まれるのかが理解できないため、どなたか解説してください。
>>497 確かにそれは分かります。
3D演算技術があれば2Dが映える感じしますよね。
ただ体は2Dがいいです。
むしろ体こそ・・・
3Dを目指すと、3Dそのものの仕様を実現するだけで時間かかりそうだし。 2Dだと基本が簡単な分【味付け】に力を注ぐのに多くを割きたい。 3Dは理的、2Dは工的なイメージが勝手にあるw
2Dのほうが簡単というのは幻想 理系脳なら2Dゲームでも3Dで扱ったほうが作りやすい
505 :
デフォルトの名無しさん :2011/11/01(火) 22:11:45.32
メモリーの使用量が全然変わってくるよ
背景やキャラ、オブジェクト、スコア表示 等 画面奥行き方向で管理すべきものが存在するんだから そこに次元割いても悪くないっしょ? わざわざ自前で奥から順に描画していく?
ゲ製行けよクズども
0==wcscmp(&ptr[i],L" ")で、半角のスペースがptr[i]に入ってるiの時でも全く反応しません どうしてでしょうか?
モデリングとモーション技術あるならいいけどね。
ptr[i+1] が \0 でないからじゃね? 部分一致じゃだめで完全一致でないと 0 戻さない
>>510 あぁ、面白そう・・
大学の授業じゃそこまでやらんだろうな・・
>>506 それは2Dの話ですか?
2Dなんて、基本的な事は誰でもできると思うので、そこから先の見栄えを
いかに機能を駆使して作るかですよね。
何も考えずに作ったら、ペラペラの切り絵が動いてるお芝居にしか見えないと
思うから。
ゲ製へ
>>421 そういえば、ポインタのポインタはメモリのコンパクション(≒メモリの整理整頓)に
使われることがある。
おおざっぱに説明すると、
例えば char **p, char *q, q = malloc(), p = &q; とすると malloc した領域は *p で
参照できる。ここで仮にシステムがメモリの内容の整理整頓をして q の値がそれに
伴い変更を受けても、p の値は変更する必要がなくかつ *p でメモリの内容を参照
できる。みたいな。
516 :
デフォルトの名無しさん :2011/11/02(水) 14:46:18.22
515.c(6) : declarator expected before * has instead `char'.
>>515 昔のMacOSのメモリマネージャはそれだった。
リロケータブルブロックをマスターポインタが指し、ハンドルがマスターポインタを指す。
システムは必要に応じてリロケータブルブロックを移動してマスターポインタを更新。
そんな感じ。
PalmOSも(MacOSを真似したから)同じ要領だったね。 今時はアドレスが仮想化されているからこんなややこしい仕掛けは必要なくなったが。
数字を反対に並び替えるよい方法はありますでしょうか。 51→15 149→941 7412→2147 という感じです
>>519 #include <stdio.h>
int reverse_num(int num)
{
int ret=0;
for(;num>0;ret=ret*10+num%10,num/=10)
;
return ret;
}
int main(void)
{
printf("%d\n", reverse_num(51));
printf("%d\n", reverse_num(149));
printf("%d\n", reverse_num(7412));
return 0;
}
GJ!
void rev(const char *p) { if (*p) rev(p + 1), putchar(*p); } int main(void) { rev("51"); putchar('\n'); rev("149"); putchar('\n'); rev("7412"); putchar('\n'); return 0; }
(^ω^) ( ) l l ↑縦20横30くらいのマップ上でこいつをキーボードのAを押せばジャンプして地面まで落下、 Sを押せばマップ上を右へ、Dを押せば左へ行くプログラム教えてください。
レスの内容をそのままコードに置き換えるだけ 特別な技術は必要ないよ
そうか? C言語という枠内で作るならちょっと無理かもね 環境依存であればあるいは
そこで curses の登場です。curses, 呪いですか‥‥‥。
>>519 なぜ、よりによってCでそれをやろうとするのか。。。。
haskellなどの関数型言語またはスクリプト言語でtoStringしてreverseでええやん
c言語でいまナウいフレームワークってなんですか
sprintfの仕様についての質問です char str[5]; sprintf(str, "%d", 1000000"); 上記の場合、エラーにならずstrに"1000000"が入るようですが strに対してrealloc等でメモリの再確保が行われているのでしょうか?
いや、エラーだよ。ダボルクォーテーションが対応してない。
あ、すみません。正しくは以下です。 sprintf(str, "%d", 1000000);
>strに対してrealloc等でメモリの再確保が行われているのでしょうか? してない。 けどchar str[5];なら8バイト確保してるだろうからかろうじてメモリ破壊は起こってない可能性がある。 char str[5]; char cBuf=1; とかやってるとcBufの値が書き換えられる可能性がある。
バッファオーバーランでちゅ
皆さまありがとうございました。 やはり危険なのですね。
sprintf_sとかあればそれで。
>>533 いや、その場合 cBuf には影響はないよね、普通。
char cBuf=1; char str[5];
codepad.orgだと>533 でも >538 でもcBufがstrの前に来たけど C machineだと>533 ではstrの5バイト後にcBufが来た。
おまえらQZ管理しといてくれよ…巣から出てたぞ。
http://hibari.2ch.net/test/read.cgi/linux/1312512594/ 1:上から目線で住人へ因縁付ける。
2:住人から完全論破される。
3:「またひとつ賢くなった」と捨て台詞
マジQZって、なんで、こんなに人を不快にできるの?
いちいちイライラさせるのは、何?素なの?嫌がらせなの?
linux板なのにnotepadとか例に挙げてるし、notepadと言いながらなぜか全員を見下して強気なQZ見てると、
痛すぎというか、見てるこっちが恥ずかしい気持ちになるし、論破されたら「”また”賢くなった」とか、いちいちイラつかせるし…マジ迷惑。精神的ブラクラだわ。
QZを巣から出すなよマジで。つーかモリタポスレで隔離しといてくれよマジで…不快すぎる。
またQの妄想癖が悪化してきたのか やれやれ
>>540 >linux板なのにnotepadとか例に挙げてるし、
linux板なのに「未チェックバッファ」というマイクロソフト用語を使っている点を遠まわしに指摘して
あ げ た
だけなのですが。
>マジ迷惑。精神的ブラクラだわ。
効果があったようでなによりです。
目的は達成されました。
>>543 >linux板なのに「未チェックバッファ」というマイクロソフト用語を使っている点を遠まわしに指摘して
どこがマイクロソフト用語だよ。
あ、回答は要らんよ。鬱陶しいから。
>>544 へえ?
じゃ、'unchecked-buffer' という単語がマイクロソフトのセキュリティパッチ名で言及されている以外の例、および
マイクロソフトのセキュリティパッチ名で使われている場合とそれ以外との場合との比率がを示していただければ、説得力のあるご意見になるかと思います。
>鬱陶しいから。
この単語こそ QZ の餌であることを、まだご理解いただけていないようですね。青いですね。
バカの癖に態度がでかい奴にムカつくのはわかるけど、相手にするだけ時間の無駄
>>543 1:最初から全て把握していた。じつは知っていた。
2:あえてnotepadと発言することで、暗に「未チェックバッファーはマイクロソフト用語だ」と指摘してあげていたのだ!教育してやった。
なにこの後出しじゃんけん。完全にこじつけだろ。無理ありすぎ。
QZって細かい嘘ばっかり吐くけど、なんなの?癖なの?
あぼ〜んがいっぱい。
>>548 >細かい嘘ばっかり吐くけど、なんなの?癖なの?
それがナルシストの最大特徴
自己矛盾を指摘されるのが大嫌いでそれを回避するためだったらどんな嘘でも平気でつく
しかも本人は嘘をついた事を全く自覚してないというからたちが悪い
せっかく NG にしてるのに反応でスレ汚すゴキブリ氏ねよ
と、Q本人がコテを外してファビョっております
割れ厨だとバレバレだしなあ いくら無職とは言っても犯罪を犯すなよな 朝鮮人みたいな事をすんな あ、もしかして在日チョン?
ゴキブリホイホイスレはここですか?
ゴキブリ本人に言われてもなあ説得力ゼロなんだが
俺もあぼーんしてるんでせめてQZって書いてくれ いくらなんでもQだけをNGにすると影響が大きい
win32apiでWNDCLASSEX構造体のhbrBackgroundに CreateSolidBrushで作ったブラシを格納した場合って DeleteObjectは必要?
それをここで聞くとは愚かな
CreateなんとかしたやつはDeleteObjectした方がいいと思うけど、たぶんスレ違いだとも思う。
環境依存云々じゃなく スレ住人のレベルがな・・残念 だが!ゆっくりしていってね!!!
本当に判り易いなぁ……
CreateWindowした時に背景を塗りつぶすのにそのブラシが使われるんだけど そのあとはだれも(゚听)イラネなので、Deleteしないと延々、デスクトップヒープを食っている。 アプリケーションメモリじゃなく、デスクトップヒープ(要するにシステムリソース)を食う。 デスクトップヒープはメインメモリよりもずっと小さいので 浪費するとあっという間に新しいアプリケーションを起動できなくなったり 起動はできたけどメニューが表示されないとか すげぇいい加減なバグを発生する(エラーにならないからすごい)。
>hbrBackground >The system automatically deletes class background brushes >when the class is unregistered by using UnregisterClass. >An application should not delete these brushes. だがスレ違い
Stringの最後から4文字を消したいんですけどどうすれば良いですか?
String?4文字とは?ちょっと例を書いてくれよ
s[strlen(s) - 4] = 0; こういうこと?
>>557 もちろん。C言語では確保と開放は常にセットだ
GetStockObject(WHITE_BRUSH)みたいな場合もちゃんと開放しないとダメだぞ
>>567 ストックオブジェクトって解放する必要あった?
もちろん開放しちゃダメw
みんな冗談で書いてる。
>>563 以外は全部ウソだからw
どれが本当なんだよ とりあえずWM_DESTROYで解放するようにしたんだけど・・・
>>548 本人様がわざわざ貼ってる
>>542 の流れを見れば、これが後だしじゃんけんであることは明らかだよ。
うそをつき始めると取り返しがつかない人生を送る好例。
573 :
片山博文MZ :2011/11/03(木) 21:28:48.70
俺sugeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee!
宿題スレに居座ればいいものを、あそこであおられてなんか知識つけなくっちゃ!ってなったのかどうかしらんが、 いろんなスレに沸いててますますうざい。
まあ void 程ではないな
おやおやQご乱心ww
学習用C言語開発環境ていう環境でキューの勉強やってるんだが QUEUESIZEを 1024*1024*20にすると容量が大きすぎるせいか処理できなくなる 1024なたいけたがキューがオーバーフローしてしまった web上で動かせるcodepadでやってみたがfgets使ってるから入力できない かといって開発環境いれるのめんどくせー web上でCの動作確認できるところないか
ふつうのコンパイラとメモリ確保の方法をふつうにすればできるよ
>>579 fgetsを代替関数に置き換えて、配列からデータ入力するようにしてみたら?
素数を求める式なんですが、素数で篩わける方法は単純だし実装が 簡単なのですぐできました。 そこでカーマイケル数のフェルマー判定で素数を求めたいのですが、実装はどうなりますか? なかなか難しくてよく分かりません。理論は分かるのですが上手くいきません。
よし、まずそのカーマイン数のフェラチオ判定とやらの理論を書いてくれ。 プログラムはわかるのですがうまくいきません。
>>585 すいませんw
フェルマー判定は、単純なmod≡0を示す数式で、カーマイケル数は
not素数であるのにも関わらずフェルマー判定からは陽が出る擬似素数の事です。
おれも適当な数の性質を決めて自分の名前つけちゃおうかな。
>>579 codepadは知らんが、ideoneなら入力も指定できるよ。
>>587 いやwww
素数判定のアルゴリズムだと思うのですが・・Wiki見てくださいよ。
カーマイケルを予約的にストックするならtime関数とかも使わないといけないから
擬似素数==カーマイケル数の条件配置が散乱しやすいんですよね。
エラストテネスの篩は、どこの参考書にも載ってて飽きました・・
この方法以外で素数を求めたいんですよ。
>>589 なんで俺らがアルゴリズムを調べにゃならんの?
C言語の質問に落とし込んでから出直せ。
>>589 フェルマーテストで非合成数 & (ストックしといたカーマイケル数でない)もの
を素数としたいって事?
time関数の必然性が判らない。
あと、Wikipediaのつもりなら正確に書いた方がいい。
フェルマーテストについては、Wikipediaのフェルマーの小定理のページの フェルマーテストっていう項目に、ほれプログラムしろっていう感じで書いてあるね。 おれはメンドクサイし無能だから遠慮しとくけど、この通りに書けばいいんじゃね?
非合成数である事を効率的に求めるのが一工夫必要なのは判るが、スレチだな。 宿題スレとかの方がいいんじゃないか?
インクルードファイルについて教えてください。 ソースファイルをコンパイルするとき、 インクルードファイルが無くても、ワーニングもエラーも出力されないが、 動作させると、異常終了する場合があります。 異常終了するプログラムに、ヘッダファイルをインクルードするだけで、 本文は触ってないのに異常終了がなくなります。 これはなぜですか?
>>594 プロトタイプ宣言があると型の変換をしてくれたりするから
>>595 そういう理由なのですか。
理由がわからず、一日無駄に調べてました。
ちなみにプロトタイプ宣言が無ければエラーを出すような、
コンパイル指定はできるのでしょうか?gccですが。
>>596 -Wall とかすればたくさん説教してくれる。
全部勝手に直してくれるオプションとかあればいいのに
できれば全部勝手にプログラミングして欲しいよな
昔Pascalコンパイラで、セミコロン忘れてるみたいだから足しといたわって言いつつ仕事続けてくれるのがあった。
言語処理系のフロントエンドで、 エラー処理は難所の一つ
書き込んでる途中で勝手に「ここエラーだから直すわ」とかで修正されるのはむかついた あとで一気に整形しながら書きたかったのに ってCの話題じゃなかった、ごめんぬ
んー。だめだ、プログラムは以下であってるような気がするが まったくうまく動かない。unsigned long int型 u がある場合、 u & 1 == 0 が常に false になってしまったりするぞ^^ u - 1 == u + 1 も常に false だし^^;;;;;;; bool isPrimeMillerRabin( unsigned long int p, int k ) { if ( p == 2 ) { return true; } // 2は素数 if ( p < 2 || !( p & 1 ) ) { return false; } // 2よりも小さいまたは(2以外の)偶数なら計算するまでもなし srand( ( unsigned )time( NULL ) ); // p - 1 = pow( 2, s ) * d, s > 0 において、最初の奇数dを見つける。 unsigned long int d = p - 1; while ( !( d & 1 ) ) { d /= 2; } for ( int n = 0; n != k; ++n ) { unsigned long int a = std::rand() % ( p - 2 ) + 1; unsigned long int t = d; unsigned long int y = modpow( a, t, p ); while( t != p - 1 && y != 1 && y != p - 1 ) { y = modpow( y, 2, p ); t *= 2; } if ( y != p - 1 && !( t & 1 ) ) { return false; } } return true; }
>>604 何を言っているのかさっぱり判らんが、srand()は乱数系列の初期化だから通常一回だけ行なえばいい。
つーか、乱数系列の種にtime()を使うと、1秒経過するまで常に同じ系列で初期化するのでrand()の値が一定になってしまう。
>>605 あ、いや、そこじゃなく、unsigned long intは値が大きくなると
なぜか正しく論理演算や真偽値判定ができなくなる( visual c++2010にて)ってこと
まぁ、intの範囲内なら正しく動くからいいかな、とw
っていうか、これは
>>586 が求めているものとは違うんだけどね^^;
ついに、カーマイケル数の意味がわからんかったw
>>609 `;:゙;`;・(゚ε゚ )ブッ!! ホントだw すまん。
611 :
デフォルトの名無しさん :2011/11/04(金) 01:48:54.13
>>602 難所であり、クリアしても特典がほとんどない、という無間地獄
C は諦めることから出発して成功した言語
BASIC とは方向性は違えど、この点では兄弟のようなもの
なんのこっちゃ。
>>602 は処理系を作る場合の話だろ。
半角文字列を入力し、各英数字の出現回数を調べる というC言語のソースを教えてください。 本気で困ってるんでお願いします。
宿題? if( str[i] == 'A' )A++; か counter[ str[i] ]++; みたいなことをグルグル回せばいいんじゃね?
>>611 Cは機械がやるべきさまざまな事柄を全部人間に押し付けてるからな。
i=i++が未定義とかホント人間様を舐めてるよな
アセンブラの代替だから仕方ないのでは?
>>618 ++演算子の副作用完了点がこの文の最後にあるため、果たして i に代入される値が
++する前の物なのか++した後の物なのかそこまで規定されていない
そこでこの書式そのものの動作結果を未定義とした
本当は結果が不定でもいいんだろうけど、そうしておくと誰かが使ってしまうので 事実上禁止したわけだろうな
実装の都合で好きにしてOKって事でしょ。
>>619 これってどうなるの?と聞いていればそれでいいだろうけど。
>>618 の何したいの?ってのは、
>>616 が当然だと思っている結果がどういうものなのか聞いてるんだと思うよ。
i = (0, i++); これってどうなん
>>623 これはいいだろ
副作用完了点が2つあり一つはカンマ、一つは文末のセミコロンで、カンマ演算子の
方が先に評価されるために i に代入される値は 0 と一意に決まる
え、なんで0に決まるの?
>>624 なわけねーだろ
カンマ演算子が返す値は最後に評価された値だぞ
だからこれも未定義
つまり i = (i++, i); これならきまるということ。
j = (++i, i); こういうことがやりたいのかと想像
カンマ演算子の有用さは異常
0は評価後カンマ演算子により捨てられる。 現在のiの値に1が加算され、iに代入される。 こんな感じで合ってる?
>>628 j = (i++, i); がしたいんじゃないの?ということなら、j = ++i; で何の問題もない。
ほかに意図があるのなら書いてもらえないか
未定義についてだろ。
633 :
デフォルトの名無しさん :2011/11/04(金) 15:19:37.02
>>616 機械がやるべきことは指令に忠実に動くことで
指令を間違えたら、むしろそのとおり間違えるべき
勝手に気を利かせる機械はかえって使いづらい
Int main みたいな某社の思想がその典型
>>618 その疑問が正解
イミフを文法上書けてしまうことを防ごうとしていないだけで
いやがる人はいるが、そいつらの言うとおりしてもロクなことになってない
言語の仕様を「機械」って呼ぶのはなんか抵抗がある自分
i = (A, B, C); って書いたとき、AやBで発生する副作用はカンマ演算子によって都度完了されるけど、 最後のCについてはセミコロンによって完了するってことなの? つまり、 A; B; i = C; と等価?
>>638 そう。
副作用完了点てやつだ。
もし、興味があれば規格書でも読めばいい。
p[i++] = q[j++]; p[i] = q[i]; ++i; ++j; 速度的にほぼ同じなら分けて書くほうがいいよね なんで1行で書こうとするん?
for 文の中とかマクロ定義とか・・・。
643 :
デフォルトの名無しさん :2011/11/04(金) 16:14:57.41
あと、K&Rだとそこまでは言及してなかった
JIS
途中送信しちまった… JISのページ、Adobe Readerを最新にすると見られないよな。 どうなってんの?
>>640 昔のCPUはそこまで1命令でできたりする方向に進化したりもしてたんだよ。
オプティマイザもあてにできない時代もあったしね。
まぁ昔話はいいとしても、1行で書いた方が見やすいしくだならないバグも
入りにくいってメリットもある。
>>642 ググって出てきても信用できない方ですか。
いろいろ大変そうですね。
>>648 ググって出てきても信用はできないだろ普通
650 :
デフォルトの名無しさん :2011/11/04(金) 18:11:49.80
for()の()は&&とか多様しまくって条件複雑にしても何とかなる感は異常
>>647 マイクロコード全盛だったもんな
今じゃ全部RISC命令に分解してから実行した方が速くなってる
ハードウェア化するにはその方が回路設計が楽になる
p[i++] = q[j++]; って鼻から悪魔飛び出したりはしないの?
しないよ。
>>652 i の繰り上げのタイミング、j の繰り上げのタイミング がクリティカルになってない
p[i++] = i; だと 右辺 i 参照前に繰り上げ〜右辺 i 参照後に繰り上げ
と完了点までの範囲内に自分自身が居る
655 :
デフォルトの名無しさん :2011/11/04(金) 18:35:32.02
ディディコングがローリングアタックするプログラムってどうなりますか? すいません前からここにいるドンキーコングオタクです^^;
単純にいってしまうと、
後置インクリメントは式の中で自分自身を2回使っちゃらめって覚えとけばとりあえず問題ない。
そして、
>>640 の疑問の通り、最近のコンパイラは賢いから、まさに一行で書く意味はないよねって
C++では普通に。
定義しちゃえばいいのにね
自分の趣味のコードなら好きに書けばいいけど、 他人がメンテするソフトはやめて欲しい。 いや、まじで。
うーん… だめだ、完了点とかよくわかってないからな JIS規格読んでこようと思ったら見れなかったでござる。
テンポラリを作らない分
>>640 の下のほうが効率がいいのでは?
「この時点でインクリメントしなさい」 とは定義してなくて 「ここまでにはインクリメントを終わらせなさい」 って定義してるのが完了点
>>659 買うと8万だかするんだよね。
JIS規格には著作権ないはずなのに著作権を主張してコピーさせないし。
挙句に最新のAdobe Readerだと見れない。
さすがは巨大な天下り団体。仕事しなさ加減は世界最高レベル。
20万個のアルファベット列(一列10文字以内)を昇順にクイックソートしたら0.8秒でした。 これ早いでしょうか?
>>663 それはいくらなんでも遅すぎじゃないか?
>>664 うそェ・・
strcmp使うしかないですよね?
ただ10年前からした考えられないだろうな・・・ 20万個のクイックソートでも一分くらいかかるんじゃないの?10年くらい前だと。 機種詳しい人教えて。
>>663 qsort と strcmp 使った方が早いんじゃね?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define WORD_NUM 200000
#define WORD_LEN_MAX 10
int main(void)
{
static char word[WORD_NUM][WORD_LEN_MAX+2];
long i, j;
for(i=0;i<WORD_NUM;i++){
for(j=0;j<WORD_LEN_MAX;j++){
word[i][j]=(rand()%26)+'A';
}
word[i][j]='\0';
}
qsort(word, WORD_NUM, sizeof(word[0]), strcmp);
for(i=0;i<WORD_NUM;i++) puts(word[i]);
return 0;
}
√3を1万桁求めるプログラム作ったけど、この場合は7分かかった。 遅いかな?1.73205081・・・・・・
>>667 20万要素もある配列宣言すると、スタックエラーでるでしょwww
heapから呼び出さないと。
>>662 見ようとしたら
X3010_01.pdf
15.9 MB (16,748,724 バイト)
MD5:9723FF3B1BD26AF5D5109BF57EC09E44
と普通に保存できたので
いったんローカルに保存してから
適当なビューワーで見ればいんじゃない?
>>648 ああ、何を言われてもググらないと心配になっちゃう方ですか。
お察しします。
>>670 よし、そのブラウザと詳しいダウンロード方法を教えるんだ。
いや、教えてください。お願いします。(´・ω・`)
>>666 ちょうど
>>667 的なコード作って試してみてたけど、i7-2600K 4.5GHzで
0.05秒くらいだね。
>>666 十年前だと PentiumIII がすでに出てたころだろ
CPU周波数が 500MHz、周波数効率が 0.3 とすれば
今のCPUの 150MHz 相当になる
メモリに全部のるなら
20倍程度の差しかでないんじゃね?
√は時間かかるよね 後eは求め方自体がわからんw 円周率は100万桁、たった10分で出力するプログラム作った。 FFT駆使したw、作るのに1か月かかったぜ・・
>>681 うん。そのファイル、最新版Adobe Readerじゃ読めないからw
>>682 Superπ104万桁なら8秒だが。@i7-2600K 4.5GHz
>>684 100万桁10分って、頑張ったほうですかね?
Cプログラム歴4年です。
円周率求めるのは数学的考察が必要だから、まぁまぁかな。
>>680 いーなー4.5GHz w
今2ch見てるノーパソ(Mac)で走らせてみたら、1万桁だとなかなか帰ってこない。
1000桁までは割と速いんだけど。これってどういうスケーリングだっけ?
>>682 >後eは求め方自体がわからんw
もしかして基本的な数学の知識もなくコードを書いているの?
あるわけないだろ。俺は生粋の文系プログラマで法学部卒だ。 この知識を生かして業務系のアプリ(RDBにデータを入れたり出したり集計したりするだけのプログラム)を 何十万行も書く不定期な仕事を何年か前にリストラされて以来のニートだからな。
素数って、桁数多くなるほど、素数間隔増えるんじゃないのかな? 間違ってる?
eは(1+x)^(1/x)かな。 むずいなww
>>690 x 以下の素数の数は、x/log(x) で近似できる。
らしいから平均間隔は広がる傾向にあるね
>>670 昔はキャッシュから引っ張ってこれたけど今はロックが掛かってて
ローカルコピーを見ても見れないよ
これと同じでC++11のJIS版も買うしかない
悪徳商法だとしか思えないよね。
でもどうせお前らJIS版の日本語貼ったら英語の原文で貼れとかケチ付けるもんな まあいいけど
√3 一万桁を開平方で求めたら 2秒くらいだった
原文を誰かが翻訳して、公開したらいいんじゃないの?
>>696 円周率は何で√と違って早く求めれるんだろ。
どっからそんな話が出てきたんだ?
700 :
696 :2011/11/04(金) 21:36:22.41
>>689 高校数学で習うけど、文系はやんないんだっけか
>>700 高速化しても1秒かー
100万桁だと1分40秒か
うーん、もっと早くならないかな?
お前ら√求めることってそんなにあるの?
>>700 mbi_sqrt()だけ計ったら0.4秒だった。@i7-2600K 4.5GHz
πの方が明らかにミステリーなのに √3ごときが膨大な時間かかるとかwww
膨大とか、どっからでてきたんだ?
>>709 円周率1万桁と、平方根1万桁だと後者の方が相対的に膨大な時間かかるんだよ。
そんなの使う漸化式の次数によるだけだろ。
713 :
デフォルトの名無しさん :2011/11/04(金) 23:21:26.23
int j=0;
>>691 極限値を数値的に求めるってかw
普通にe^xのテーラー展開でx=1にすればいいでしょ。
もっと収束の速い級数とかあるかもしれんがとりあえず。
たとえば斜めの棒 / の最初の点をA、最後の点をBとする。 Aの座標は、Xは10、Yは10だとする。 Bの座標は、Aに0.001だけ足した座標だとする。Bの座標は、Xは10.001、Yは10.001。 A座標とB座標の差は、Xの差は0.001、Yの差は0.001 このYの差を、Xの差で割ると、線の傾き(Xが1増える事に、Yがいくつ増えるか?)がわかる。 0.001 / 0.001 = 1
>>662 > JIS規格には著作権ないはずなのに著作権を主張してコピーさせないし。
「著作権ないはず」っていうのはどういう理屈なの?
Y座標は、2のX乗。という線 ノ の場合。 Xが3の時のY座標は Y = 2^3 = 8 Xを0.001だけ増やした時のY座標は Y = 2^3.001 = 約8.005 この時のY座標の差は 8.005 - 8.000 = 0.005 Xの差が0.001で、Yの差が0.005なので、この時の瞬間的な線の傾きは 0.005 / 0.001 = 5 だいたい、Xが1増えるごとに、Yが5づつ増える傾き。 この2^x乗の時の値8と、その瞬間の傾き5とでは、数字がかなり違う。8と5。
2じゃなくて e の場合 e^x した時の値と、その瞬間の傾きは同じになる。 たとえば e^3の値が約20.08 3を0.001だけ増やした場合は20.10 この差は0.02。 この瞬間の傾きは 0.02 / 0.01 で 20となる。 値も20で、その時の傾きも20。不思議な数。それが
2.7
>>716 規格と規格書の違いが分かってないんだよ。
>>718 >この瞬間の傾きは 0.02 / 0.01 で 20となる。
先生、なりませーんw
というかその傾きどうこうって話つまんないからもういいでーす。
>>578 せめて QZ にしてくれ。Q を NGワードにしたくない。
ついてけない話題だったからってそれか。
>>718 そりゃあたりまえ、f = exp(x) において df/dt = f だ。
ってことをいいたいのか?
それはそうと、2年7ヶ月間商品投資をやって20% 利益がでたが、これって年利に換算するといくらくらいになるのか?
えっ? xをtでえっ?
f(x)をtで微分したら0ジャマイカ
相変わらずQは低能の癖に見栄っ張りですなあ 間違えた上に聞きもしない自慢話なんかしやがって
>>728 せめてQZにしてくれへんか。NGワードにできひんやろ?
NGワード云々言う前に自分の言動を直せ そうすれば誰もNGしない
誰か俺の股間のスカイツリーをプログラム的に表現してくれ
>>731 unsigned long long int skytree731() {
return 1;
}
副作用完了点とコンマ演算子の規格です。例によって俺訳を付けておきます。 5.1.2.3 Program execution 2 Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects, which are changes in the state of the execution environment. Evaluation of an expression may produce side effects. At certain specified points in the execution sequence called sequence points, all side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place. (A summary of the sequence points is given in annex C.) volatileオブジェクトにアクセスすること、オブジェクトを変更すること、ファイルを変更 すること、もしくは、これらの操作のどれかを行う関数を呼ぶことは、全て副作用である。 副作用とは、実行環境の状態が変化することである。式の評価は副作用を伴うかもしれません。 順次実行している中で、副作用完了点(sequence points シーケンスポイント)と呼ばれる ある特定の場所では、それ以前の評価によって起こる全ての副作用は完了していなければない。 そして、副作用完了点では、それ以降に続く評価によって起こる副作用が生じてはならない。 (付録Cに副作用完了点の要約が提供されている) 6.5.17 Comma operator 2 The left operand of a comma operator is evaluated as a void expression; there is a sequence point after its evaluation. Then the right operand is evaluated; the result has its type and value. If an attempt is made to modify the result of a comma operator or to access it after the next sequence point, the behavior is undefined. コンマ演算子の左のオペランドはvoid式として評価される。この評価の後に副作用完了点がある。 その後、右のオペランドが評価される。結果は、右のオペランドの型とその値である。 コンマ演算子の結果の変更を試みたり、次の副作用完了点の後にそれにアクセスすることを試みると、 その動作は未定義である。
>>733 ですが、コンマ演算子の結果について少し誤訳しました。
誤:結果は、右のオペランドの型とその値である。
正:結果は、右のオペランドの型とその値を持っている。
以下のように注釈に、「コンマ演算子は左辺値を生じない」とあるので、誤訳のほうでは
結果が左辺値になる可能性もあるので、訂正します。
95) A comma operator does not yield an lvalue.
コンマ演算子は左辺値を生じない
マンコマンコうるせぇよ
ifとswitchどっちが早いんですか? switchはコンパイラがジャンプテーブル作るときもあるって書いてあったけど そのジャンプテーブルを自分で作れば一番早いですか?
>>736 環境とかデータによってちがうから一概にいえない。
実測が基本。
>>716 公的な文書は、税金でつくられているから著作権はない
規格は、著作権が認められない 「DIN(ドイツ標準協会)の規格を無断借用した出版社をDINが著作権侵害訴訟で訴えたところ、 連邦通常裁判所と連邦憲法裁判所で規格の著作権が認められず、請求が棄却された」 「米国においても、第5巡回区連邦控訴裁判所と連邦最高裁判所で国家規格が法律に準ずるとして著作権が否定された」 日本工業規格 − Wikipedia
プログラム言語Cは国内の民間団体が原案作成に関わってるから著作権が発生してるよ。 (平成に入ってJIS規格に関する法律が変わったんだよね) それはともかくとして、うちの環境では見られない(´・ω・`) マックとかだったら見られるのかな…
>>738-740 民間の原案作成者(著作権者)が規格の販売売り上げに応じた報酬をちゃんと受け取っていれば
「著作権がある」とする話の辻褄は合いそうなんだけど、そういう事実は無いということ?
だからpdfのファイル構造を自分で調べて(ry
>>736 そんなことで悩む以前にまずプロファイルを取れ。
ほとんどの場合、お前が思っている所以外が遅さの原因だから。
原因だからね。
(´・ω・`)…
げ・・・原因じゃないんだから!
法律を集めた六法全書は著作権ないのか? 勝手にコピーして再販してもいいのか?
>>725 >>そりゃあたりまえ、f = exp(x) において df/dt = f だ。
あたりまえ?
なんで?
>>748 これはひどいw 高校出てなくても勉強くらいはしようや
お前がな。
>>747 コピーはダメ。
編集というかレイアウトには著作権がある。
スキャナで読み込んで、レイアウト変えて印刷すれば再版できる。
法律の条文自体には著作権は認められないから。
興味深い意見だな
typedef struct AnyVec { struct AnyVec *next; struct AnyVec *prev; int type; void *data; } AnyVec; こんなvector<boost::any>相当の構造体を引数として受ける void myprintf(AnyVec* v) {} な関数があったとして そのままprintfに流し込むにはどんな方法がありますか? できればインラインアセンブラ以外のやり方が知りたいです
>>753 >こんなvector<boost::any>相当の構造体
typeとvoid*を渡すと文字列を生成する関数作ってcatなりなんなりすりゃいいんじゃね? その構造体はリストだからとかそういうツッコミはしないからな
>>753 どっちみちprintf()が扱えるのは引き数の羅列だからvprintf()に渡すしか。
で、vprintf()ならフォーマット文字列を自分で生成して引き数をmalloc()かなんかした領域に詰め替えてやればなんとかなるかも。
>>755 やりゃ出来るだろうけど書式指定を全て賄おうとしたら労力半端なくね?
環境ごとに切り分けてインラインアセンブラで書いたほうがマシな気がする
たしかにlinkedlistだね
>>756 その線でやってみる
ありがとう
実現したい内容とやろうとしている事をはっきりさせたほうががが
仮に実現できたとしても、呼び出し元の記述は、 もうパット見では理解不能な代物になるのでは・・・。
基礎をすっ飛ばして応用しようとしてめちゃくちゃになっている良いサンプルだ まずは最低でも基本情報を通過してからコードを書け それまでは一切のコーディングを禁止するべきだ
お前、アホっぽいな。
正しい文法の日本語を話せるようになるまで、日本語の使用は禁止
コーディングと日本語禁止されてアホ呼ばわりされる
>>753 かわいそう
と、アホがぬかしとる。
誰か悪魔召喚プログラム作ってくれ
未定義コードを実行しまくってれば、いつか悪魔が出るかもしれない
デバイスに悪魔召喚の機能がないといくら未定義でも無理だろ
デーモンやゾンビがいっぱいいます
いい加減、つまらんよ。 ちょっとでもおもしろいと思ってるのかね。
プログラマをゾンビにするプログラムなら、 俺はいくつか見てきたぜ
まじめな話しコードだけで物質界に影響を与えるのは至難の業かと 映像と音の他にアウトプットにプラスαが必要だと思うよ具体的に何が必要化は知らんけど
だからもういいって。
話題ふれよ
悪魔召喚プログラムってアセンブラ言語で書かれたんだっけ?
トイレの神様みたいに丁寧にコーディングしてればいつかは女神様があらわれるかもしれない んで、結婚して数ヶ月すると性格がオバ藩化して、やがて悪魔になる
現実の召喚儀式をプログラム上に落とし込んだのが悪魔召喚プログラムだから まずは現実の召喚儀式で悪魔が本当に呼べないとだめだろう
未定義の話だろ。 知識もないやつが出てくるなよ。
特定のハードを発火させるコードなら見たこと有る
たまにコーディング中に悪魔が見えることもあるな
ごめん
効率よくCPUのトランジスタを動作させるプログラムなら熱暴走くらいは狙えるかもしれん ノートPCでクアッドコアCPU乗せてるやつとか
トランジスタ、懐かしすぎる言葉
トランジスタって書かないと単なるCPU使用率100%とは違うからね
LSI設計の世界ではトランジスタ普通に使うよ。 専門用語が一般人にはアナクロに感じられるたまによくある例。
プログラムから見た場合は、 効率よくCPUのトランジスタを動作させると言うより、 効率よくCPUのロジック回路を動作させると言うべきじゃないの?
ノートなんて特にファンがつまったら普通のプログラムでも簡単におかしくなる。 ちょっとスレ違いな上にくだらなすぎなのでもういい?
ダイハードで見たんだけどDelキー押したらPC爆発するプログラムが……
>>788 プログラムジャンクて、
DELキーが爆薬の発火装置に直接繋がってたんじゃね?
PC自体を改造して
>>789 たぶんあれ発火装置に直接じゃなくてDELキーで発火させるフラグを遠隔でONにしてると思う
まわりくどいけど遠隔で直接ボンだとその場にいない可能性があるからね。
つーかPC組むときにあの爆弾気づくよなぁ、BTOかメーカー品かなのかな?
脱線ついでだけど スーパーコンピューターの演算能力でビルの空調関係に負荷をかけて爆発させるというスーパーハカーが
791 :
757 :2011/11/06(日) 17:44:57.73
>>756 先ほど試したところ、すんなり呼び出す事が出来ました
ありがとう
文字が格納してある配列a[i][j]に半角スペース「 」がはいってるかどうか調べたいんですが strcmp(&maze[i][j]," ") == 0 でも maze[i][j] == " "でも だめなんだ どんな方法がありますかね?
アイアムエスパーなんだが。 その変数 maze は char maze[3][5]; のような類か? だとするなら、 maze[i][j] = ' '; でなければチャックできない。 (半角スペースをシングルクォートで囲っていることに注意)
おっと、maze[i][j] == ' '; だったよ。ハンドパワーです。
795 :
デフォルトの名無しさん :2011/11/06(日) 21:16:25.92
それだと、途中に'\0'があったら乙るんじゃね
792だが 解決したわ サンクス
798 :
デフォルトの名無しさん :2011/11/06(日) 22:57:17.34
空リストって何ですか?
linuxのgccで、マウントしたUSBのHDD(500G FAT32)に対して、 fp = fopen(wkFileName , "wb"); if(fp != NULL) { fwrite( buff, 1,1024, fp ); fclose(fp); } と、書き込むと、fcloseの処理に5分ほどかかります。 一度書き込みを行うと、それ以降は、 再びオープンして書き込んでも一瞬で書き込みは終了します。(PG落とすとまた5分・・・) これはなぜでしょうか?
マウントしたHDDはUSBのHDDです。 viでファイル書き込もうとして、固まりますね。。。 読むのは関係なしに即時行えるのですが、書くのはダメみたいです。 スレ違いみたいです。 すんまそん。
IE8でJIS X3010の規格を読もうとしたら途中で回線が切れてエラーになるんだが セキュリティきつくし過ぎておかしくなってないか?
mazeって今週のプログラミング演習の課題に出てきた。 まさかD大生?
>>802 JISのサイトの話なら、Adobe Readerを8以下に落とせば見られる。
獨協ぐらいしか思い浮かばなかった
Windows7用のAdobeReader8が無いな…
電機大or電通大
>>804 ありがとう
(; ・`д・´) ナ、ナンダッテー!! (`・д´・ ;)
どこまで腐ってるんだJISは・・・・
無料だから文句言えないか
ところでpdftkというフリーソフトを使うとゴニョゴニョ
>>809 二つ目のforの中でi*iやってるけど
そこはseisu[i]*seisu[i]じゃねぇのか?
Cのメインプログラムから、システムコールで、別プロセスを呼び出した場合、 呼び出し先の、プロセスの作りが悪いため、 メインプログラムがsignul 11で落ちるなんてことありますか? しかも呼び出したプロセスはそのまま継続されるとかありますか?
>>811 メインプログラムが悪い確率 99.9%
メディアンフィルタを作っているのですが 3要素に限定した場合、ソートするよりも速いものがあれば教えてください。
画像処理とかのスレの方が詳しいと思う
>>813 これをマクロにしたようなものを使えば早くなるかもしれない
int median(int a, int b, int c)
{
if(a>b)
{
if(c>a) return a;
if(c>b) return c;
return b;
}
else
{
if(c>b) return b;
if(c>a) return c;
return a;
}
}
Stolzmann 読み方教えて
ストルツマン 英語圏ならストールマンでいいとおもう
819 :
デフォルトの名無しさん :2011/11/07(月) 20:56:54.00
if(strlen(a)>=2) { Y=0; v=1; for(i=0; i<strlen(a);i++) { v=v/(a[i]*(i+1)); for(j=0; v<1; j++) { v=v*10; } } X=v*7000; for(i=0; i<strlen(a);i++) { Y=Y+a[i]*i; } ハッシュ関数ですが、こんな感じでOKですか? 文字列に対するハッシュ。
用途次第
間抜けなことをやってるのは理解できる。
関数としての体裁を整えた方がよくない?
どれが結果なのかわからん。 XとY?
forの判定部に関数入れんな
828 :
デフォルトの名無しさん :2011/11/07(月) 22:20:01.85
全部書きました・・・もっと良い方法ありますかね? int X; if(strlen(a)>=2) { Y=0;v=1; for(i=0; i<strlen(a);i++) { v=v/(a[i]*(i+1)); for(j=0; v<1; j++) {v=v*10;}} X=v*7000; for(i=0; i<strlen(a);i++) {Y=Y+a[i]*i;} j=0; if(heap[X].x==0){heap[X].x=X; heap[X].y=Y; tangosu++;} else if(heap[X].x!=0) {while(!(heap[X+j].x==X&&heap[X+j].y==Y)){ if(heap[X+j].x==X&&heap[X+j].y==Y)break; if(heap[X+j].x==0){heap[X+j].x=X;heap[X+j].y=Y;tangosu++;break;} j++;}}}
vがintなら無限ループ
830 :
デフォルトの名無しさん :2011/11/07(月) 22:36:53.65
>>829 double ですよ。
X,Yはint
831 :
デフォルトの名無しさん :2011/11/07(月) 22:38:02.50
833 :
デフォルトの名無しさん :2011/11/08(火) 00:13:37.68
今ポインタを勉強してるんですが、 配列名は代入式の右側にあるときは先頭の要素のアドレスと見なされるが、 左側にいるときはそうではないということで合っているでしょうか?
みなされるけど、左辺値になれない、だったと思う。
あってません。 配列は単にポインタに減衰するだけです。 そして配列名は定数なので左辺値になれません。
836 :
デフォルトの名無しさん :2011/11/08(火) 00:55:27.29
げん‐すい 【減衰】 [名](スル)しだいに減っていくこと。 ???
>>833 式中で配列名は、次を例外として「配列の先頭要素を指すポインタ」に変換される。
・sizeofのオペランド
・&のオペランド
char配列に対する初期化子の文字列リテラルも例外
配列名は代入できない左辺値。
→正確に言うと代入可能な左辺値に配列名は含まれない。
838 :
813 :2011/11/08(火) 08:28:42.19
>>815 ありがとうございます。
やはり単純な比較になってしまうようですね。
画像処理スレで聞いてきたいと思います。
839 :
813 :2011/11/08(火) 08:36:11.86
画像処理 その13の251で質問してきたので こちらは〆させていただきます。
840 :
813 :2011/11/08(火) 11:27:06.52
はい。
質問させて下さい ある整数があるときそれを一つ上の一番近い2の乗数にしたいのですがいい方法はありますか? シフト演算子で一つ増やして上位ビット以外を0にすればいいんでしょうがうまい方法がよくわかりません 例 3→4 33→64 128→128
>>841 int hoge(int n)
{
int ret;
for(ret=1;ret<n;ret<<=1)
;
return ret;
}
>>842 ありがとうございます。複雑に考えすぎてました
なるほど分かりやすい
確保された領域を一括に開放できるall free関数みたいなものってとかありますか? 自作したら引数いっぱいでごちゃごちゃします。
確保したポインタを保持してて、それらをすべて開放するall free関数を作ればいいのでは
ガベコレでおk
ガベージコレクションなんていらないよってことなのかな
ガベコレは甘え
Cは甘え
確保された領域を開放すると、何かいいことありますか?
>>846 そういう必要が生じたのなら、設計を見直すべき。
基本的に、malloc() や free() ってのは、
あっちこっちで気まぐれにホイホイ呼ぶような処理じゃない。
>>854 いいことがあるというより、しないと悪いこと(メモリが足りなくなる)が起きるので
それを回避するために開放しなければならない。
C++プログラマがメモリ空間の断片化を、OSやランタイム関数の せいにして放置するのですけど、どうしたらいいですか?
プログラマのガベージコレクション
断片化がおきるような確保を行わないようにすればいい
パフォーマンスに影響が出る程の断片化起こす実用コードを書く様な辛抱強いマは実際のところもう絶滅したんじゃないかな
>>857 は単にそういうことを言ってみたいだけだと見たが
断片化を1バイトも起きないように絶対根絶しなければならないというのは、 長時間連続運転するサーバーとか、いろんな用途で使われるライブラリとか、 特別な用途に限られるんじゃないの。
断片化がおきてはいけないのではなく、断片化が進むのが良くないんだよ
だからさ、 >長時間連続運転するサーバーとか、いろんな用途で使われるライブラリとか 以外の、コマンドラインツールとか、毎日再起動するサーバーとかでは、 想定用途の範囲で問題になるほど断片化が進まなければ、 必ずしも絶対根絶しなきゃいけないってわけじゃないんじゃないの?って話。
毎朝再起動しないと停止するサーバーなんて、怖くて使えないわ
どこかの図書館の話ですか?
WindowsNTのことですか? わかります。
スレ違いになってきてるが、 ある程度の規模なら、再起動がどうとかよりも まず、いつコンデンサが火を噴いてもいいように構成するのが当たり前で、 そのように構成されていれば、再起動なんていつでもできる
確かにそうだね。 でも、別に再起動しないと停止するわけじゃないけど、 毎日再起動する運用になってるサーバなんていくらでもあるだろ。
普通サーバーって放置してて誰も気にしない物だと思ってた。
>想定用途の範囲で問題になるほど断片化が進まなければ、 >必ずしも絶対根絶しなきゃいけないってわけじゃないんじゃないの? って発想が、メモリ断片化を気にしないプログラマが育つ苗床になってる予感
そうかな。 メモリ断片化を気にしない人は、 >想定用途の範囲で問題になるほど断片化が進まなければ、 なんてことは考えないよ。
断片化防止にコストかけるよりメモリ倍積んだ方が楽じゃね? 倍くらいあれば断片化してもどうにかなるだろ
そういう話じゃないですし…
まあ、
>>857 の質問意図が、「プログラマに断片化を放置せずに解決するようにさせるにはどうしたらいいですか?」
という意味なら、答えは簡単だ。
PM がタスクの優先順位を変えて、溜まってるユーザからの機能追加とかの要求とかを
全部棚上げして、断片化の解決を最優先でやれ、と指示すればいい。
もう、マ板の話題だな。
プロジェクト内の人がどんどん断片化していくのですが どう解決したらよいですか?
デフラグさんの人形を近くに置いて様子を見る
要するにalloc系を使わなきゃいいんだろ!
BUFSIZE 80 char buf[BUFSIZE] fgets(buf, BUFSIZE, stdin) で取得した文字列の先頭のアドレスをほかの関数に受け渡す方法がわかりません。 具体例を示していただけると助かります。 ご指南お願いします。
>>881 そこかしこでallocator使われるのに(コンテナ、文字列、etc…)どうすりゃいいの?/(^o^)\
スタックなどは固定確保と解釈するとして、動的確保しなけりゃ問題無いんだろ
std::allocatorは動的確保だよ^^; vectorもstringも動的確保だよ^^;;;
>>882 例えば、puts(buf);とでもすればputs()にbufを渡せる。
887 :
デフォルトの名無しさん :2011/11/09(水) 23:51:36.43
渡せるね
>>857 問題だと認識していて放置さえしなきゃどうにかできるつもりでいるんなら
お前が解消しろよ。
そもそも解消する術をお前が知らないというのなら放置されてようがされてまいが
結果は同じなんだろ。
>>846 それと同じのがオーダリングテーブルの実装で必要になったから考えたことあるわ。
あらかじめmallocで巨大なメモリーを確保しといて、そこから自作mallocでアドレスを配布してくだけ。
この自作mallocは非常に単純な作りで、単に配列のシークアドレス(初期状態は先頭アドレス)を返し、シークアドレスを確保分だけすすめるだけ。
個別のfreeは存在しない。
全体のメモリーの開放は、単にシークアドレスを先頭に戻すだけ。
これで次からは再び、自作mallocで、この領域を先頭から再利用できる。
高級言語使うな。 全部アセンブラでやれ。
893 :
デフォルトの名無しさん :2011/11/10(木) 01:01:20.05
ボスがアセンブラでやれっていってるだろ
アセンブラやれば富豪的プログラミングが改善されるかと思ったらそうでもなかった
結局のところ、アセンブラに落ち着くんだよな。 GoogleだってAndroidやChromeのカーネルの部分はアセンブラで組んでるし
オブジェクト指向のように、哲学だったものが宗教になると嫌だな
高級か低級かで言えばCはもちろん低級言語。 これ豆な。
Chromeのカーネルってなんだ??
しいていえばWebKitか、ってそういうボケでよろしかったしょうか
900 :
デフォルトの名無しさん :2011/11/10(木) 02:36:18.17
>>894 アセンブラでもピザデブ的プログラミングはできるが? 要はやってる奴の根性でしかない
>>892 UNIX では、メモリ関係のシステムコールを含め、OSがほとんどCで書かれてるから、
この問題に関する限りそれは意味ないぞ。
(Cコンパイラもライブラリも大部分Cで書かれてるはず)
>>901 まさかCで書かないとシステムコールを呼べないとか思ってないだろうなw
システムコールがCで実装されてるって話だろうに
OSがクソってことだろ。
906 :
デフォルトの名無しさん :2011/11/10(木) 13:54:22.05
>>902 一番の問題は、マニュアルを C ベースで書かれてしまうこと
アセンブラ使いにとっては頭の中でコンパイルしながら読まされるのがつらい
>>906 それがつらいレベルでアセンブラ使いとかw
INT 21H
NMI
c言語は時代遅れだって千早ちゃんが言ってた
つ肉体言語
912 :
デフォルトの名無しさん :2011/11/10(木) 16:50:12.51
>>907 けっこうトリビアがびしばし出るんだが、知らずに済んでるお幸せな方はいいね
くだらねぇ。
void allocate(int n, int **hoge, double **hoged); allocate(n,&hoge,&hoged); void allocate(int n, int **hoge, double **hoged) { printf("error1\n"); *hoge = malloc(sizeof(int)*n); *hoged = malloc(sizeof(double)*n); printf("error2\n"); }
919 :
デフォルトの名無しさん :2011/11/10(木) 17:58:56.17
思うんだがC言語で将棋のソフト開発すればめちゃくちゃ早いんじゃないか?
100万個のランダム実数Cでソートしたら10秒だったww 将棋の筋読みCでやると高速だろww
wikiにコンパイル言語としては決して高速ではないって書いてあった
釣れますか?
923 :
デフォルトの名無しさん :2011/11/10(木) 18:11:13.36
そんなことはないだろう
>>921 それは、吐いたコードの速度ではなく、コンパイル速度では?
コンパイル速度はpascalの足元にも及ばない
928 :
デフォルトの名無しさん :2011/11/10(木) 18:47:29.20
えへっ
コンパイル速度って、重要?
>>929 Includeとかを注意すれば防げるものが多いけど、C++などで油断するとコンパイルに数分かかることもある。
>>929 今どきのCPUならそんなに重要じゃないな
C++になると糞遅くなるのでLLに逃げたい気持ちも分からなくはない
LLで書いて、C、C++ソースを出力するのも有るね。
935 :
デフォルトの名無しさん :2011/11/10(木) 19:17:27.28
char str[] = "Hello!\n"; って宣言して、 printf("Hello!\n"); printf("&s",str); printf(str); の三つの出力を確認したら、三つとも Hello! って出力されたんだですけど、この三つの結果を、類推される printf関数の処理の流れに基づいて説明せよ ってのを教えて下さい。
>>930 裏を返せば、最適化しやすい書き方もできる訳で・・・
構造体のメンバの順番変えるだけでメモリ節約とか
>>935 printf は
Hello!
を出力する関数である
>>934 LLじゃ無くても、Cとアセンブラのソース吐ける言語処理系は多いよ
Haskellも吐けるし、Delphiも確か吐けた
コンパイル速度重要だろ。 アプリケーションソフト起動するときに、1分くらいかかるとやる気失せるだろ。
>>935 2番目は”&s”って出力されるだろ
どうせ%sの打ち間違いだろうけど
>>939 C++コンパイラならともかく、Cコンパイラは気にするほど遅く感じない
Cのコードの拡張子を.cと.cppで比較してみれ
>>935 >printf("&s",str);
何したいか、教えて
>>940 %sもまずいだろw 半角%sにしなきゃ
引数の一番目が文字列で渡されてるとかそんなとこじゃね?
944 :
デフォルトの名無しさん :2011/11/10(木) 19:29:08.40
分割コンパイル形式の実行形式だと膨大な時間かかるとかありますかね?
945 :
デフォルトの名無しさん :2011/11/10(木) 19:31:01.42
>>935 すいません、二番目は
printf("%s",str);
です
>>943 知ってるよw
細けーこた良いんだよwww
>>944 一回目は結構待たされる。
二回目以降は変更したファイルのみコンパイルされるから、あまり待たないで済む
注:gccは知らん。make使え。 VCなら、ビルドでmakeとCコンパイラ、隣家の仕事をまとめてやってくれる。
しかし、今時コンパイルが遅いのを気にするっておまいらどんだけでかいプロジェクト まわしてるんだよ。 確かに数100万行クラスになると工夫しても最初とか数十分かかることもあってやって られないとは思うが。
>>949 VCでMFC使うと普通に最初は5分近く待たされるがな…
ただウィンドウ表示するだけのアプリで・・・
Core i5でだぞ・・・
各種ライブラリーのビルドからやると素人のアプリでも最適化フルでかけてすごく時間かかるようになるよ 自分のプログラムの部分だけの最適化だとすばやいけど
952 :
デフォルトの名無しさん :2011/11/10(木) 20:10:54.08
すばやいけどね
UNIX系のdlopen, dlsym等を見て思ったのですが, dylibが対象ではなく現在の実行プロセスに含まれる関数を,文字列から取得することはできないのでしょうか? 実行時に動的に呼び出す関数を変更したいため必要なのですが……
>>953 名前で索引付けしたテーブルを持ってればいいじゃん。
955 :
953 :2011/11/10(木) 21:21:50.28
>>954 関数のアドレスが未知の状態からの探索なので,それではちょっと…….
とりあえず解決しました.お騒がせして申し訳ない
>>950 まじか。最近VCは使ってないがそんなことはなかったと思うが。
ひょっとしてMFCもソースからコンパイルになってたりするのか?
それならまぁわかる。MFCでかいから。
958 :
忍法帖【Lv=2,xxxP】 :2011/11/10(木) 21:35:54.91
すいません。 c++でBMIの計算プログラムを作っているのですがcの値がおかしくなってしまいます。 どこが悪いのでしょうか? #include<stdio.h> int a; int b; int c; int d; int e; int main(void){ while(1){ printf("BMI計算\n"); printf("体重を入力ください。\n"); scanf("%d",&a); printf("身長を入力ください。\n"); scanf("%d",&b); c=(a/(b*b))*10000; printf("あなたのBMIは%.1fです。\n",c); if(c<18.5) { printf("あなたは痩せ気味です。\n"); }else if(c>=18.5 && c<25)
959 :
忍法帖【Lv=2,xxxP】 :2011/11/10(木) 21:37:17.71
>>958 続き
{
printf("あなたは標準体重です。\n");
}else if(c>=25 && c<30)
{
printf("あなたは若干太り気味です。\n");
}else if(c>=30 && c<40)
{
printf("あなたは太りすぎかもしれません。\n");
}else if(c>=40)
{
printf("ジャンボすぎる体型ですねww\n");
}
printf("もう一度やりたい場合は1を押してください。\n");
scanf_s("%d",&d);
if(d!=1)
{
break;
}
}
printf("お疲れ様でした。\n");
getchar();
getchar();
}
そりゃintだからな
>>957 マジ。
自分も最初使ったとき、ウィザードが作ったコードを編集しないで実行で、こんなに待たされると思ってなかったw
makeのことの初歩的な質問ここでいい? オブジェクトファイルをTPPっていうディレクトリに出したいんだけど TPP/%.o : %.c hogehoge ってやればいいって書いてあったんですがカレントディレクトリにオブジェクトファイルができます。どうすればいいですか?
hogehogeって何してる?
>>963 例えば ${CC} -c $<
みたいな感じです
>>964 明示的に-o で出力ファイル名指定してないといけないってことですか?
makeはターゲット知ってるけど、 コンパイラにも教えてあげないと
968 :
962 :2011/11/10(木) 22:12:41.73
ありがとうございました
969 :
忍法帖【Lv=2,xxxP】 :2011/11/10(木) 22:13:38.42
次スレ立てます
973 :
デフォルトの名無しさん :2011/11/11(金) 00:12:32.37
>>930 gcc の最適化が甘いのはそんな理由じゃないんだけどね
974 :
デフォルトの名無しさん :2011/11/11(金) 00:16:22.90
コンパイル速度をどうでもいいみたいに言ってるやつ頭蛆わいてるな 時代時代の目一杯のスペックでも全然足りないのにさ 今日もサンディの 4.5G にキレたし
>>930 Cより最適化しやすい言語ってのが何なのか気になるな…
理論的には高速化しにくいx86が金に物言わせて現実には逆転してるのと同じで、金に物言わせたIntel Cコンパイラが最適化で勝ってるとか、そんな落ちが有りそうな気もするが
昔はコンパイルしてる間にコーヒー入れてもまだ終わってなかったっておっちゃんの先生が言ってた 今でもFPGAのコンパイルは3時間くらいかかるからCのコンパイル時間に文句言うなよ
>>975 あくまで理屈上だが、コンパイルフェーズについては、Cより例えばJavaのほうが最適化し易い。
と書くと、トランスレート、コンパイル、インタープリトを区別してない者からツッコミ来るな。
ここで注意が必要なのは、「JavaソースからJVM用コードへのコンパイル」と
「CソースからCPUコードへのコンパイル」との比較だという事。
JVM実装の性能とか、C特有のテクニックを駆使したコードの利点とかを含んでいない。
>>975 特にCではポインタが何を指してるのかの解析が
非常に難しいので、Intel C++とかでも
適切なプラグマやコンパイルオプションを組み合わせないと性能が出ないとか、
そういったケースはある
>>976 うん、ハード屋の忍耐力には脱帽するわ。
いい加減な性格なのでハード屋は無理。趣味だけにしとくw
>>977 そりゃポインタもなければそうだろうさ。
ぽちっとリビルドしてホっと一息つくもんだろう ネットワーク分散コンパイルなんか進行状況がグラフで出て前世紀のデフラグをぼーっと見てる感覚に浸れる
低級言語ゆえに最適化が難しいって事なんじゃないかな。 最低級のアセンブリ言語を最適化するのって難しそうじゃんw
ハードへの密着度が大きいところ迄、ブログラマが記述可能。 →コンパイラの守備範囲が広い → 多様なケースを満遍なく最適化するのが難しい だと思う。
あと、CPU・周辺チップの進化方向と一心同体なので、ハード開発工程に影響されるのもあるか。 実態はCPUの方も、Cに合わせて来た部分もあるけどね。
よく言われるのはC++のstd::sortとCのqsortではC++の方がうんと速い。 FORTRANのfor文とCのfor文ではFORTRANの方がずっと並列化しやすい。 などなど。Cは最適なコードをプログラマが書けるものと推定する。
>>983 C Processing Unit と言われかねない。
>>983 >実態はCPUの方も、Cに合わせて来た部分もあるけどね。
?
そんな事実はないと思うのですが。80x86系では、どの部分が「Cにあわせてきた」のでしょうか?
μOP化だろ。そんなこともわからんのか。
>>987 μOP は主にCPU 内のパイプラインのためでは?どこが C言語と関係あるんです?
989 :
デフォルトの名無しさん :2011/11/11(金) 03:11:37.61
>>986 おまえさ、コテ外せよ
こんなに長いあいだスレにいてそのレベルだと思うと嫌悪感が先に出て
答える気がしなくなるからさ。
名無しなら、まだ初心者かもしれないと思うからまともなレスがつくと思うぞ。
>>989 μOP は主にCPU 内のパイプラインのためでは?どこが C言語と関係あるんです?
>>989 >実態はCPUの方も、Cに合わせて来た部分もあるけどね。
こんな事実は金輪際ありません。霧
コテ外せよ
こいつ、無知なくせに最近やたら上から目線で言うようになったな。 ここあんまり長くないんだけど前から? いや、知ってる人答えなくてもいいよ。レスが無駄だから。 まぁもうすぐ1000だからどっちでもいいけど。
いや、別人だし 妄想癖でもあるのか?
>>983 >実態はCPUの方も、Cに合わせて来た部分もあるけどね。
?
そんな事実はないと思うのですが。80x86系では、どの部分が「Cにあわせてきた」のでしょうか?
86系は知らんけどRISCブーム以降のアーキテクチャはけっこうCコンパイラを意識してるよね。
>>997 うーん。RISC のやりかたは、CPU 内の様々なからくり(パイプラインとか投機実行とか)のためであって、C言語のため、という気はあまりしないのですが、でも少しは意識しているのかもしれませんね。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。