復元候補を全検索した場合には幾何級数的に走査量が増えるため
なんらかの方法で絞込みを行う必要がある
(一つの単語あたり候補が 1000 あるとき、仮決定しながら次を探索できるのはせいぜい 3 単語が限界)
コメントおよび文字列リテラル未対応の簡易エンコーダ
#include<stdio.h>
static unsigned char NextTable[256];
void init(void){
int i;
for(i=0;i<256;i++) NextTable[i]=i;
for(i='a';i<'z';i++) NextTable[i]=i+1;
NextTable[i]='A';
for(i='A';i<'Z';i++) NextTable[i]=i+1;
NextTable[i]='a';
for(i='0';i<'9';i++) NextTable[i]=i+1;
NextTable[i]='0';
}
int encode(unsigned char table[256], int c){
int ret;
ret=table[c];
table[c]=NextTable[ret];
return ret;
}
int main(void){
unsigned char table[256];
int i, c;
init();
for(i=0;i<256;i++) table[i]=i;
while((c=getchar())!=EOF){
if(c=='/') putchar(encode(table, c=getchar()));
putchar(encode(table, c));
}
return 0;
}
Decrypt
void CSyukudaiEncDlg::scroll(int id)
{
CEdit * pEdit = (CEdit *)GetDlgItem(id);
int line = pedt->GetLineCount();
int col = pEdit->LineLength(pEdit->LineIndex(line - 1)) - 40;
pEdit->LineScroll(line, col);
}
175 :
デフォルトの名無しさん:2011/05/06(金) 20:22:03.12
なんかC言語と離れるかもですが
バイナリファイルの扱い方がいまいちわかりません。
.bmpとかは画像を保存する形式とかなんとか聞いたのですが、
ただ単に数字(数値?)の羅列を記録するには.csvとか.txtじゃないとダメですかね?
176 :
デフォルトの名無しさん:2011/05/06(金) 20:33:18.50
なんか、スレタイとか、
>>1 を見ると
あほう、あほう、かと読める。
>>175 ただ単に数値の羅列を記録するのにバイナリで保存しても別にかまわない
画像はただ単に数値の羅列を記録するだけじゃなくてサイズとか色数とかいろいろ付加情報が必要だから
bmpとかいろいろ形式が定められてるだけ
178 :
デフォルトの名無しさん:2011/05/06(金) 20:50:14.94
ん?
えーっと・・・
じゃあただの数値の羅列を記録するファイル形式ってのは・・・?
.bmpじゃダメだよね?
形式なんて決めずともただ単に数値の羅列を書き込んでいけばいいではないか
180 :
デフォルトの名無しさん:2011/05/06(金) 20:52:48.76
ファイル名の後に拡張子は無しでいいんですか?
付けたければ付けてもいいし無しでもいいし
すでにある拡張子 (.txt とか .csv とか .bmp とか) と同じにするとまぎらわしくなるけど、
まぎらわしいという以外に何か問題があるわけでもないので、好きにしてよい
形式不明の拡張子として .dat とかが使われることもある
182 :
デフォルトの名無しさん:2011/05/06(金) 20:58:42.50
無しでいいんですね。
なんかくどくてすいません
ありがとうございました。
stringについて質問。
"string"と[string]という配列は同じものと考えておk?
[string] ってなんですか
C言語にそんな文法ありませんよ
悪かった。
[0]s[1]t[2]r[3]i[4]n[5]g
という無名の配列と同じものと考えて良いのかな?
よくない
最後に '\0' も付く
長さ 7 の char 型の無名の配列
187 :
uy:2011/05/15(日) 00:42:43.46
#include <stdio.h>
void main(){
char a[] = "test" ;
char b[4];
b[0] = 'a';
b[1] = 'i';
b[2] = 'u';
b[3] = 'e';
// b[3] = '\0';
printf("a ... %s \n" , a );
printf("b ... %s \n" , b );
}
勝手に \0 はつくから、そんなに気にするレベルじゃない
もし、 この b みたいに 一文字ずつ、文字を入れていくような処理を行う場合は、
最後に \0 をいれないと意味不明なところを読み始めるレベル
×意味不明なところを読み始めるレベル
○何が起きてもおかしくないレベル
まぁ、これならありだけど。
printf("b:%.4s\n", b);
189 :
uy:2011/05/17(火) 00:03:17.64
意味不明なところを読み始めるレベル == 何が起きてもおかしくないレベル
どう考えても同じ意味です本当にありがとうございました
お前友達いないだろ
191 :
uy:2011/05/17(火) 17:49:26.81
なんかお前
#define NULL -1
とかやってそう
日本語の細かい定義までも気にするのは、PGの職業病 病院いけ
192 :
デフォルトの名無しさん:2011/05/20(金) 17:37:35.77
C...難し過ぎ これで稼げる人 尊敬するわ!
typedef struct _COBJ {
char classname[32];
.
.
void (*msgproc)(int msgid , void * param);
.
.
etc.....
} _COBJ;
なんてクラス化基底ベースを作ってOOPやってんだけど難し過ぎる... UMLがまとまらん 特にクラスマネージャーの位置 orz
ARMのヒープ量は充分なんだけど 頭がパンク...
>>192 素直にC++でやれば?
>>191 言葉の定義の問題じゃないよ。
>188の指摘は次の例と同じこと。
×うゆが暴れるスレ
○うゆも暴れるスレ
誰かワイド文字の使い方」を詳しく教えてくれ!
ワイド文字のstrcpyとかって無いの?
こないだワイド文字入りのソース作ったら
いくらやってもコンパイルエラーで・・・
wcscpyとかwcscatとかあるよ
196 :
デフォルトの名無しさん:2011/05/22(日) 17:33:04.89
unknown escape sequence: '\x8e'
コンパイルエラーででてきた。
コレいったいなんでしょか?
>>196 エディタの設定を見直して、所謂全角空白は目に見えるようにしよう。
199 :
デフォルトの名無しさん:2011/05/23(月) 21:16:06.39
助けて。
普通に考えても絶対飛ばされないような一行が動作させると飛ぶ。
こんなのありえるの?
これって自分が悪いの?コンパイラが悪いの?
参考までに
(省略)
fgetws(wsi,800,fc);
while(1){
fgetws(wsg,100,stdin); ←ここ
swprintf(wsh,L"%s\n",wsg);
(省略)
ちなみに二行連続で同じ文書いたら一行だけ動いた。
>>199 99.99% お前が悪い
確保して無い領域に変なもん書き込んだんだろ
>>200 領域は宣言の時点で
wchar_t wsg[200]
ってちゃんとなってました。
もう小生の知能じゃ解析不能だったので
二行書いて一行動けばそれでヨシとしました。
とにかくありがとうございました。
と思ったら一行しか動かないのはループ一回目だけだ
二回目以降はちゃんと二行動く(苦笑)
それならニ回目以降一行飛ばそうと思ったら
一回目に二行とも飛ばされた(苦笑)
わけがわからないwww
>>202について
>>202はこちらのソースのミスだった。
書き直したらしっかり動いた。
騒がせてすまない。
反省している。
204 :
デフォルトの名無しさん:2011/05/24(火) 19:37:52.96
乱数とってるはずなのに
動かすごとに同じ順番で同じ数字が出てくる。
どうすれば・・・??
205 :
デフォルトの名無しさん:2011/05/24(火) 19:45:22.89
はい、関数ポインタとコールバック関数について勉強しましょうね。
真面目に勉強しろよ。おまえら(怒)
教えて頂けますか?
for文を使って
1〜100まで足した合計
1〜100までの偶数を足した合計
1〜100までの奇数を足した合計
をfor文ひとつを使ってやれる方法を教えて頂けますか?
宜しくお願いします。
#include <stdio.h>
int main() {
int sum=0, even=0, odd=0;
int i;
for (i=1; i<=100; i++) {
sum += i;
if (i % 2 == 0) {
even += i;
} else {
odd += i;
}
}
printf ("sum=%d, even=%d, odd=%d\n", sum, even, odd);
return 0;
}
#include <stdio.h>
int main(){
int sum, even, odd;
for(sum=(100*(100+1))/2,even=((100+1)/2)*((100+1)/2),odd=100/2*(100/2+1);0;);
printf ("sum=%d, even=%d, odd=%d\n", sum, even, odd);
return 0;
}
for文使う意味があるのか?
元質が使うことを条件にしていた。
for(DoSomething(); ; );
これで大抵の事は for 文でできる
初心者だけどfor文とかif文とかwhile文とか分からなくて挫折しそう。
>>214 全部条件式じゃないか。
気のきいた解説書1冊ですぐ判る。
>>215 猫でも分かる の本でやってるんだけど
よく分からん。
自分でも何がいけないか分からないし。
>>216 その本の内容は知らぬが
if が判らないってことは i < 10 とかが判らないってことか?
>>217 なんというかifならif(条件)までは分かる。
forならfor(条件)。
ほんと何て言えばいいか分からんけど
全体的にゴチャゴチャしてくるにつれて分からなくなってくるというか・・・。
本の練習問題に「1+2+3+・・・+100」の値を求めるプログラムを、
for文を利用して作ってくださいみたいのがあったんだけど
for(i=1; i<100; i++){ までは書けてそれ以上ができなかった。
あー長くてすまん。とにかくもう分からん。
>>218 猫ってそんなゴミクズなの?
調べてみて結構評価高かったら買ったんだが・・・
>>219 >「1+2+3+・・・+100」の値を求めるプログラム
一行で書けると思ったら、気分的に楽なんじゃないかな
int main() { int r = 0; for(int i = 0; i <= 100; i++) r += i; printf("%d¥n", r); }
"for(i=1; i<100; i++){" だと一回足りないナリ
>>220 俺は分かり易くこう書いてみる(関数部分は抜き)
r = 0 ;
for( i = 1 ; i <= 100 ; i ++ )
{
r = r + i ;
}
printf( "%d¥n" , r ) ;
222 :
デフォルトの名無しさん:2011/07/24(日) 01:01:51.58
return 5050;
return (100 + 1) * 100 / 2;
うむ。
スレ新参です、よろしくお願いします
下記の構文を見つけたのですがどういう意味でしょうか?
手持ちのC言語本には目次にすらないのです
よろしくお願いします
__sfr __at (0x0C) T0L; /* Timer channel 0L */
コメントからタイマチャンネル0Lの何からしいですが、
この記述は何を意味しているのでしょうか?
またこれを利用している側は「T0L=100;」の様に変数扱いをしています
__sfr型という事ですか?いろいろ質問ばかりですみません
アセンブラ言語で書いてある
>>225 マイコンの型番を書きましょう
周辺機能の番地か何かを指す書き方のような?
228 :
225:2011/08/30(火) 21:48:45.26
質問の意図が通じなかったかな…残念です
直感的にはメモリマップドI/Oを名前付けするのかな?と思ったけど
型とかアドレスの意識をどこで結び付けているのか?知りたかった
多分__at (0x0C)へのI/OをT0Lと言う名前で出来るようになる?のかと思ったが__sfrって?って事で
20年以上前、クロスコンパイラ開発してた頃K&Rの仕様書では習わなかった
あの当時だと「(unsigned char *)(0x0C) = 0x00;」みたいな書き方をしてと現場には話した気がする
今はもっと良い(スマートな)書き方があるのか?と期待しての質問でした
久しぶりのC言語だったので立ち寄ってみました
場違いなのかも知れないのでこれにて
申し訳ありませんでした
自動変数のbyte配列の最大サイズはどこに定義されていますか?
(例えば malloc()で割り当てられる連続長?の最大サイズは 物理メモリ量とOSの実装 に依存しながらも
stdint.h に SIZE_MAX として定義されてますが、こんな感じでどこかに)
64bit linuxで下記のようなコードを試しに書いたら core dumped しました
getrlimit(RLIMIT_STACK, &rlim); // STACK=[8388608]byte
char a[8380000]; // core dumped. [8370000]は実行可能でした
rlimitで制限されてるんでしょうか?
>>229 C前提の話をすると unsigned char hoge[10]; の配列数はコンパイル時のsizeofでしかわからないはず。
普通(汎用的)に扱いたいならどっかに int hogehoge=sizeof(hoge);としておくしかないと思う
ちと危険なやり方でhoge変数の前後でmaehogeとatohogeを宣言してアドレス空間の差を…危険すぎるw
変数のタイプによってはリンカーはリロケートしてしまう可能性もあるし
それを回避する為に構造体を持ち出して…とか本末転倒なのでhogehoge式にしておくのが無難
コンパイラ展開規約ではバイト列に対する長さを保持する展開を強制されるリファレンスはないと思った
一部特殊なコードジェネレータがそれが無いと困るケースで特異的にあるはず
でもそんな石使ったことないから知らない
>>230さん 229です、助言ありがとうございます。はい、C言語のスレなのでC++ではなくC前提でお願いします
しかし質問意図が伝わらなかったようで申し訳ないです
質問の意図は
「ある環境の自動変数の最大サイズの配列宣言を 環境非依存にポータブルに記述するにはどうすれば良いのですか?」です
ここでいう環境はUnix Like OS限定と考えてください
char a[10]のような小さなサイズの話ではなく環境で許された最大値ギリギリを使い切りたい場合の話です
"コンパイラ展開規約"?という用語とリファレンスという語が指すものがわからなかったので確認なのですが
> コンパイラ展開規約ではバイト列に対する長さを保持する展開を強制されるリファレンスはないと思った
この文章の意味は
「バイト列に対する最大長を保持するマクロは定義されていない(と思う)」という理解でよろしいですか?
>>231 おお、これは失敬。確保領域の最大値が知りたいのか
自動変数でしかも配列を有限数で宣言する上限と言う事でおk?
だとすればコンパイラの仕様次第としか答えられない。コンパイラは何を使うの?Linuxでgccって事?
一般に自動変数の場合スタック配置される可能性が高い(インプリメントの自由度があり絶対ではない)
そしてgccに限定すると-Gオプションの影響をうけるがこれも機種(CPUやメモリ管理)依存であり、答えがぶれる
C言語では規定できないから厳密な話をするのであればUnix/Linux板か言語として記述で縛るしかないと思う
厳密・忠実なコンパイラインプリメントから言えば添え字は無制限であり、コンパイラ開発者が決めるべきである
が、ANSIが言うには90版は32767、99版は65535だったはず。<int基準で作られていたと記憶
コンパイラ規約(古く私などはカーニハン&リッチの物を基準にコンパイラ開発をした)は常に変動があるので
やはり実行する環境の下で影響の受ける話はするべきだと思う、もう少し環境を限定してもらわないと…
それでもC言語では限定しないし、コンパイルエラーなり実行時エラーなりが出る可能性もある。
後は「特定されている」コンパイラの規約に則してもらうしかない
コンパイラが明示されていないのでわからないし、明示されたら専用のスレで聞けと答えが来ると思うよ?>C汎用の話じゃないし
まだ質問とぶれてるとすれば「ポータブルな配列宣言」の部分かな?
これどういう意味?
ポインタを宣言してmallocしちゃダメなの?
mallocの最大値は使うコンパイラのmalloc関数の説明を見てください。最大値が書かれています。
普通に答えるならこうだけど不確定な質問でなんか答え辛い
使うコンパイラやCPU/OSを限定(最低限複数でも種類の列記)は出来ない汎用な話なのですか?
C言語自体は殆ど制約がなく、実装を決定する開発者がその辺決める事が多いのです。
何せ世にゴマンとあるCPUやOSをフルカバーできる程には自由ではないのですよ
>>233さん 229です
> ポインタを宣言してmallocしちゃダメなの?
> mallocの最大値は使うコンパイラのmalloc関数の説明を見てください。最大値が書かれています。
この部分は
>>229のレスを読んでください。 mallocについては"stdint.h に SIZE_MAX として定義されている"と明記しています
つまり「mallocで書けるけど敢えて自動変数で宣言しとくなら最大値は?」です
> まだ質問とぶれてるとすれば「ポータブルな配列宣言」の部分かな?
> これどういう意味?
例としてSIZE_MAXを示してます、ですから「どっかにマクロ定義されてないんですか?」と考えてください
> C言語自体は殆ど制約がなく、実装を決定する開発者がその辺決める事が多いのです。
> 何せ世にゴマンとあるCPUやOSをフルカバーできる程には自由ではないのですよ
このスレはK&RにあるBNFのようなCのsyntaxについて語らうスレなんですか?でしたら書くべきスレを間違ったようですいません
>>233さん 229です
Cにはdefineマクロという機能がありますから233さんが説明の中でコンパイラ規約
について言及している意味が理解できません。仰るような"環境依存で変わるもの"については
特にそのなかでも汎用的であるものについては マクロで定義された値の部分で環境依存を吸収していると認識いています。
例えば現在利用中の環境ではSIZE_MAX(
http://en.wikipedia.org/wiki/Stdint.h)について
/* Limit of `size_t' type. */↲
# if __WORDSIZE == 64↲
# define SIZE_MAX (18446744073709551615UL)↲
# else↲
# define SIZE_MAX (4294967295U)↲
# endif↲
64bit環境ならば 18446744073709551615UL、32bit環境ならば 4294967295U
とここでbit幅の違いによる差を吸収しています。このお陰でSIZE_MAXを使う場合において
言語利用者はSIZE_MAXの具体値を意識する必要から開放されています
ですから
>>233さんが
>>230,232-233の環境依存で変化するものについての説明の中で
言語仕様(失礼、コンパイラ規約を"言語仕様"という語に読み替えました)について言及している意図が理解できません
>>235 だからその実装(ヘッダの定義)も実装者の自由なんだってば。。。
コンパイラを規定しない限りその保証はないって言ってるの
で、どのコンパイラなの?その専用スレで聞いてくれ
その上でもう一度聞くけど「何故そういうことをするの?」
連投ですまないが、もうこの件には触れないので後は好きにしてくれ
自分でdefineきればいいじゃない?
コーディングに関してあるともないともいえないルールを聞かれて答えろってあふぉか
> /* Limit of `size_t' type. */
これって要するに size_t 型の最大値を示しているのであって、自動変数の
最大サイズとは全く関係ないのでは?
大抵のコンパイラはスタックサイズをコンパイル時に指定できるけど、この
サイズを取得する汎用の方法は無いんじゃない?
というか、俺は汎用で無いやり方すら知らない
>>238さん 229です。仰るとおりSIZE_MAXは自動変数については無関係ですよ、それについては
>>229で記述した通りです
void *malloc(size_t size)で割り当てられる連続長の最大サイズを例示しました。そして
> stdint.h に SIZE_MAX として定義されてますが、こんな感じでどこかに
と自動変数のサイズ制限について質問させて頂いた訳です。この質問 どうもマクロは定義されてないようなので諦めます
>>236さん 229です
> だからその実装(ヘッダの定義)も実装者の自由なんだ
始めからこの記述ならば理解できました。ヘッダファイルはライブラリ記述者がつくったものですからね
>>237 「解らない」と答えるために態々コンパイラ実装者だと自称したりその割には使う用語がおかしかったり
回答に一つも具体的な例示がなく口述の自然言語で抽象化したことをナッガナガと書いてたり
> あふぉか
挙句の果てに去り際に恥ずかしい捨て台詞を吐くようなカス(失礼)は無視するよ(^o^)ノ
241 :
忍法帖【Lv=21,xxxPT】 :2011/10/17(月) 11:42:04.35
やさしいC→明解C言語中級編 と来たら次は?
エキスパートCプログラミング
偏ってるけど
なんのために本をよみたいのかわからん
そんな暇があったら、サンプルをちょっとずつ変更して
コンパイルして実行
244 :
デフォルトの名無しさん:2012/01/06(金) 01:39:10.90
1〜100まで掛けた数を表示するプログラムを書ければ Very Good!
#include <stdio.h>
int main()
{
printf("93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000\n");
return 0;
}
>>244 #include <stdio.h>
#include <math.h>
int main()
{
printf("%g\n", tgamma(100 + 1));
return 0;
}
どちらが高速、効率的に動くでしょうか。
なお、ほとんどの場合 a=bのみが実行されます。(-10する事はかなり少ない)
if( 条件)
a=b;
else
a=b-10;
と
a=b;
if(条件)
a=a-10;
>>247 そのまえに、上は条件成立時にa=bだが、下は条件非成立時にa=bな件。
>>247 今時の環境で、その速度差が問題になるようなことはまず有り得ない。
意味的に判り易い方にすればいい。
速度差が問題になったなら、計測してみるしか。
250 :
247:2012/01/22(日) 22:12:05.45
もちろん上と下で条件は逆です。
ありがとうございました。
>>241 明解Cの初級編でも終えたら後は実践と本で補うならポインタ
それ以上(オブジェクト指向云々、多言語)はそれぞれの目指す道で分かれるでしょう